본문 바로가기
프로그래밍 기초/운영체제

프로세스 동기화(Process Synchronization) - 2

by junsday 2017. 6. 7.

임계영역(Critical Section)이란?


다중 프로그래밍 시스템에서 여러 프로세스들이 공유하고 있는 자원을 한 시점에 하나의 프로세스만 접근할 수 있도록 지정된 영역을 말한다.

임계영역에는 한 번에 한 프로세스만 접근할 수 있으며, 자원을 다 사용한 프로세스는 자원을 반납하여야 하며, 반납이 완료된 후에 다른 프로세스가 자원을 사용할 수 있다.

한 프로세스가 임계영역의 자원을 독점할 수는 없으며 프로세스가 임계영역으로의 진입을 시스템에 요청하면 일정 시간 내에 진입을 할 수 있어야 한다.



상호배제(Mutual Exclusion)란?


다중 프로그래밍 시스템에서 여러 프로세스들이 동시에 독립적으로 진행됨으로 인하여 발생하는 문제점들을 해결하는 기법 중 하나. 프로세스들은 상호 독립적으로 움직인다. 대부분 이러한 문제는 자원에 대한 접근이나 공유 데이터에 대한 접근 시에 발생하며 이 작업은 커널 내에서 해결하여야 한다. 상호배제란 둘 이상의 프로세스가 임계 영역에 동시에 접근하는 것을 금지시키는 기법이다.

일반적으로 뮤텍스(Mutex)라고 부른다.


뮤텍스를 설명할 때 쉽게 화장실을 예로 들어서 많이들 설명한다. 

1. 화장실에 가기 위해서는 키(Key)가 필요하다. 

2. 화장실을 동시에 두 명이 사용할 수는 없다. 

3. 화장실에 가려는 사람은 키를 가지고 들어가서 화장실을 사용한 후에 다시 키를 반납해야 한다. 

4 키를 반납한 후에야 다음 사람이 키를 갖고 화장실을 이용할 수 있다.


뮤텍스는 다음에 나올 세마포어(Semaphore)와 비슷하다. 세마포어는 키(key)가 두 개 이상인 뮤텍스이며, 키가 하나인 세마포어가 뮤텍스라고 생각하면 된다. 뮤텍스는 바이너리 세마포어(Binary-semaphore)라고도 한다.



교착상태(Deadlock)란?


교착상태는 상호배제에 의해 나타나는 문제점으로, 다중 프로그래밍 시스템에서 여러 프로세스들이 공유하고 있는 일부 자원들을 점유하고 놓지 않으면서 다른 프로세스가 가지고 있는 자원들을 원하여 무한정으로 기다리고 있는 상태를 말한다. 이는 프로세스 상태전이도의 프로세스 상태 중 Asleep 상태에 해당하게 된다. 프로세스가 실행하기 위해 필요한 자원을 갖지 못한 상태이므로 Asleep 상태 또는 Suspended Blocked 상태로도 될 수 있으며, 자원을 다시 얻게 되면 Wake up 된다.



다음은 데드락에 걸리게 되는 대표적인 예로 각 프로세스가 하나씩의 자원을 소지(Hold)하고 있으면서 서로가 가진 자원을 원하고(Need) 있는 상태로 실행되지 못하고 서로가 자원을 놓기만을 기다리는 무한정 대기 상태이다. 이는 환형대기라고 한다.



교착상태의 해결방법은 다음 포스팅에서 다루도록 하겠다.



바쁜대기(Busy Waiting)


프로세스(스레드)가 활성화되어 CPU를 점유하고 있지만 아무 일도 하지 않는 상황을 바쁜 대기라고 한다. 대표적인 예로 스핀락이 있다. 바쁜대기는 CPU를 점유하고 있고, 기다리는 일을 하고 있기 때문에 상태전이도에서 Running상태에 해당하지만 어떻게 보면 자원을 가지고 있지 않기 때문에 Asleep 상태의 프로세스와 유사하다고 볼 수 있다.

뮤텍스는 자원을 얻을 때까지 Sleep상태로 대기하고 spin-lock은 무한루프를 돌며 대기한다. Sleep상태로 대기하는 것은 바쁜대기가 아니므로 spin-lock만 바쁜대기이다.



스핀락(Spin-lock)


바쁜 대기의 한 종류이다. 한 프로세스 Pi가 필요로하는 자원을 가지고 있는 프로세스 Pj가 일을 끝내고 자원을 내려 놓을 때까지 무한루프를 돌며 기다리는 것을 스핀락이라고 한다. 스핀락 상태가 오래 지속되지 않는다는 보장이 있을 때 사용한다.


댓글