CS/운영체제

[운영체제] 동기화 기법

연듀 2023. 1. 8. 12:07

프로세스 동기화

 

 

동기화란?

 

프로세스들 사이의 수행 시기를 맞추는 것

하나의 자원을 하나의 프로세스만이 이용하도록 제어하는 것이다.

동기화에는 실행 순서 제어를 위한 동기화와 상호 배제를 위한 동기화가 있다.

 

1. 실행 순서 제어

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

예를 들면 txt파일에 값을 저장하는 Writer 프로세스와 값을 읽어들이는 Reader 프로세스가 있다면, Writer -> Reader 순서로 실행해야 한다.

 

2. 상호 배제

동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하는 것이다.

계좌에 잔액을 넣는 두 프로세스가 있다면 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 한다.

 

* 생산자와 소비자 문제: 물건을 생산해내는 프로세스와 물건을 소비하는 프로세스가 동기화 되지 않을 때 발생하는 문제

 

 

 

 

그렇다면 동시에 접근해서는 안되는 자원이란 무엇일까?

동시에 접근해서는 안되는 자원을 공유 자원이라고 한다. 

 

공유 자원

공동으로 사용되는 자원으로 전역 변수, 파일, 입출력장치, 보조기억장치등이 될 수 있다.

두 개 이상의 프로세스를 동시에 실행하면 문제가 발생할수 있다.

 

 

임계 구역

공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역이다.

임계 구역에 진입한 프로세스가 있다면 다른 프로세스는 임계 구역 밖에서 기다려야 한다.

임계 구역에 먼저 진입한 프로세스의 작업이 마무리되면 기다렸던 프로세스가 임계 구역에 진입한다.

 

잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우를 Race Condition 이라고 한다.

 

상호 배제를 위한 동기화는 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 하는 것이다.

이를 위해서는 세가지 원칙이 지켜져야 한다.

  1. 상호 배제(Mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  2. 진행(Progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  3. 유한 대기(Bounded waiting): 임계 구역에 진입하고 싶은 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.

 

 


 

동기화 기법

 

1. 뮤텍스 락

상호 배제를 위한 동기화 도구로, 임계 구역을 잠그는 기능을 코드로 구현한 것이다.

임계 구역에 진입하는 프로세스는 뮤텍스 락을 이용해 임계 구역을 잠근다.

 

  • lock : 프로세스들이 공유하는 전역 변수
  • aquire: 임계 구역이 잠겨있다면 열릴 때까지 반복적으로 확인하고, 임계 구역이 열려 있으면 잠그는 함수
  • release: 잠긴 임계 구역을 열어주는 함수

 

2. 세마포

앞선 뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식이다.

세마포는 공유 자원이 여러 개 있는 임계 구역 문제도 해결할 수 있는 동기화 도구이다.

프로세스가 임계 구역 앞에서 멈추라는 신호를 받으면 기다리고, 가도 좋다는 신호를 받으면 임계 구역에 들어간다.

 

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

여기서 사용할 수 있는 공유자원이 없을 경우 프로세스가 무한히 반복하며 S를 확인해야 하는 문제가 있다.

그렇기 때문에 wait 함수는 사용할 수 있는 자원이 없을 경우 프로세스를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 넣는다.

다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 대기 중인 프로세스를 대기 큐에서 제거하고, 준비 상태로 변경한뒤 준비 큐로 옮긴다.

 

 

3. 모니터

세마포에 비해 사용자가 사용하기 편리한 동기화 도구로, 조건 변수를 사용한다.

 

  1. 프로세스가 아직 실행될 조건이 되지 않았을 때는 wait를 통해 실행을 중단한다.
  2. 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.
  • 조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 변수
    • wait: 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산
    • signal: wait를 호출하여 큐에 삽입된 프로세스의 실행을 재개하는 연산