게시:
수정:

Process Synchronization 문제란?

상호 다른 프로세스(Process) 또는 프로세서(Processor)가 공유 데이터(Shared memory)에 동시 접근(Concurrent access)할 때 발생하는 데이터의 불일치성(Inconsistency) 문제이다.

예를 들어 프로세스 A와 B가 어떤 주소공간을 부분적으로 공유하는데 프로세스 A가 공유 데이터를 증가시키는 수정을 하다가 프로세스 B로 컨텍스트 스위치가 발생하였고, 마침 B도 같은 데이터를 증가시키는 수정한 뒤 CPU를 A에게 돌려주었다.

이때 해당 데이터는 ‘2’만큼 증가하여야 하지만 A는 컨텍스트 스위치 시점의 데이터를 수정하기 때문에 결과적으로 ‘1’ 증가하게 되는 데이터 불일치 문제를 야기한다.

이러한 문제를 Process Synchronization 문제라고 하고 이런 상황을 Race condition이라 한다.

Example of Race condition
Example of Race condition.

Race condition 사례와 솔루션

Case 1. 커널(Kernel) 수행 중 인터럽트(Interrupt) 발생 시

예를 들어 커널 수행 중 카운터 값을 ‘1’ 증가시키려고 변수를 레지스터(Register)로 불러 들였을 때 인터럽트가 발생하면 커널 수행을 잠시 멈추고 인터럽트 처리 루틴(Service routine)으로 넘어간다.

이떄 커널 코드로서 같은 커널 주소공간을 공유하는 인터럽트 핸들러(Interrupt handler)가 같은 변수의 값을’1’ 감소시키면 해당 데이터는 1씩 증감(상쇄)하여 변함이 없어야 한다.

하지만 인터럽트가 끝나면 컨텍스트 스위치 시점으로 돌아가 해당 시점에서 저장된 카운터 값으로 증가시키기 때문에 결과적으로 인터럽트 핸들러의 수행 내용이 반영되지 않고 1 증가한 값으로 반영되어 버린다.

Problem of interrupt in use kernel.
Problem of interrupt in use kernel.
Solution

중요한 값을 건드리는 동안에는 인터럽트가 들어왔더라도 인터럽트를 Disable/Enable 시키도록하여 인터럽트 처리 루틴으로 넘기지 않음으로써 Race condition 문제를 해결한다.

Case 2. 프로세스 커널 모드 수행 중 컨텐스트 스위치(Context switch) 발생 시

프로세스 A가 어떤 작업을 위하여 시스템 콜 후 커널 모드에서 카운터 값을 증가시키고 있는 도중 CPU 할당시간이 만료되어 CPU가 B한테 넘어갔는데 B에서도 어떤 작업을 수행하기 위하여 시스템 콜을 하였고 커널 모드에서 마침 A에서 작업하던 데이터와 같은 데이터의 값을 증가시켜 저장하였다.

CPU는 다시 A에게 넘어간 뒤 모든 작업이 완료되면 해당 데이터는 총 ‘2’증가하여야 하지만 ‘1’만 증가한다. 이는 CPU가 A에게 돌아왔을 때 A는 컨텍스트 스위치가 발생한 다음 시점의 인스트럭션을 실행하기 때문에 B가 작업한 내용은 반영하지 않고 저장하기 때문이다.

Problem of context switch in kernel mode.
Problem of context switch in kernel mode.
Solution

프로세스가 커널 모드에 있을 때는 CPU 할당시간이 끝나도 CPU를 Preepmt 하지 않도록 하고 커널 모드에서 사용자 모드로 돌아갔을 때 Preempt하도록 하여 해결한다.

Case 3. 멀티프로세서(Multiprocessor) 하에서 공유 메모리 내의 커널 데이터

각 프로세서(CPU)가 인터럽트를 받지 않으면서 독립적으로 병렬 작업할 수 있는 멀티 프로세서 상황에서는 인터럽트 Disable/Enable을 적용해도 공유 데이터의 Race condition을 막을 수 없다.

Problem shared memory in multiprocessor.
Problem shared memory in multiprocessor.
Solution

데이터에 접근할 떄 Lock/Unlock하여 문제를 해결한다.

예를 들어 프로세서 A가 데이터를 수정하려면 레지스터에 Load할 때 먼저 Lock을 걸어서 다른 프로세서가 해당 데이터에 접근 할 수 없게 막아놓고 데이터를 변경한 뒤 Unlock하는 식으로 수행한다.

개별 변수에 대해서 Lock을 걸었다가 푸는 방법도 있고 커널에 Lock을 걸어서 해결할 수도 있는데 후자는 매순간 커널에 접근할 수 있는 CPU를 하나로 제한하는 방법이므로 멀티프로세서의 효율을 떨어뜨리므로 각 데이터에 Lock하는 방식이 효율적이라고 할 수 있다.

Reference

반효경 “반효경 [운영체제] 11. CPU Scheduling 2 / Process Synchronization 1” KOCW. 2014년 4월 1일. video, http://www.kocw.net/home/cview.do?lid=aa53d6aa576466ee


OS 시리즈 모두보기 (펼치기)


댓글남기기