데드락, 동기화 문제
- 둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 이벤트를 무한히 기다리는 현상
- 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴떄 무한 대기에 빠지는 현상
- Indefinite blocking : 프로세스가 suspend된 이유에 해당하는 세마포어 큐에서 빠져나갈수없는 현상
- 프로세스가 컴퓨터 자원을 계속 가져오지 못하는 현상
- 생산자 프로세스는 계속해서 자원을 넣으려고 하고 소비자는 계속해서 자원을 빼내려고 할 때
empty
빈 버퍼 개수 세마포어,mutex
: lock을 위한 이진 세마포어,full
: 차있는 버퍼 개수 세마포어
- empty 버퍼 있는가? -> 없으면 기다림
- 공유데이터에 lock을 검
- empty 버퍼 조작
- lock 푼다
- full buffer 하나 증가
do {
// 자원 생성
P(empty)
P(mutex)
// 자원 조작
V(mutex)
V(full)
}while(true)
- full 버퍼 있나? -> 없으면 기다림
- 공유데이터 lock 건다
- full 버퍼 조작
- lock 푼다
- empty 버퍼 하나 증가
do {
P(full)
P(mutex)
V(mutex)
V(empty)
// 자원 사용
} while(true)
- 한 프로세스가 write 중일 때 다른 프로세스가 접근하면 안됨
- read는 동시에 여럿이 해도 됨
- mutex 사용
- writer에서 starvation 발생할수있음
- read 프로세스는 데이터를 수정하지않기때문에 데이터 일관성 유지되므로 비효율적이라는 의견 존재
- write 안할땐 아무나 read 가능
- read 아무도 안할때 write 가능
- write 중이면 read 불가능
- write 끝나면 read 가능
- 왼쪽 젓가락 잡고 오른쪽 젓가락 잡고 식사함. 젓가락 둘다 없으면 생각하면서 대기
- 데드락 가능성(ex. 모든 철학자가 왼쪽 잡을때)
해결책
- 젓가락 둘다 잡을수있을때만 잡게
- 짝수 철학자는 왼쪽 젓가락, 홀수는 오른쪽젓가락부터 잡게