https://core.ewha.ac.kr/publicview/C0101020140411143154161543?vmode=f
process synchronization(프로세스 동기화)를 concurrency control(병행 제어) 이라고 부르기도 한다고한다
-> 프로세스가 동시에 무언가를 실행하면서 나타나는 문제를 해결하는것이므로 용어는 다양하게 나타낼수있다.
프로그래머 관점에서 이러한 문제들을 해결할수있는 방법으로
세마포어가 있는것이고
세마포어 오류에대한 대안으로 프로그래밍 언어차원에서 제시하는것이 모니터이다.(우리는 자바에있는것 사용해야할것 같음)
모니터에서 프로세스가 활성화된상태로 공유데이터에 접근중에 cpu 를 뻇겨서 다른프로세스가 접근하려해도 모니터 내에서는 기존 프로세스가 자리를 차지하고있기 때문에 새로운 프로세스는 큐에서 기다리게 된다.
큐에서 대기하고있는 프로세스가 공유데이터에 접근할수 있는 조건은 기존 프로세스가 다 사용하고 나갔을때나
내부에서 현재 사용하고 있는 프로세스가 조건에 맞지않는 상황이와서 잠들수 있다 그런상황이라면 큐에서 대기하던 프로세스가 차지하게된다.
모니터에서는 lock 을 걸고 풀고 할일이 없어서 프로그래머는 편해진다.
모니터 안에는 condition variable 가 있는데 모니터 안에서 어떤 코드를 실행하다 어떠한 조건이 충족이 안되어서 잠들게하는경우
조건에 관한걸 변수로 둘수 있는데 그 변수가 condition이다.
-> 프로세스를 잠들게하고 깨우는데 사용하는 변수
condition은 세마포어처럼 숫자로 나타내는것이아니라(원래 세마포어에서 갯수를 나타낼떄 정수로 나타냄)
condition의 연산은 두가지가 있는데 wait,signal 이 있다.
condition은 조건이 맞지않아 오래기다려야할때 재워버리는 용도로 사용하는건데 -> wait 가 잠들게 하는것이다.
x.wait 을 걸면 x라는 condition 변수 줄에가서 서있는것이다.
그림을 보면 각변수마다 큐가 있다.
x.signal 은 잠들어있는 프로세스중 하나를 깨워주는 것이다.
생산자 소비자 문제를 모니터로 본건데 이제 이해가된다
full과 empty는 그냥 큐가있는 변수라 생각하면된다.(값이 없음 정수값이 아님)
모니터 코드를 보면 공유버퍼에 lock 을 거는 코드가 없다 -> 모니터 자체에서 애초에 동시에 프로세스가 접근 못하도록 막아버려서 없는것이다.
그렇다면 코드를 보자
produce 를 살펴보면(생산자 입장)
일단 빈 버퍼가 없는지 확인하고
없다면 기다리는 wait 을 empty변수에 걸어서 empty변수 산하에 기다리는 큐 에 들어가게된다
그리고 깨어나면 버퍼에 정보집어넣고 full 변수에 프로세스를 깨워주는 signal 함수를 호출한다.-> 대기큐에 아무것도 없으면 하는일이 없다.
consume 도 마찬가지이다.
반대로만 생각하면된다. 각각의 변수마다 큐가 있을뿐
모니터 코드와 세마포어 코드는 상호 변환이 쉽게 가져갈수있다.세마포어 코드에서 lock 만 제거하면된다.
식사하는 철학자에대한 모니터 코드이다
-> 노란색 부분이 각 철학자들의 코드이다.
공유자원인 젓가락을 잡고 놓는 코드는 모니터 내부 코드로 정의되어있다.
pickup 코드를 보면 우선 상태를 hungry 로 바꾸는건 똑같은데
lock 을 거는 부분이 없어졌다 모니터이기 때문에
그리고 동시에 젓가락을 잡을수있는지 test 함수는 똑같다 -> 하지만 변수가 condition 변수로 변해있어서 singal 로 되어있다.
조건에 맞으면 본인을 깨우도록 signal 로 깨워서 젓가락을 집도록 해준다.
이제 그리고 만약 test 조건이 맞지않게 빠져나온다면
잠들도록 eating 상태인지 검사해서 self를 잠들게하는 코드가 있다.
밥을 이제 다먹으면 putdown 코드를 보면
주변 철학자들이 나때문에 wait하고있는걸 깨워주도록 양옆에 test 를 거는 코드가 있다.
결국 세마포어 코드랑 거의 비슷하다.
'cs > 운영체제' 카테고리의 다른 글
17강 Deadlocks 2 (0) | 2023.01.24 |
---|---|
16강 Deadlocks 1 (0) | 2023.01.24 |
14강 Process Synchronization 3 (1) | 2023.01.20 |
13강 Process Synchronization 2 (0) | 2023.01.09 |
12강 Process Synchronization 1 (0) | 2023.01.09 |