동시다발적으로 실행되는 프로세스/스레드들은 서로 협력하며 영향을 주고받는다. 이 과정에서 공유 자원 또는 데이터가 있을 때 여러 프로세스가 동시에 해당 자원에 접근하게 되면, 자원의 일관성이 깨질 수 있고 이에 따른 문제가 발생할 수 있다.
이렇게 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근하려는 상황을 Race Condition(경쟁 상태)라고 한다.
따라서 Race Condition 상태에서, 프로세스들의 순서를 정하여 데이터의 일관성을 유지시키는 작업을 프로세스 동기화라고 한다.
임계구역 문제
멀티 프로세스 환경에서 둘 이상의 프로세스가 동시에 접근해서는 안되는 공유자원의 코드 영역을 임계구역이라고 한다.
임계구역에서 발생하는 문제를 해결하기 위해서는 다음의 3가지 조건을 모두 충족시켜야 한다.
- 상호 배제 (Mutual Exclusion)
한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다. - 진행 (Progress)
임계구역에서 작업중인 프로세스가 없다면 입계구역으로 진입하려는 프로세스를 적절히 선택해서 진입할 수 있도록 한다. - 한정 대기 (Bounded waiting)
한 프로세스가 임계영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야 한다.
이렇게 임계구역 문제를 해결하고, 프로세스의 실행 순서를 제어하고, busy-wait과 같은 비효율성을 제거하기 위해 프로세스의 동기화 작업이 필요하다.
임계구역 문제의 해결 방법 - Mutex
- 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는다. (오직 하나의 스레드만 접근이 가능하다)
- 한 프로세스에 의해 소유될 수 있는 key를 기반으로 한 상호배제 기법
key에 해당하는 어떤 객체 (object)가 있으며, 이 객체를 소유한 쓰레드/프로세스 만이 공유자원에 접근할 수 있다. - 동시에 공유 자원에 접근하는 것을 막기 위해 Critical Section 에 진입하는 프로세스는 Lock 을 획득하고 Critical Section 을 빠져나올 때, Lock 을 방출함으로써 동시에 접근이 되지 않도록 한다.
임계구역 문제의 해결 방법 - Semaphore
- 여러개의 스레드가 임계 영역에 들어갈 수 있다.
- 공유 자원의 상태를 나타낼 수 있는 카운터 값(사용하고 있는 스레드/프로세스 수를 공통으로 관리하는 값)을 이용하여 상호 배제를 달성한다. 이 때 semaphore는 그 가용한 자원의 개수 로 초기화된다.
- wait(), signal() 함수를 사용하여 자원에 접근할 수 있다.
- wait() : 프로세스가 자원을 사용할테니 기다리겠다는 의미. semaphore값을 -1
- signal() : 프로세스가 자원을 사용하고 나왔음을 의미. semaphore값을 +1
- 이미 다른 프로세스에 의해 사용중이라는 사실을 알게 되면, 재시도 전에 일정시간 대기해야 한다.
- 각 프로세스는 semaphore의 값을 확인하고 변경할 수 있다.
- 자원을 사용하지 않는 상태가 될 떄, 대기하던 프로세스가 즉시 자원을 사용한다.
Mutex vs Semaphore
- Mutex는 동기화 대상이 1개일 때 사용하지만, Semaphore는 동기화 대상이 한 개 이상일 때 사용한다.
- Semaphore는 Mutex가 될 수 있지만, Mutex는 Semaphore가 될 수 없다.
Mutex는 0, 1로 이루어진 이진 상태를 가지므로 Binary Semaphore이기 때문이다 - Mutex는 자원 소유가 가능하지만, Semaphore는 자원 소유가 불가능하다.
- Mutex는 소유하고 있는 스레드만이 Mutex를 해제할 수 있지만, Semaphore는 Semaphore를 소유하지 않는 스레드가 Semaphore를 해제할 수 있다.
- Mutex는 프로세스의 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 되지만, Semaphore는 시스템 범위에 걸쳐있고, 파일 시스템 상의 파일로 존재한다.
- Mutex는 잠금 매커니즘이고, Semaphore는 신호 기반의 상호 배제 방법이다.
출처
'Computer Science > 운영체제' 카테고리의 다른 글
쓰레드 세이프(Tread Safe) (0) | 2023.03.19 |
---|---|
Sync vs Async & Block vs Non-Block (0) | 2023.03.19 |
캐시 메모리 (0) | 2023.03.18 |
가상 메모리(Virtual Memory) (0) | 2023.03.18 |
교착상태와 기아상태 (1) | 2023.03.18 |