• 일부 프로세스는 서로 상호 협력.
협력이 필요한 이유:
자원 공유, 하위 작업으로 나눠 병렬 실행, 모듈 방식으로 시스템 구축
공유 데이터에 동시 접근하면 데이터 불일치 발생.
데이터 일관성 유지를 위해 질서 있는 실행 보장 필요.
• int counter //버퍼 차있는 정도
• 경쟁 조건 발생
• 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램 코드 영역
• entry section
• exit section
• remainder section
• 임계 구역을 최소화하는 게 좋음. 길면 병렬성⇩
커널 안에서 공유되는 것들이 많으므로 중요.
pid 등.
Preemptive 선점적
• 커널 모드에서 실행할 때 프로세스의 선점을 허용
Non-preemptive 비선점적
• 커널 모드를 종료하거나 자발적으로 CPU를 양보할 때까지 실행. (강제로 switching X)
• 본직적으로 커널 모드에서 경합 조건이 안 일어남.
• 2개의 프로세스만 있다고 가정(Pi,pj)
• 두 변수 공유

• Mutual exclusion
• Progress
• Bounded-waiting
• 현대에서는 이 방법을 사용하지 X.
• entry section에서 인터럽트 비활성화, exit section에서 인터럽트 활성화
• 모든 인터럽트를 막아버리는 너무 강력한 방식이라 추천하지 않음.
• preemptive가 안됨. context-switching 안 일어남.
• Hardware Instruction(하드웨어 명령)
• 원자성 = non-interruptible (인터럽트 불가)
• test_and_set: 메모리 값이 1인지 0인지 확인하고 메모리 값을 1로 변경하는 작업

-모든 행위가 인스트럭션 하나에서 일어남

-완벽히 해결하지는 않음.
mutual, 두 번째 조건만 만족.
bounded wait는 불만족.
100명이 기다리면 100명 중 어느 것이 들어갈지 보장이 안 됨.
