Initial Attempts to solve problem
- 공유 데이터에 접근하는 코드 이전에 entry section에서 lock을 걸어 ⇒ 다른 프로세스가 critical section에 못 들어가게!
프로그램적 해결법의 충족 조건
- Mutual Exclusion ⇒ 상호 배제 - 상호 배타적으로 접근
- 어떤 프로세스 하나가 critical section 부분을 수행 중이면 다른 모든 프로세스들은 cs에 들어가면 안된다.
- progress 조건
- 아무도 critical section에 있지 않은 상태에서 어떤 프로세스가 cs에 들어가려고 하면 들어가게 해줘야 한다.
- Bounded waiting(유한 대기)
- 프로세스가 critical section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 critical section에 들어가는 횟수에 한계가 있어야 한다.
- ex) cs에 들어가려는 프로세스가 3개가 있다고 할 때, 두 프로세스만 번갈아 들어가고 나머지는 계속 못들어가고 있는 케이스가 발생할 수 있으니!
Algorithm 1
- 위 코드는 P0. P1은 반대로 생각(turn ≠1 ⇒ turn = 0)
- turn: 현재 누구 프로세스 차례인지를 나타내는! 프로세스 0 의 경우 자기 차례가 아닐 때까지 기다리고, 자기차례가 되면 그제서야!
- 상대방이 turn을 자기차례로 바꿔줘.
- 위의 알고리즘: mutual exclusion을 만족하나 progress 조건을 만족하지 못해.
- 위 코드에서는 교대로 턴을 바꿔. 프로세스에 들어가려는 빈도가 균일하지 않을 수 있음. 근데 위 코드에서는 동일한 빈도로 제공해주는 게 문제.
- 위 알고리즘은 progress 조건을 만족하지 못하는 케이스! 턴을 교대로만 해주는 건 안된다!
Algorithm 2
- 변수를 하나 사용: flag! 프로세스 각각 자기의 flag를 갖고 있음.(배열에 담아!) ⇒ flag의 의미는 자기가 critical section에 들어가고 싶다는 의중을 표현한 것.
- 기본적으로 모두의 flag는 false 형태. 자기가 critical section에 들어가고 싶으면 ⇒ flag를 True로 변경.