공부/운영체제

[ 운영체제 ] 프로세스 동기화

haena02 2023. 2. 8. 00:57
반응형

1. 동기화

 

1.1 동기화의 의미

 

동시에 실행되는 많은 프로세스들은 데이터를 주고받으며 실행될 수 있다.

이때의 올바른 실행을 위해서는 동기화가 필요하다. 

 

프로세스 세계에서 동기화란 올바른 순서대로 실행되고 한 자원에 동시에 접근하지 않는 것이다. 

특정 조건이 완료되어야 실행을 이어나가는 프로세스들이 있기 때문에 프로세스에서의 실행순서는 중요하다.

또, 한 프로세스가 연산을 다 끝내기 전에 접근해서 다른 연산을 하면 연산이 꼬여서 원하는 결과가 나오지 않을 수 있다.

 

 

1.2 생산자와 소비자 문제

 

왜 한 자원에 동시에 접근하지 않는 것이 중요한지 더 알아보자.

 

생산자와 소비자는 '총합' 이라는 데이터를 공유한다고 해보자.

생산자는 버퍼에 데이터를 넣고 총합을 1 증가 시키고, 소비자는 버퍼에서 물건을 빼고 총합을 1 감소 시킨다. 

이 상태에서 생산자와 소비자는 각각 10000번씩 실행시키면 총합이 0일 것 같지만 그렇지 않다. 

왜냐? 동기화가 잘 되지 않아서 그렇다. 

 

 

1.3 공유자원과 임계구역

 

여러 프로세스들이 공유하는 자원을 공유자원이라고 한다.

위에서는 '총합'이 공유자원이었다.

공유자원은 전역변수, 파일, 입출력장치, 보조기억장치 등이 될 수도 있다.

 

임계구역, critical section은 동시에 실행하면 문제가 발생하는 자원에 접근하려는 코드 영역을 의미한다. 

임계구역에 두개 이상의 프로세스가 접근하려고 하면 하나는 대기 시켜야한다 

하지만 잘못된 실행으로 여러 프로세스가 임계구역에 접근할 때가 있는데 이를 레이스컨디션이라고 한다. 

 

동시에 임계구역에 접근하면 어떤일이 일어나는지 알아보자.

전역변수 a에 5가 저장되어있다고 해보자.

프로세스1은 a를 1 증가시키고 프로세스2는 a를 1감소 시킨다고 해보자.

프로세스1이 실행되었고 a를 증가시키기 위해 5를 읽어와서 1을 증가시켰다.

하지만 차마 저장하지 못했는데 프로세스2로 context switch되었다.

프로세스2는 a를 감소시키기 위해 5를 읽어와서 1를 감소시켜 a에 4를 저장했다.

그러고 다시 프로세스1로 돌아와 아까 못했던 저장을 하여 a에 6을 저장했다.

증가한번 감소한번 했는데 이상하게 6이다! 

 

동기화를 위해서는 아래 세가지가 지켜져야한다.

  • 한 프로세스가 임계구역에 진입했다면 다른 프로세스는 들어갈 수 없다
  • 임계구역에 아무도 없다면 임계구역에 진입하고자 하는 프로세스는 들어갈 수 있어어야 한다.
  • 한 프로세스가 임계구역에 들어가고싶다면 언제가는 들어갈 수 있어야한다. 

 

2. 동기화 기법

 

2.1 뮤텍스 락

 

탈의실의 자물쇠와 비슷한 역할을 하는 것이 바로 뮤텍스 락이다.

뮤텍스 락은 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구이다.

 

임계구역에 진입하는 프로세스 '내가 지금 임계구역에 있음'을 알리기 위해 뮤텍스 락을 이용해 임계구역에 자물쇠를 걸어둘 수 있고, 다른 프로세스는 임계 구역이 잠겨 있다면 기다리고, 잠겨있지 않다면 진입할 수 있다.

 

뮤텍스락은 하나의 전역변수와 두개의 함수로 구현할 수 있다.

자물쇠 역할의 전역변수 lock과 임계구역을 잠구는 acquire함수, 임계구역의 잠금을 해제하는 release함수가 필요하다.

 

acquire함수는 프로세스가 임계 구역에 진이하기 전에 호출하는 함수이다.

만약 임계구역이 잠겨 있다면 임계구역이 열릴 때까지, 즉 lock이 false가 될 때까지 임계구역을 확인하고 열러있다면 들어간 후 lock을 true로 바꾸는 함수이다.

 

release함수는 임계구역에서 작업이 끝나고 호출하는 함수이다.

lock을 true로 바꾼다고 보면 된다. 

 

 

2.2 세마포

 

세마포는 뮤텍스 락과 비슷하지만, 이는 공유자원이 여러개 있을 때도 사용 가능하다.

탈의실이 여러개 있는 경우라고 생각해도 된다.

 

세마포도 간단하네 전역변수 하나와 함수 두개로 구현할 수 있다.

임계구역에 진입할 수 있는 프로세스 개수를 나타내는 전역 변수 S , 임계구역에 들어가도 좋은지 알려주는 Wait함수와 임계구역에 가도 좋다고 알려주는 signal 함수가 필요하다. 

 

wait함수는 S가 0 이하라면 프로세스를 재우고 S가 1이상이면 S를 하나 감소 시키고 임계구역에 진입한다.

signal함수는 작업을 다 마친 뒤 S를 하나 증가 시키고 준비큐에서 대기큐에서 기다리는 프로세스를 깨운다.

 

 

2.3 모니터

 

모니터는 공유자원과 공유자원에 접근하기 위한 인터페이스를 묶어 관리한다.

그리고 프로세스는 반드시 인터페이스를 통해서만 공유자원에 접근하도록 한다.

이를 이해서 모니터를 통해 공유자원에 접근하고자 하는 프로세스를 큐에 삽입하고,

큐에 삽입된 순서대로 하나씩 공유자원을 이용하도록한다.

 

프로세스를 실행하고 일시중단하기 위해 모니터는 조건변수를 사용하는데, 이는 실행순서를 제어하기 위함이다.

조건변수로는 wait와 signal 연산을 수행할 수 있다.

wait는 호출한 프로세스의 상태를 대기상태로 전환하고 일시적으로 조건변수에 대한 대기 큐에 삽입하는 연산이다. 

wait 연산으로 일시 중지된 프로세스는 signal연산을 통해 실행이 재개될 수 있다.

반응형