-
멀티 스레드의 임계 구역과 뮤텍스, 세마포어CS 지식/운영체제 2020. 8. 17. 11:37반응형
임계 구역과 뮤텍스, 세마포어
임계 영역
- 한개의 연산을 둘 이상의 쓰레드가 동시에 실행할 경우 발생할 수 있는 코드 블록
- 쓰레드 안에 있는 코드 블록이 임계 영역이 된다.
- 따라서, 문제가 발생하지 않게 독점을 보장해줘야 함. (Lock, 동기화)
동기화 기법
뮤텍스(Mutex => Mutual Exclusion)
- 쓰레드의 동시 접근을 허용하지 않음
- Mutex를 이용해서 특정 변수로 접근하는 쓰레드를 차단하면, 나머지 쓰레드는 대기줄에서 기다린다.
- 뮤텍스를 사용한 쓰레드가 뮤텍스를 반환하면, 대기줄에 있는 순서대로 쓰레드가 변수가 접근
- 뮤텍스 생성, 삭제, 잠금, 잠금해제 함수가 있음
- 단, 뮤텍스 잠금 후 해제를 하지 않으면, 잠금 함수는 블로킹 상태에 빠져 못나감
- 이 상태를 데드락 상태라고 부름
- 뮤텍스 잠금, 해제 함수 호출은 오랜시간이 걸림 ~> 함수 호출 횟수를 최소화
무한루프로 상태를 확인(Busy Waiting) ~> CPU 점유하고 있는 상태, 그래서 나온것이 세마포어
세마포어(Semaphore)
프로세스의 동시접근을 허용하지 않음
리소스의 상태를 나타내는 카운터로 이해하면 된다.
비교적 긴 시간을 확보하는 리소스에 대해 사용하며, Unix에서는 OS의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 동기화 시키는 기술
P(S) { S--; if S < 0 // 이 프로세스를 재움 큐에 추가 (잠 듦) } V(S) { S++; if S <= 0 // 재움 큐로부터 프로세스를 제거 (깨어남) }
- P함수와 V함수의 동작은 독립적이기 때문에 잘못 사용하는 경우 문제가 발생
P 임계구역 - P ~> 현재 프로세스가 임계 구역에서 빠져나갈 수 없게된다. 교착상태(Deadlock) 발생
- V 임계구역 - P ~> 2개 이상의 프로세스가 동시에 임계구역에 들어갈 수 있으므로 상호 배제(Mutex)를 보장할 수 없게 된다.
바이너리 세마포어
- 0과 1값만 가지는 세마포어
- sem_post, sem_wait
sem_wait 함수로 블록킹, sem_post로 해제
- 드라이브 쓰루를 생각하면 편할것 같음
카운팅 세마포어
초기값은 가능한 자원의 수로 정해지며, 세마포어 값의 범위는 정해지지 않음.
- 커피샾에 테이블이 한정적이고, 자리가 꽉 찬 경우 밖에서 대기한다고 이해하면 된다.
정리
- Semaphore는 Mutex가 될 수 있지만 반대는 안된다.
- Mutex는 상태가 0,1 뿐 인 binary Semaphore
- Semaphore는 소유할 수 없지만, Mutex는 소유 가능하며 이에 대한 책임을 진다.
- Semaphore는 Mutex가 될 수 있지만 반대는 안된다.
Mutex의 경우 Mutex를 소유하고 있는 쓰레드가 해제해야하지만,
Semaphore는 소유하지 않은 쓰레드가 Semaphore 해제 가능
- 2 이상의 값을 가지는 세마포어는 카운팅 세마포어. 뮤텍스로 임계구역에 동시에 접근하는 것을 방지할 수 있고 + 카운팅 세마포어로 임계구역 내부에서 공유변수들을 사용하는 것을 제어할수 있음
반응형'CS 지식 > 운영체제' 카테고리의 다른 글
Deadlock & Starvation (0) 2020.10.21 프로세스와 스레드 (0) 2020.10.21 프로세스와 스레드 (0) 2020.08.17 PCB와 TCB (0) 2020.08.17 CPU ( 중앙처리장치 ) (2) 2020.08.08