- 세마포어는 코딩할때 실수가 발생하기 쉽고, 에러가 나면 찾기 힘듬
- 모니터는 lock, unlock을 자동으로 수행해줘서 프로그래머의 부담을 줄여줌
- 공유데이터(필드값)와 공유데이터를 접근하는 코드(함수)를 하나의 모니터(객체)에 담아놓는다
- 공유데이터는 모니터 안의 코드를 통해서만 접근이 가능함
- 모니터 자체가 하나의 active한 프로세스만 공유데이터에 접근 가능하도록 함
- 이미 한 프로세스가 공유데이터를 사용중이면 다른 프로세스는 모니터 밖에 큐에서 기다림
- 공유데이터를 사용중이던 프로세스가 빠져나가던지 잠들던지 하면 그때 기다리던 프로세스가 와서 사용
- 잠든다는건 공유데이터를 사용 중 특정 조건이 안 맞아서 오래 기다릴 경우 프로세스를 잠시 잠들게 하는것
- 특정 조건은 모니터 안에 condition 변수로 지정되어 있음
- 특정 조건에 안 맞을시 wait()로 재우고 signal()로 깨울수 있음
- 생산자 소비자 문제를 모니터로 푼 방법:
- 공유버퍼인 buffer[N]에 자원을 만들어서 넣어주는게 생산자, 있는 자원을 꺼내서 사용하는게 소비자
- 세마포어에서는 공유버퍼에 접근하기 전후로 lock,unlock을 해줌
- 모니터는 자동으로 하나의 프로세스만 공유데이터에 접근을 허용하기 때문에 lock, unlock이 필요 없음
- 빈 버퍼가 없다면 생산자가 일을 할수 없고 차있는 버퍼가 없다면 소비자가 일을 할수 없기 때문에 해당 조건을 명시하는 condition variable인 full과 empty가 있음
- 컨디션 변수는 값을 가지지 않고 자신에 큐에 프로세스를 담아 잠들게 하거나 큐에서 내보내 깨우는 역할을 담당
- produce(x)를 실행할때 빈 버퍼가 없다면 컨디션 변수인 empty 큐에가서 wait함
- 생산을 완료하고는 full 큐에 기다리고 있는 프로세스(소비자)가 있다면 signal()로 깨움
- 세마포어를 사용했을땐 P연산 V연산 했던걸 프로그래머에게 익숙한 if문으로 바꿈
- 세마포어의 경우 P연산이나 V연산 후 해당 세마포어 변수의 값이 바뀜, 하지만 모니터에서는 signal을 했다고 해서 값이 바뀌지는 않음
- V연산 후 공유 데이터의 자원 개수인 세마포어 변수가 0 -> 1로 변하지만, signal은 값이 바뀌는게 없음, 그래서 wait중인 프로세스가 없을때 signal을 하면 아무일도 일어나지 않음
- 배고픈 철학자 문제를 모니터로 해결하는 방법:
- 모니터 안에 변수로 공유데이터, 컨디션 변수가 있음
- 공유데이터를 접근하는 코드은 pickup()과 putdown()이 모니터 안에 정의되어있음
pickup():
- state도 자기 자신뿐 아니라 옆에 철학자도 바꿀수 있기 때문에 공유데이터임
- state를 hungry로 바꾸고 test 실행
- test()는 pickup()뿐 아니라 putdown()에서도 실행될수 있기 때문에 i(지금은 자기 자신)가 hungry 인지 한번 더 체크
- 양 옆이 eating 상태가 아니고 자기(i)가 hungry 상태일때 i 를 eating상태로 바꿈
- 만약 i가 잠들어 있다면 signal을 함, 하지만 이 경우는 자기가 들어온거기 때문에 잠들어있을 경우는 없음
putdown()할때는 좌우 철학자들에게 test()를 각각 실행해줘서 기다리고 있다면 먹게 해줌
'[개발일지] > 필기' 카테고리의 다른 글
Memory Management 1 (0) | 2021.09.09 |
---|---|
Deadlock (0) | 2021.09.03 |
Process Synchronization 3 - classical problems (0) | 2021.08.29 |
Process Synchronization 2 - Semaphores (0) | 2021.08.26 |
Process Synchronization1 - lock and unlock (0) | 2021.08.22 |