Programming/Computer Science

[혼공스터디 9기] 혼.공.컴.운. - 12. 프로세스 동기화(필수, 선택 미션 포함)

리버김 2023. 2. 13.

필수미션

1. 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.

 

  1. 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.
  2. 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.
  3. 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.
  4. 세마포를 이용하면 반드시 바쁜 대기를 해야 합니다.

 

답: 4

해설: 세마포는 공유 자원이 여러 개 있는 상황에 적용이 가능한 동기화 도구다. 바쁜 대기는 반복적으로 lock을 확인하는 것인데, 이는 자물쇠 방식을 활용하는 뮤텍스 락에 적용된다.

 

 

12-1 동기화란

프로세스들은 서로 협력하여 실행되기도 한다. 이런 프로세스들의 실행 순서와 자원의 일관성을 보장하기 위해 반드시 동기화되어야 한다.

동기화의 의미

프로세스 동기화: 프로세스들 사이의 수행 시기를 맞추는 것(+스레드도 동기화의 대상)

  1. 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기
  2. 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

 

첫째, 실행 순서 제어를 위한 동기화

동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것

 

둘째, 상호 배제를 위한 동기화

동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는 것

상호 배제(mutual exclusion): 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘

 

생산자와 소비자 문제

상호 배제를 위한 동기화에 관한 문제로, 물건을 계속해서 생산하는 프로세스인 생산자와 물건을 계속해서 소비하는 프로세스인 소비자가 있다고 하자.

 

생산자와 소비자는 '총합'이라는 10의 데이터를 공유하고 있다. 생산자는 버퍼에 물건을 넣은 후, 물건의 총합에 해당하는 변수를 1 증가시키고, 소비자는 버퍼에 물건을 빼낸 후 물건의 총합에 해당하는 변수를 1 감소시킨다.

 

이 때 동기화가 제대로 되어 있지 않을 경우, producer, consumer 스레드 실행 후 합계가 10 초과 혹은 미만일 수 있다.

 

이는 동시에 접근해서는 안 되는 자원에 동시에 접근해 발생한 문제다.

 

공유 자원과 임계 구역

공유 자원: 전역 변수, 파일, 입출력 장치, 보조기억장치 등의 공동의 자원

 

임계 구역: 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

 

레이스 컨디션: 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우. 데이터 일관성이 깨지는 문제가 발생한다. 

 

상호 배제를 위한 동기화를 위한 세 가지 원칙

  1. 상호 배제: 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 입계 구역에 들어올 수 없다.
  2. 진행: 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  3. 유한 대기: 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.(임계 구역에 들어오기 위해 무한정 대기해서는 안 된다.)

 

12-2 동기화 기법

동기화를 위한 대표적인 도구, 뮤텍스 락, 세마포, 모니터

뮤텍스 락

상호 배제를 위한 동기화 도구. 단순한 형태는 하나의 전역 변수와 두 개의 함수로 구현할 수 있다.

  • 자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
  • 임계 구역을 잠그는 역할: acquire 함수
  • 임계 구역의 잠금을 해제하는 역할: release 함수

 

acquire 함수

프로세스가 임계 구역에 진입하기 전 호출한다. 만일 임계구역이 잠겨 있다면 열릴 때까지 반복적으로 확인하고, 열려 있다면 잠그는 함수다. 이를 '바쁜 대기'라고 한다.

 

release 함수

현재 잠긴 임계 구역을 열어 주는 함수다.

 

acquire와 release 함수를 아래와 같이 임계 구역 전후로 호출함으로써 하나의 프로세스만 임계 구역에 진입할 수 있다.

 

세마포

뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구다.

뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식인 반면, 세마포는 공유 자원이 여러 개 있는 상황에서도 적용이 가능하다.

 

역시 하나의 변수와 두 개의 함수로 단순하게 구현할 수 있다.

  • 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S
  • 임계 구역에 들어가도 좋은지, 기다려야 할 지를 알려주는 wait 함수
  • 임계 구역 앞에서 기다리는 프로세스에 '이제 가도 좋다'고 신호를 주는 signal 함수

 

임계 구역 진입 전후로 wait()와 signal을 호출한다. 

 

wait 함수

  1. 만일 임계 구역에 진입할 수 있는 프로세스 개수가 0 이하라면
  2. 사용할 수 있는 자원이 있는지 반복적으로 확인하고,
  3. 임계 구역에 진입할 수 있는 프로세스 개수가 하나 이상이면 S를 1 감소시키고 임계 구역 진입한다.

 

프로세스가 무한정 반복하며 S를 확인해야 하는 문제를 해결하는 법

  • wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 넣는다. 그리고 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮긴다.

 

세마포를 이용해 프로세스의 순서를 제어하는 방법

  • 세마포의 변수 S를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait 함수를 붙인다. P1이 먼저 실행되면 P1이 당연히 먼저 임계 구역에 진입하고, P2가 먼저 실행되더라도 P2는 wait 함수를 만나므로 P1이 임계 구역에 진입한다. P1이 먼저 실행되든 P2가 먼저 실행되든 반드시 P1, P2 순서대로 실행된다.

 

*세마포도 뮤텍스 락과 마찬가지로 많은 프로그래밍 언어에서 제공한다.

 

 

모니터

  • 매번 임계 구역 앞뒤로 일일이 wait과 signal 함수를 명시해야 하는 세마포보다 편리하다.
  • 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리한다.
  • 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.
  • 이를 위해 모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입하고, 큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 한다.
  • 조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 모니터가 사용하는 특별한 변수

 

모니터가 실행 순서를 제어하는 방법

  • wait: 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입한다. 이는 모니터의 상호 배제를 위한 큐와는 별개의 것이다.
  • wait 연산으로 일시 중지된 프로세스는 다른 프로세스의 signal 연산을 통해 실행이 재개될 수 있다.
  • signal: wait을 호출하여 큐에 삽입된 프로세스의 실행을 재개하는 연산
  • 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행을 중단한다. 특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.

 

*https://github.com/kangtegong/self-learning-cs(동기화가 실제 소스 코드로 구현된 모습)

반응형

댓글