데이터의 접근
데이터가 저장되어 있는 위치에서 읽어와서 연산을 함. 연산결과를 다시 원래 위치에 저장.
Race Condition - 경쟁상태
Storage-Box (Memory, Address Space)라는 것을 여러 Excution Box(CPU, Process)가 공유한다면 생기는 문제
Multiprocessor system 이나 공유 메모리를 사용하는 프로세스들, 커널 내부 데이터를 접근하는 루틴들 간 경쟁 상태의 가능성이 있다.
OS에서의 Race Condition
1. Kernel Mode
경쟁상태 발생 : Kernel Mode 중 인터럽트가 발생해서 인터럽트 처리 루틴이 수행되는 경우에, 양쪽 다 커널 코드이므로 kernel address space를 공유하게 된다.
이렇게 kernel 에서 count++를 수행하다가 interrupt 가 걸리면 count-- 를 수행하여 원래값과 동일할 것 같이 보이지만, 실제 OS에서는 count 를 load 한 시점을 바탕으로 ++ 연산이 일어나고 저장되므로 count++ 한 값이 저장된다.
해결 방법 : Interrupt를 disabled 시킨다. 그리고 Kernel 에서의 count++ 작업이 끝난 이후에 enable 시켜서 경쟁상태를 해결한다.
2. CPU 선점 문제
CPU 할당 시간이 끝나면 CPU 를 반납하게 된다.
해결 방법 : 할당시간이 끝나는 시점이 Kernel Mode 에서 수행중이라면, CPU 를 선점하지 않는다. 커널 모드에서 사용자 모드로 돌아갈 때 선점한다.
3. Multiprocessor
어떤 CPU 가 마지막으로 count를 store했는가 ?
- 멀티프로세서 환경에서는 공유 데이터를 건드리는 경우 인터럽트를 막아서 (인터럽트 enable/disable) 해결할 수가 없다.
해결 방법 1 : 한번에 하나의 CPU 만이 커널에 들어갈 수 있게 하는 방법
해결 방법 2 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대한 lock , unlock 을 거는 방법
Critical Section
- N개의 프로세스가 공유데이터를 동시에 사용하기 원하는 경우
- 각 프로세스의 code segment에는 공유 데이터를 접근하는 코드인 critical section 이 존재