본문 바로가기

CS/운영체제

[운영체제] 6. Process Synchronization (1)

더보기

kocw 반효경 교수님의 운영체제 강의를 수강 후 작성한 글입니다.

1. Race Condition

Race condition(경쟁 상태): Race condition이란 두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓰는 동작을 할 때, 공유 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말한다. 경쟁 상태라는 말 그대로, 두 개 이상의 프로세스(스레드)가 하나의 자원에 접근하기 위해 경쟁함을 의미한다.

 

Storage-Box(Memory, Address space)를 공유하는 Execution-Box(Cpu, Process)가 여러개 있는 경우 Race condition이 발생할 가능성이 있다.

ex) Multiprocessor system, 공유 메모리를 사용하는 프로세스들, 커널 내부 데이터를 접근하는 루틴들 간(커널모드 수행 중, 인터럽트로 커널모드에서 다른 루틴을 수행)

 

공유 데이터의 동시 접근은 데이터의 불일치 문제를 발생시킬 수 있으므로 race condition을 막고 일관성을 유지하기 위해서는 협력 프로세스 간의 실행 순서를 정해주는 메커니즘인 동기화(Synchronization)가 필요하다.

OS에서 race condition이 발생하는 경우

1. Kernel 수행 중 인터럽트 발생 시 

커널 모드 running 중 interrupt가 발생하여 인터럽트 처리 루틴이 수행 중인 상황이다. 원래의 목적은 count++, count--가 모두 반영되어 원래의 값을 유지하는 것이었으나, Load를 통해 값을 읽은 후 인터럽트가 걸렸다면 count--는 반영되지 않아 값의 증가만 반영되는 문제가 생긴다. (양쪽 다 커널 코드이므로 kernel  address space를 공유한다.)

 

kernel에서 count 값 Load 후 인터럽트가 발생 (ex. count 10) -> 인터럽트 핸들러가 count 값 감소시킴 (ex. count 9) -> kernel은 원래 읽어들였던 count 값 (ex. count 10)을 증가시킨 후 저장함 (ex. count 11)

 

2. Process가 system call을 하여 kernel mode로 수행 중인 상황에서 context switch가 일어나는 경우

두 프로세스의 address space 간에는 data sharing이 없으나 system call을 하는 동안에는 kernel address space의 data를 access하게 된다.(공유) 따라서 이 작업 중간에 CPU를 preempt해간다면 race condition이 발생한다.

 

위 그림에서 Pb가 CPU를 preempt하기 전 Pa가 count값을 읽어들였기 때문에 Pb의 count++는 반영되지 않는다.

 

해결책: 커널 모드에서 수행 중일 때는 CPU를 preempt하지 않고, 커널 모드에서 사용자 모드로 돌아갈 때 preemt하도록 한다.

 

3. Multiprocessor에서 shared memory 내의 kernel data에 접근하는 경우

어떤 CPU가 마지막으로 count 값을 store했는지에 따라 최종 결과값이 달라진다. -> race condition

multiprocessor의 경우 앞의 경우와 달리 interrupt enable/disable로 문제를 해결할 수 없다.

 

해결책

1. 한번에 하나의 CPU만 커널에 들어갈 수 있게 한다. -> 비효율적

2. 커널 내부에 있는 각 공유데이터에 접근할 때마다 그 데이터에 대해 lock/unlock을 수행한다.