운영체제

[OS/운영체제] 프로세스 동기화 (Process Synchronization) - (1)

4Legs 2020. 11. 10. 20:14

Producer-Consumer Problem

다음 두 코드를 보자.

Producer
Consumer

 

Producer 코드는 buffer 한 칸에 문자를 쓰고 버퍼의 다음 칸으로 이동하고 counter를 증가시킨다. Consumer 코드는 counter 값이 0이 될 때까지 buffer 한 칸의 문자를 읽고, counter 값을 감소시킨 후  버퍼의 다음 칸으로 이동한다.

이 두 코드는 각자 실행할 경우 잘 동작하지만, 동시에 실행시켰을 때에는 잘 작동하지 않을 수 있다.

각 코드가 공유하는 counter 변수를 조작하는 과정에서 문제가 발생하는데, counter를 조작하는 구문을 다음과 같이 풀어 쓸 수 있다. (이는 low-level에서 해당 구문이 동작하는 순서와 같음)

Producer의 counter++; 구문
Consumer의 counter--;  구문

동시에 실행되는 counter++ 구문과 counter-- 구문은 low-level에서는 다음처럼 임의의 순서로 실행된다.

뒤섞여버린 두 low-level 구문들

따라서, high-level에서 의도했던 순서로 실행되지 않을 수 있다.

위의 예시와 같이 "counter를 1 증가시켰다가 1 감소시켜라" 라는 원래의 의도와는 다르게 증가된 counter 값을 Producer가 저장하기 전에 Consumer가 읽은 후 감소시켜 저장했기 때문에 counter에는 5가 아닌 4가 담기게 된다. 

 

이 문제는 두 프로세스가 공유하는 counter라는 변수에 두 프로세스 모두 동시에 접근 가능하기 때문에 발생한다.

이러한 상황에서는 공유 변수에 도달하는 프로세스의 순서에 따라 결과가 결정되는데, 이를 Race Condition이라 한다. 이를 방지하기 위해서는 counter와 같은 공유 변수에는 한 번에 하나의 프로세스만 접근할 수 있도록 해야 할 것이다.

 

Critical-Section Problem

n개의 프로세스들이 존재하는 시스템을 생각해보자.

각 프로세스들은 Critical Section이라는 코드의 한 부분을 갖는데, Critical Section에서는 데이터베이스 업데이트, 공유 변수, 파일에 쓰기 등의 작업이 주로 이루어진다. 이 시스템은 한 프로세스가 Critical Section 부분을 실행 중일 때, 다른 프로세스는 Critical Section 부분을 실행할 수 없도록 해야 할 것이다.

 

Critical-Section Problem은 이러한 상황에서 프로세스들이 상호간 잘 동작하도록 설계하는 것을 말한다.

각 프로세스들은 Critical Section에 접근하기 위해 접근 권한을 요청해야 하며, 이러한 과정을 구현한 코드를 Entry Section이라 한다.

Critical Section에서의 작업을 마치고 빠져나가는 부분을 Exit Section이라 하며,

그 이후의 코드는 Remainder Section이라 한다.

 

Critical Section Problem을 해결하기 위한 방법들은 반드시 다음 세 가지 조건을 충족시켜야 한다.

Mutual Exclusion

만약 프로세스 Pi가 Critical Section을 실행하고 있다면, 다른 프로세스들은 Critical Section을 실행할 수 없다.

 

Progress

만약 현재 어떤 프로세스도 Critical Section을 실행하고 있지 않고, Critical Section에 들어가려는 프로세스들이 있다면 Remainder Section을 실행하고 있지 않은 프로세스들에 한하여 Critical Section에 들어갈 다음 프로세스를 선택한다.

즉, Critical Section에 들어갈 다음 프로세스를 선택하는 것은 그 즉시 이루어져야 하며, 미룰 수 없다는 의미이다.

 

Bounded Waiting

프로세스가 Critical Section에 들어갈 것을 요청한 이후, 그 요청에 앞서 다른 프로세스가 들어가는 횟수를 제한한다.

즉, 어떤 프로세스가 Critical Section에 들어갈 것을 무한히 기다리는 것을 방지한다.

 

 

※ 본 게시글은 『Operating System Concepts』 를 참고하여 작성되었습니다.