critical section을 어떻게 해결할 것인가?
둘 이상의 프로세스가 공유자원에 절대 접근해서는 안 되는 구역이다.
선점이면 괜찮겠찌만, 당연히 성능 구데기
다중 처리기에서는 인터럽트 끄는 거 만으로도 해결 안 됨
일단, flag는 나에게로 가져온다.
만약, flag[i]와 flag[j]가 동시에 true로 변한다면, 아무도 진입할 수 없다.
따라서 turn을 상대방에게 넘겨줌으로써 해결한다.
컴파일러에 의해 동작순서가 바뀌면 먹히지 않을 수 있다.
turn과 flag의 순서만 뒤바뀌어도 꼬인다.
턴이 내 턴이면서, 상대방이 false일 때 진입 가능
원자적으로 만든 하드웨어 명령어.
무조건, target을 True로 바꾸고 기존 값을 리턴시킨다.
lock의 기존 값은 False이겠지.
한정된 대기 조건은 만족하지 못한다. 즉 어떤 프로세스는 독점을 당해서 계속해서 기다리게 될 수도 있다.
bounded waiting을 만족시키기 위해.
문맥교환으로 잠시 나갔다가 들어왔을 때 바로 실행되는게 베스트.
멀티 프로세서에서는, TAS나 CAS 등을 이용한다.
TAS와 CAS가 두 개의 프로세서에 동시에 들어가게 되면,, 훔훔훔,,
따라서, 이러한 현상을 막기 위해, ATOMIC OPERATION 중에는 버스를 잠구게 된다.
그러면, 다른 프로세서에서 CAS를 실행하려 해도 메모리를 가지고 올 수 없으니까.
코딩 실수가 너무 잘 나고 디버깅이 힘들다. 어디에서 관리되는지 파악하기 어렵다.컴파일러도 못 잡아준다.