1. 프로세스 동기화
1. 왜 필요할까? - Process Synchronizaion 문제
- 컴퓨터 연산을 할 때는 항상 읽어들이거나, 쓰거나 연산을 수행한다.
- 같은 데이터를 한 프로세스가 아니라 여러 프로세스가 함께 접근하려고 한다면 어떨까?
- A가 먼저 데이터 Z에 접근해서 read하고 write중이었는데, 아뿔싸! 모종의 interrupt가 발생해서 (timer, I/O등..) B에게 CPU제어권이 넘어갔다.
- B도 Z에 접근해서 read하고 write 연산을 수행한다.
- 이후 A가 다시 CPU를 가져가게 되는데, A의 context는 이전에 읽어들인 Z값이 저장되어 있다. 따라서 write는 B가 새로 바꿔놓은 Z가 아니라 옛날 Z값을 베이스로 일어난다.
- 아니 근데, 프로세스는 별도의 주소 영역을 가져서 공유할 데이터가 없지 않나요?
- 원래 그런데, ‘운영체제'가 끼어들게 되면 프로세스들도 공유하는 데이터가 생길 수 있다.
- 시스템콜 등에서는 커널의 데이터를 사용하는데, 커널의 데이터는 프로세스들이 공유하는 공유변수이다.
- 또한, 프로세스들이 Shared memory를 쓴다면 공유하는 데이터가 생길 수 있다.
2. Race Condition (경쟁 조건)
- 여러 프로세스들이 동시에 공유 데이터를 접근하는 상황에서 발생하는 문제
- 데이터의 최종 연산 결과는 마지막에 그 데이터를 다룬 프로세스에 따라 달라진다.
⇒ Mutual Exclusion (상호배제) 개념이 필요하다.
- 커널 내부 데이터를 접근하는 루틴들 간
- 프로세스의 시스템 콜에 의해서 커널 모드를 수행 중인데 CPU가 다른 프로세스에 넘어가는 경우(context switching)
- 해결 방법 ⇒ 커널 모드 중에는 CPU를 선점하지 않도록 한다. (사용자 모드에서만 선점할 수 있게끔)
- 커널 모드 중 인터럽트가 발생하는 경우
- 해결 방법 ⇒ 커널 고유 변수를 건드리는 동안에는 인터럽트가 발생해도 disable하여 인터럽트가 연산이 끝나고 수행될 수 있게끔 한다.
- 멀티 프로세서
- 문제점) CPU선점이나 인터럽트를 막는 것으로 문제가 해결되지 않는다. CPU가 여러개이기 때문이다!
- 해결 방법 → 공유 변수 자체에 lock을 걸면 어떨까? Good!
3. Process Synchronization 문제
2. Critical-Section Problem (임계구역)
- n개의 프로세스가 공유 데이터를 동시에 사용하기를 원하는 코드 구역
- 하나의 프로세스가 임계구역에 존재할 때, 다른 모든 프로세스는 임계구역에 들어갈 수 없어야 한다. (일관성 유지)
1. 임계구역의 해결법 충족 조건
1. Mutual Exclusion (상호 배제)
- 한 프로세스가 임계구역에 들어가 있다면, 다른 모든 프로세스들은 임계 구역에 들어갈 수 없다.
2. Progress