하나의 프로세스 혹은 스레드가 임계 영역(critical section)에 진입할 경우 Lock을 획득하고, 임계 영역에서 빠져나올때 Lock을 되돌려줌으로써 두 개 이상의 프로세스나 스레드가 동시에 임계영역에 진입할 수 없도록 하는 방법이다.
문제점
A라는 스레드가 Lock 함수를 실행하다 변수의 값을 변경하기 전에 인터럽트가 발생하여 값을 변경하지 못하고 B 또는 다른 스레드가 추가로 Lock 함수에 들어오면 두 개의 스레드가 임계 영역에 동시 접근해버리는 상황이 발생한다.
해결방법
더 이상 쪼개지지 않는 하드웨어 명령어로 구현, 인터럽트를 disalbe 하고 enable 하는 방법이 있다.
Semaphore
정의
세마포어는 '수기 신호' 라는 뜻으로 프로세스의 동기화 도구이다.
세마포어는 Counting, Binary 두 가지 방법이 있다.
이진 세마포어 (Binary semaphore)
상태가 이진값(0과 1 )만 가진다.
다중 프로세스들 사이의 임계영역 문제를 해결하기 위해 사용된다.
Mutex라는 별칭을 가진다.
카운팅 세마포어 (Counting semaphore)
사용 가능한 자원의 개수로 초기화된다.
사용가능 자원이 6개일 경우 세마포어도 6이된다.
자원을 사용하면 세마포어가 감소하고, 방출하면 세마포어가 증가한다.
차이점
세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 되지 못한다. (뮤텍스는 0과 1 뿐인 이진형 세마포어여서)
세마포어는 파일 형태로 존재하며 전 시스템 범위를 가지고, 뮤텍스는 프로세스 범위고 프로세스 종료 시 초기화된다.
문제점
세마포어에는 두 가지 연산 P, V가 있다. P는 검사(proberen)를 의미하며 프로세스를 대기시키는 wait 동작으로 임계 영역에 진입하기 위한 연산이다. V는 증가(verhogen)를 의미하며 대기 중인 프로세스를 깨우는 신호를 보내는 signal 동작으로 임계 영역에서 벗어나기 위한 연산이다. 둘 중 한 개의 연산을 생략하게 되면 상호 배제 문제와 P연산으로 인해 대기하고 있는 프로세스들이 교착상태(Dead Lock)에 빠질 수 있다는 취약점이 존재한다. P 연산이 시작되면 세마포어가 사용되고 있는 동안은 프로세스는 다른 경로를 선택할 수 없다. 프로세스는 한 번에 오직 한 세마포어만 대기할 수 있으므로 자원을 할당하는 상황에서 교착상태를 가져올 수도 있다.
해결방법
작업을 교체해주거나 종료하는 외부 간섭으로 해결해야 한다. 교착 생태는 하나 이상의 작업에 영향을 주기 때문에 무한 대기나 기아상태 보다 더 심각한 문제를 초래할 수 있다.