프로세스 동기화
Critical Section(임계영역)
임계영역(Critical Section)은 다중 프로세스 또는 스레드 환경에서 공유 자원에 대한 접근을 동기화하기 위해 나온 개념으로 코드상에서 공유 자원에 접근하는 부분을 의미합니다.
동기화 조건
Mutual Exclusion(상호 배제): 한 순간에 오직 하나의 프로세스나 스레드만이 임계영역(Critical Section)에 진입할 수 있도록 하는 것을 의미합니다.
Progress(진행): 다른 프로세스나 스레드가 대기하고 있는 경우, 적어도 하나의 프로세스나 스레드는 임계영역에 진입할 수 있어야 하는 것을 의미합니다.
Bounded Waiting(한정된 대기): 한 프로세스나 스레드가 임계영역에 진입하기 위해 대기하는 시간에 제한을 두는 것을 의미합니다. 다시 말해, 다른 프로세스나 스레드가 대기하는 시간을 제한하여 공정성(fairness)을 보장합니다. 이를 통해 특정 프로세스나 스레드가 영원히 대기하지 않도록 할 수 있습니다.
Mutex Lock
동시에 공유 자원에 접근하는 것을 막기 위해 Critical Section 에 진입하는 프로세스는 Lock 을 획득하고 Critical Section 을 빠져나올 때, Lock 을 방출함으로써 동시에 접근이 되지 않도록 한다. 사용하기 쉽다는 장점이 있으나 교착상태가 발생하는 한계가 있다. 예를 들어 여러개의 mutex lock을 사용하여 상호배제를 구현할 경우 락을 가지고 있는 상태로 서로의 락을 기다리는 교착 상태가 발생할 수 있습니다.
Semaphores(세마포어)
세마포어(Semaphore)는 다중 프로세스나 스레드 간에 공유 자원에 대한 접근을 동기화하기 위한 기법 중 하나입니다. 세마포어는 상호배제(mutual exclusion)뿐만 아니라, 프로세스 또는 스레드의 실행 순서를 제어하는데 사용됩니다.
이진 세마포어(Binary Semaphore): 0 또는 1의 값을 가지며, 뮤텍스(mutex)와 같은 상호배제(mutual exclusion)를 구현하는데 사용됩니다. 이진 세마포어는 공유 자원에 대한 접근이 가능한 경우 1로 초기화되며, 해당 자원을 사용하려는 다른 프로세스나 스레드가 접근하면 세마포어의 값을 0으로 바꾸어 해당 자원의 사용이 불가능하게 합니다.
카운팅 세마포어(Counting Semaphore): 0 이상의 값을 가지며, 리소스 개수 등의 값을 표현하는데 사용됩니다. 카운팅 세마포어는 여러 개의 프로세스나 스레드가 공유 자원에 접근할 수 있도록 허용하는 데 사용됩니다. 카운팅 세마포어는 초기값을 가지며, 공유 자원에 대한 접근이 가능해질 때마다 해당 세마포어 값을 감소시킵니다. 이 때, 값이 0인 경우 자원에 대한 접근이 불가능하게 됩니다. 공유 자원을 사용하는 프로세스나 스레드가 자원 사용을 마치면 세마포어 값을 증가시켜 다른 프로세스나 스레드가 자원에 접근할 수 있도록 합니다.
단점
Busy Waiting(바쁜 대기)
프로세스 진입코드를 계속 반복하며 cpu 자원을 낭비하는 것을 뜻한다. context switch가 자주 발생하는 상황이 아니라면 while을 이용한 바쁜 대기보다, 진입시도 프로세스를 wait state로 바꾼후 접근하는 사람이 없을때 다시 wake시키는 것이 효율적이다.
모니터
모니터(Monitor)는 상호배제와 동기화를 위한 추상화된 데이터 타입으로, 상호배제 락(lock)과 조건 변수(condition variable)를 조합한 동기화 기법입니다.
모니터는 락을 사용하여 상호배제를 구현하며, 하나의 스레드가 모니터 내부의 공유 자원에 접근할 때 다른 스레드는 락을 획득하지 못하므로 대기해야 합니다. 이 때, 대기하고 있는 스레드는 조건 변수를 사용하여 락을 얻을 수 있는 시점을 대기합니다. 락이 풀리면, 대기 중인 스레드 중 하나가 락을 얻고 모니터 내부의 공유 자원에 접근할 수 있습니다.