
Mutual Exclusion (상호배제)
프로세스 Pi가 Critical Section부분을 수행 중이면 다른 모든 프로세스들은 그들의 Critical Section에 들어가면 안된다.
Progress(진행)
아무도 Critical Section에 있지 않은 상태에서 Critical Section에 들어가고자 하는 프로세스가 있으면 Critical Section에 들어가게 해주어야한다.
Bounded Waiting(유한 대기)
프로세스가 Critical Section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 Critical Section에 들어가는 횟수에 한계가 있어야 한다.
가정
- 모든 프로세스의 수행 속도는 0보다 크다.
- 프로세스들 간의 상대적인 수행 속도는 가정하지 않는다.

Mutual Exclusion(상호배제) 조건을 만족하지만 Progress / Bounded Waiting 조건을 만족하지 못할 수 있음.

flag 변수를 사용해 Critical Section에 들어가고 싶은지 의사표현을 한다. 이 알고리즘의 문제는 Critical Section에 들어가기 전에 눈치게임으로 아무도 못들어 갈 수 있음

알고리즘 1, 2에서 봤던 turn, flag 변수를 모두 사용한다.
Mutual Exlusion / Progress / Bounded Waiting 3조건을 모두 만족한다.
하지만 Busy Waiting(= Spin Lock) 문제가 발생할 수 있음
while문 조건을 만족하지 못할 때는 쓸데 없이 계속 while문을 돌게 됨

I/O가 하나의 instruction으로 해결 가능하다면 프로세스의 동기화 문제가 발생할 가능성이 적음. 왜냐하면 cpu에서 instruction을 실행하는 동안 다른 프로세스한테 cpu를 뺏길 일이 없기 때문에 하지만 하나의 instruction으로 I/O를 해결할 수 없기 때문에 문제 발생!
하드웨어적으로 하나의 instruction만 주어지면 문제는 간다하게 해결된다.
실제 하드웨어에서는 Test_and_Set이라는 자체 instruction을 제공한다.
추상 자료형 :

여기에서 P 연산은 세마포어를 획득하는 과정(공유 데이터를 획득) -lock
V연산은 공유 데이터를 다 사용하고 반납하는 연산 - unlock



프로세스가 잠들기 전에(Block) S.value-- 를 얻고 잠들기 때문에 내가 S.value++ 자원을 내놓고도 S.value <=0 일 경우 기다리면서 잠들어 있는 프로세스가 있다는 의미

여기서 두 프로세스가 얻는 자원의 순서를 동일하게 하면 Deadlock 문제를 해결할 수 있음
buffer : 임시로 데이터를 저장하는 공간. 버퍼의 크기는 유한함.

주황색 버퍼는 프로듀서(생산자)가 데이터를 만들어 넣어놓은 것
여기서 어떤 동기화 문제가 일어날 수 있을까?
한가지 문제는 공유 버퍼이다보니까
두 개의 생산자가 동시에 도착해서 같은 버퍼 공간에 작업할 경우 문제 발생
소비자 둘이 동시에 도착해서 같은 버퍼 공간에 있는 데이터를 꺼내려 할 때
이런 문제 발생을 방지하기 위해서는 생산자와 소비자가 작업하기 전에 lock을 걸어서 작업
버퍼가 다 차있는데 생산자가 데이터를 만들어 넣고자 할 때
소비자가 데이터를 가져가려 하는데 모든 공유버퍼가 비었을 때
생산자는 버퍼에 데이터를 채워 넣었을 때 Full buffer 수 하나 증가
소비자는 버퍼에서 데이터를 빼갔을 때 empty buffer 수를 하나 증가

위 내용을 의사코드(sudo code)로 표현한 것은 위와 같음

Read를 할 때 lock을 걸고 다른 Reader들이 접근을 못하게 하는 것은 너무 비효율적이다. Read는 동시에 여럿이 해도 된다. 하지만 lock을 걸지 않을 경우 Write 작업이 발생할 수 있음으로 lock을 걸기는 해야한다. 하지만 Reader의 접근은 허용해주어야 한다. Reader는 접근했을 때 readcount라는 변수를 변경한다.
최초로 진입하는 Reader가 lock을 건다. 그 이후 도착하는 Reader들은
뮤텍스와 스몰디비는 lock을 걸기 위한 바이너리 세마포어
뮤텍스는 readcount 공유데이터에 lock을 걸기 위한 세마 포어
Starvation이 발생할 수 있음
모든 Reader가 빠져나가야 Writer가 진입할 수 있는데 만약 마지막 Reader 하나를 남기고 또 100개의 Reader가 들어오면 Writer는 계속 기다릴 수밖에 없음

배가 고파지면 왼쪽과 오른쪽 젓가락을 집어 식사를 한다.
위 코드는 젓가락을 두 개 모두 집을 수 있을 때에만 젓가락을 집을 수 있게 설계한 것이다.
왼쪽 철학자도 배고프지 않고 오른쪽 철학자도 배고프지 않고 내가 배고픈 상태일 때 젓가락을 집을 수 있게 한다.