뮤택스(Mutax) == Binary Semaphore
임계구역(critical section)에 하나의 스레드 혹은 프로세스만 들어갈 수 있다. 키를 통해서 뮤텍스를 잠그거나(locking) 여는(unlocking) 두 가지 상태를 취하여 상호 배타성을 제공한다.
세마포어(Semaphore) == Counting Semaphore
임계구역(critical section)에 여러 개의 스레드가 들어갈 수 있다. 세마포어 s는 몇 개의 스레드가 해당 임계구역에 접근할 수 있는지를 나타내는 전역 변수이다( 비음수 정수 값 ). 이는 P와 V라는 특정 연산을 통해서만 조작이 가능하다. 간단히 말하면 P는 임계구역으로 진입할 때, V는 임계구역을 빠져나올 때 수행하는 연산이다.
P(s) : wait(s) {
while s <= 0 { # 무한 loop을 돌면서 '바쁜 대기' 상태
...
}
s--;
}
V(s) : signal(s) {
s++; # 네~ 자리 하나 비어요 다음 thread~?
}
만약 s == 2일 경우, 즉 임계구역에 최대 2개의 thread가 실행될 수 있다면
initial semaphore value | s = 2 | |
P(s) 연산 | 1st thread 임계구역 진입 | s = 1 |
P(s) 연산 | 2nd thread 임계구역 진입 | s = 0 |
P(s) 연산 시도 | 3rd thread while 무한 loop (대기 중) | s = 0 |
V(s) 연산 | 1st thread 임계구역 탈출 | s = 1 |
P(s) 연산 | 3rd thread while loop 빠져나와 임계구역 진입 | s = 0 |
은행창구에서 업무보는게 임계구역에서 thread가 작업하는 것이라고 가정한다면,
s는 번호표,
P(s)연산은 대기해주세요 혹은 창구 비었어요 가셔도 됩니다 안내하는 직원이고,
V(s) 연산은 창구 손님 가셔서 비었어 손님 안내해드려라고 P(s)연산 직원한테 알려주는 직원
BUT, 바쁜 대기상태도 결국 CPU를 계속 사용해야하는 것이기 때문에 비효율적인 방법이다. 이를 보완하기 위해서 아래와 같은 방식으로 대기큐(queue)를 사용한다.
P(s) : wait(s) {
s--;
if s <= 0:
add current thread T to the queue
and block(T)
}
V(s) : signal(s) {
s++;
if s >= 1:
pop current thread T from queue
and wakeup(T)
}
'컴퓨터 시스템' 카테고리의 다른 글
[컴퓨터 시스템] 교착상태(deadlock)와 기아상태(starvation) (0) | 2020.10.15 |
---|---|
[컴퓨터 시스템] 스레드 (0) | 2020.10.14 |
[컴퓨터 구조] 예외 상황 (0) | 2020.10.11 |
[컴퓨터 시스템] 프로세스와 스케줄러 (0) | 2020.10.10 |
[컴퓨터 시스템] 가상 메모리 (0) | 2020.10.07 |