Synchronization

협력적으로 실행되는 프로세스들은 올바른 실행을 위해 동기화가 필수적이다. 프로세스를 올바른 순서대로 실행하는 실행 순서 제어와 동시에 접근해서 안되는 자원에 하나의 프로세스만 접근하게 하는 상호 배제 방식이 있다.

생산자와 소비자 문제

상호 배제에 대한 예시로 생산자와 소비자 문제가 대표적이다. 생산자는 버퍼에 데이터를 삽입한 뒤 총합 변수를 1 증가시키고, 소비자는 버퍼에서 데이터를 빼낸 뒤 총합 변수를 1 감소시킨다고 해보자. 총합이 처음에 10이라고 가정하고 생산자와 소비자를 100번 동시에 실행시켜본다면 우리는 결과가 10일거라고 예측한다. 하지만 생산자와 소비자 프로세스가 제대로 동기화되지 않았다면 엉뚱한 결과를 내놓는다. 총합이라는 데이터를 동시에 공유해서 사용하는데 소비자는 생산자, 생산자는 소비자의 작업이 끝나기도 전에 총합을 수정하면 이상하게 계산되기 때문이다. 즉, 동시에 접근해서 안되는 자원에 동시에 접근했기 때문에 발생한 문제로 이를 레이스 컨디션(race condition)이라고 한다. 이를 해결하기위에서 두 가지 버퍼 방식으로 공유 메모리(shared memory)를 사용한다.

  • Bounded Buffer: 버퍼 크기가 고정되어 소비자는 버퍼가 비어있으면 생산자는 버퍼가 차있으면 기다려야한다.

  • Unbounded Buffer: 버퍼 사이즈에 제한이 없어 소비자는 새 아이템을 기다려야 하지만 생산자는 언제든지 생산할 수 있다.

Mutex Lock

임계 구역에 자물쇠를 걸어 동시에 접근해서 안되는 자원에 동시에 접근하지 않도록 만드는 도구이다.

  • lock: 전역 변수(자물쇠)

  • acquire(): 함수(임계 구역 진입 전 호출해 임계 구역이 잠겨있다면 열릴 때까지(lock=False) 반복적으로 확인, 열려있다면 잠금(lock=True))

  • release(): 함수(임계 구역에서의 작업이 끝나면 호출해 자물쇠를 풀어줌(lock=False))

하지만 aquire()를 호출하고 임계 구역이 잠긴 경우 반복적으로 임계 구역이 열릴 때까지 확인하는 과정에서 바쁜 대기(busy wait)가 일어난다.

Semaphore

뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스에 대한 도구인데, 이는 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구이다.

  • S: 전역 변수(사용 가능한 공유 자원 개수)

  • wait(), P(): 함수(S가 0 이하면 사용할 수 있는 자원이 있는지 반복적으로 확인, 1 이상이면 S를 1 감소시키고 임계 구역에 진입)

  • signal(), V(): 함수(임계 구역에서의 작업이 끝나면 S를 1 증가시킴)

뮤텍스 락에서는 사용할 수 있는 공유 자원이 없는 경우 무한 반복하며 확인하는 바쁜 대기가 일어났는데, 세마포에서는 wait()에서 사용할 수 있는 자원이 없는 경우 해당 프로세스 상태를 대기 상태로 만들고 대기 큐에 집어넣는다. 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal()을 호출하면 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경해 준비 큐로 옮겨준다. 하지만 세마포는 매번 임계 구역 앞뒤로 wait()과 signal()을 명시해야해 번거로우며 순서를 제대로 만들어놓지 않거나 중복해서 사용한 경우 잘못된 코드로 인해 예상치 못한 결과를 얻을 수 있다.

Monitor

모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하게 한다. 모니터 안에는 항상 하나의 프로세스만 들어오도록 한다. wait()으로 호출한 프로세스의 상태를 대기 상태로 전환하고 조건 변수에 대한 대기 큐에 삽입한다. 이 큐는 모니터 내부에 있고, 모니터에 진입하기 위해 삽압되는 큐와 다르다. signal()은 wait()로 인해 큐에 삽입된 프로세스의 실행을 제개하는 연산이다. 대기 중인 프로세스를 깨워 모니터 안으로 다시 들어올 수 있게 한다. 세마포와 달리 wait, signal 설정 없이 함수 앞에 "synchronized"를 붙여주면 상호 배제하에 함수의 작업을 수행한다.

Last updated