6. Process Synchronization 1, 2

운영체제 – 이화여대 KOWC 공개강의

 

Race Condition – 여러 주체가 하나의 데이터를 동시에 접근하려고 할 때를 레이스 컨디션이라고 부른다.

 

공유데이터를 접근하는 코드가 critical section이다. 어떤 프로세스이든 간에 공유데이터를 접근하거나(critical section) 그렇지 않거나(remainder section)의 두 가지 경우가 반복되면서 구성이 된다. 공유 데이터를 그냥 접근하면 동시성에서 문제가 발생할 수 있기 때문에 공유 데이터를 접근하는 코드 이전에 어떤 entry section을 넣어서 락을 걸 수 있다. 이렇게 해서 여러 프로세스가 동시에 critical section에 접근하는 것을 막고 그리고 critical section이 끝나면 락을 풀어서(exit section) 다른 프로세스가 크리티컬 섹션에 들어갈 수 있도록 해준다.

 

Test_and_set() 인스트럭션은 원래 값(a)을 읽어내고 그 값을 다시 1로 세팅하는 두 가지 작업을 atomic하게(하나의 인스트럭션으로) 처리한다.

 

추상 자료형은 오브젝트와 오퍼레이션으로 구성된다. 추상 자료형은 논리적으로 정의를 하는 것이지 실제로 컴퓨터에서 자료형이 어떻게 구현되느냐는 별개이다.
세마포는 일종의 추상 자료형이다. 세마포 변수 S는 정수 값을 가질 수 있고 세마포 자료형은 P연산과 V연산 두가지가 정의된다.

세마포를 왜 사용하느냐? 락을 걸고 풀고하는 것을 프로그래머에게 간단하게 제공할 수 있다 . 공유자원을 획득하고 반납하는 것을 세마포가 처리를 해준다. P연산은 세마포 변수 값(공유 데이터)을 획득하는 과정이고 V연산은 다 사용후 반납하는 과정이다. 세마포 S는 정수 값을 가질 수 있는데 그것이 자원의 갯수라고 생각하면 된다. 세마포 변수 S의 값이 5이면 P연산을 5번 해서 5개의 프로세스에서 동시에 가져갈 수 있고, V연산은 자원을 반납하는 과정인데 만약 자원의 갯수가 4개인 상태에서 V연산을 하게 되면 자원의 갯수가 1개 반납되어 5개가 된다.

변수 S에 대해 P연산을 하게 되면 S값이 0이하인 동안에 while 문을 돌며 기다리게 된다. 자원을 다 가져가서 자원이 없는 동안(S <=0) 기다린다. 기다리다가 누군가가 자원을 반납하여 S값이 양수가 되면 그때 S 값을 1 빼고 자원을 획득하게 된다. 그 자원을 다 쓰고 다서는 V연산을 하여 S값을 1 증가시켜 자원을 반납하게 된다.

P연산과 V연산은 atomic하게 연산된다는 것을 가정하고 있다. 세마포는 구체적인 구현을 나타내는 것이 아니고 연산 자체를 추상적으로 정의해놓는 것이다. 어떤식으로 atomic하게 구현되었는지는 여기서 관심사가 아니다. 하여튼 P연산은 자원이 있으면 하나 가져가는 것이고 없을 때는 while문을 돌면서 기다리는 것이고 V연산은 자원을 반납하는 과정이다. 여기서도 busy waiting 문제는 발생한다. 어떤 자원이 없을 때 P연산을 하게 되면 while 문을 돌아봤자 자원이 없기 때문에 그냥 기다리다가 본인의 cpu시간을 다 쓰고 반납하게 된다.

프로그래머는 세마포라는것이 지원이 되면 P연산과 V연산만 해주면 되는 것이고 P, V연산을 어떻게 구현할지는 구현이 되는 시스템에서 생각해야할 문제이다. 앞에서처럼 프로그래머가 이러한 과정을 일일이 코딩하는 것이 아니라 추상 자료형 형태로 제공이 되고 프로그래머는 세마포를 통해 프로그램을 작성하면 훨씬 간단하게 문제를 해결할 수 있다.

이러한 busy-waiting 문제를 해결하기 위해 Block & Wakeup 방식으로 구현을 하게 되는데 lock을 못 얻으면 그 프로세스는 쓸데없이 CPU를 쓰는 것이 아니고 그냥 blocked상태, 잠들어버리게 된다. 프로세스에서 IO 요쳥을 하면 해당 프로세스가 IO 디바이스 큐에서 대기하듯이 공유데이터도 마찬가지로 해당 공유데이터 큐에서 blocked 상태로 줄을 서게 된다.

P연산은 자원을 획득하는 과정인데 자원에 여분이 있다면 자원을 획득하고 여분이 없으면 block상태로 된다. V연산은 자원을 다 쓰고 반납을 한다. 그런데 block&wakeup 방식에서는 자원을 반납하고 끝나는 것이 아니라 혹시 이 자원을 기다리면서 잠들어 있는 프로세스가 있다면 그 프로세스를 wakeup 시켜주는 작업이 V연산에 포함된다.
(Process Synchronization2 13:30)

앞의 busy waiting 방식에서는 S라는 것이 자원의 갯수를 의미하는 것이었는데 block&wakeup 방식에서의 S.value는 자원의 갯수를 세는 의미가 아니라 S.value 값이 음수이면 어떤 프로세스가 자원을 기다리고 있다는 의미가 되고 양수이면 자원의 여분이 있기 때문에 기다리지 않고 쓸 수 있는 상황이다라는 어떤 상황을 나타내게 된다. 깨워야할 어떤 프로세스가 있는지를 확인하기 위해 이용하는 값이다.

 

 

댓글 남기기

Close Menu