주요키워드 : thread-safe, race condition, critical section, 프로세스 동기화, 은행원 알고리즘, 문맥교환, 기아상태
프로세스는 실행중인 프로그램을 의미하며 OS로부터 자원을 할당받는다. 프로세스마다 PCB가 할당되어 PID, status 등의 정보가 기록된다.
스레드는 프로세스 내에서의 실행 단위이며 하나의 프로세스는 하나 이상의 스레드로 작업을 수행한다. 프로세스 내의 자원은 서로 공유하지만 스택, PC 레지스터 등은 독립적인 수행을 위해 독립적으로 할당한다.
프로세스 내에서 스레드들은 데이터나 힙영역 등의 자원을 공유하기 때문에 멀티프로세스에 비해 더 효율적으로 작업을 수행할 수 있다. 또한 멀티프로세스와는 달리 문맥 교환을 수행할 때 캐시 메모리를 비우지 않으므로 속도도 더 빠르다.
멀티스레드 프로그래밍은 공유 자원에 대한 race condition 및 동기화 문제가 발생할 위험이 있다. 따라서 mutex 등을 이용하여 동기화 문제를 해결해주어야 하며, 과도한 lock으로 인해 병목현상이 생기는 현상에도 주의해야 한다.
멀티스레드 프로그래밍은 멀티프로세스와 비교하여 아래와 같은 장단점이 있다.
장점
- 힙 영역 등 프로세스 자원을 공유하므로 메모리 사용이 더 효율적이다.
- 힙 영역 등 프로세스 자원을 공유하므로 스레드간 통신이 더 빠르다.
- 문맥교환 시 프로세스에 대한 메모리를 비우지 않으므로 더 가볍고 빠르게 수행된다
단점
- 공유된 힙 영역의 자원을 사용할 때 동기화 문제를 해결해야 한다.
- 과도한 동기화로 인해 병목현상이 생기지 않도록 주의해야 한다.
- 멀티프로세스는 한 프로세스가 죽어도 다른 프로세스에 지장을 주지 않지만, 멀티스레드는 한 스레드가 죽으면 다른 스레드도 죽을 수 있다.
멀티스레드 프로그래밍에서 여러 스레드가 동시에 자원에 접근하더라도 데이터 정합성에 이상 없이 정상적으로 동작하는 것을 의미한다.
여러 프로세스 혹은 스레드들이 동시에 접근할 수 있는 코드 영역을 임계영역(Critical section)이라고 한다. 임계영역에 대해 동기화가 이뤄지지 않으면 데이터 정합성, 일관성이 이뤄지지 않는 문제가 발생할 수 있다.
race condition은 critical section의 자원에 대해 여러 프로세스, 스레드가 동시에 접근을 시도할 때, 접근 순서 등에 의해 결과값이 달라질 수 있는 (데이터의 일관성이 깨질 수 있는) 상태를 의미한다.
race condition을 해결하려면 mutex나 semaphore로 임계영역에 상호배제(mutual exclusion)를 적용하는 등의 동기화 처리가 필요하다.
상호배제/비선점/점유대기/환형구조의 조건이 갖춰졌을 때 프로세스/스레드 간에 서로간의 점유한 자원이 해제되길 무한히 기다리는 상태를 의미한다.
교착상태를 해결하는 방법에는 예방/회피/회복/무시 종류가 있다. 예방은 발생 조건을 사전에 부정하는 것이다. 회피에는 다익스트라의 은행원 알고리즘 등이 있다.
우선순위가 낮은 프로세스가 원하는 자원을 계속 할당 받지 못하는 상태를 의미한다.
기아상태를 해결하려면
- 프로세스 우선순위 변경을 통해 오래 대기한 프로세스로 자원 할당 기회 부여
- 우선순위가 아닌 FIFO 방식의 요청 큐를 사용
- https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS
- https://m.blog.naver.com/PostView.nhn?blogId=complusblog&logNo=220985528418&proxyReferer=https:%2F%2Fwww.google.com%2F
- https://velog.io/@underlier12/OS-24-%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C%EC%99%80-%EA%B8%B0%EC%95%84%EC%83%81%ED%83%9C