process간 interrupte에 의해서 context switch가 발생해서 instruction stream이 끊어진다.
incremented every time we add a new item to the buffer
decremented every time we remove one item from the buffer

join에 의해서 main스레드는 작업이 끝날 때까지 대기(나머지 스레드 2개는 계속 실행)
sum은 공유 메모리

count++, count-- 는 위와 같이 표현할 수 있다.
context switch가 register1,2의 중간에 발생할 수 있다.( 문제 상황 )
register1,2가 물리적으로 같은 레지스터이지만,
save/restore 과정에서 content가 바뀔 수 있다.

2개 이상의 스레드가 같은 데이터를 공유하는데,
concurrent하게 접근 및 처리하는데 순서에 따라서 결과가 달라진다.
critical section에서 공유된 데이터가 업데이트가 된다.
핵심은 1개의 프로세스가 임계영역에 접근하면, 다른 프로세스는 block한다.
(동시에 실행하는 것을 block)
동기화 문제는 임계영역 관리 문제
entry-section( C.S에 진입 )
critical-section( count++ )
exit-section
remainder-section( count -- )

아래 4가지 조건이 모두 만족되는 경우 데드락이 발생할 가능성이 있다.
→ 하나라도 만족하지 않으면 발생하지 X
상호 배제 (Mutual exclusion)
한 리소스는 한 번에 한 프로세스만이 사용할 수 있다.
사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.
점유와 대기(Hold and wait)
자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다.
비선점 (No preemption)
이미 할당된 자원을 강제로 빼앗을 수 없다.
프로세스가 task를 마친 후 리소스를 자발적으로 반환할 때까지 기다려야 한다.
환형 대기 (Circular wait)
대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.
Hold and wait 관계의 프로세스들이 서로를 기다림

그런데, 성능상 최악.
Non-preemptive kernel
한번 진입하면 종료될 때까지 제어권 안 내려 놓음.
Preemptive kernel
중간에 언제든지 제어권을 뺏길 수 있음.