컨디션 변수
: 쓰레드 실행에서 어떤 조건이 만족하기를 대기하는 큐
|
- wait 하기 전에 lock을 걸고 wait 할 때 lock을 풀어줘야 함, wait에서 깨어나면 다시 lock을 얻음
- join 먼저
- 부모가 wait 한 후, 자식 signal하면 정상 동작
- exit 먼저
- 부모가 wait 하기 전 interrupt가 걸려서 자식이 signal하면 정상 동작
📍 컨디션 변수가 없는 경우
- join 먼저
- 부모가 wait 한 후, 자식이 signal 하면 정상 동작
- exit 먼저
- 자식이 signal 한 후 부모가 실행되어 wait 하면 깨어날 수 없음
📍 락 제거한 경우
- join 먼저
- 부모의 컨디션 변수의 조건 확인 후 interrupt가 걸려서 자식이 signal하고 다시 부모가 wait하면 깨어날 수 없음
Producer/Consumer 문제 (유한 버퍼 문제)
- 공유 변수(count)를 선언해서 조건을 먼저 체크해줘야 함
- 공유 변수를 체크할 때 if 문 대신 while 문을 사용해야 함
- 여러 producer, consumer가 존재할 때 다른 쓰레드가 가로채 put과 get을 못하는 상황 발생하기 때문
- producer과 consumer에 대한 컨디션 변수(버퍼)를 두 종류 로 설정하거나, 쓰레드를 깨울 때 모두 다 깨워야 함(broadcast)
- 컨디션 변수가 하나인 경우, producer와 consumer 중 엉뚱한 것을 깨우게 되면 producer와 consumer 모두 잠자는 상황 발생하기 때문
Covering Condition
- allocation과 free
- broadcast
- 모든 잠자는 상황 발생
728x90
반응형
'OS' 카테고리의 다른 글
[OS] Common Concurrency Problems (1) | 2024.04.29 |
---|---|
[OS] Semaphore (1) | 2024.04.29 |
[OS] Locks (0) | 2024.03.31 |
[OS] Concurrency and Threads (0) | 2024.03.31 |
[OS] Beyond Physical Memory (0) | 2024.03.30 |