운영체제/운영체제 정리

12. 임계구역과 세마포어

100win10 2019. 11. 18. 00:50

임계 구역 (Critical-Section Problem) 이란

 

- 멀티 스레드로 이루어진 환경에서 각각의 스레드는 어떤 코드 영역을 가지고 있는데

 

그 영역은 스레드들이 공통으로 사용하는 변수나 테이블이나 파일을 업데이트하는 부분이다.

 

이 영역을 임계 구역이라고 한다.

 

 

그렇다면 이런 임계구역을 어떻게 해결해야 할까?

 

1. 상호배타( Mutual exclusion )

- 오류가 일어나지 않으려면 공통된 부분의 update는 상호 배타적이어야 한다. 한 스레드가

 

공통으로 사용하는 변수를 업데이트 다 한 후에야 다른 스레드가 접근할 수 있다.

 

즉 오직 한 스레드만 진입할 수 있다.

 

2. 진행 ( Progress ) 

- 이 임계 구역에 누가 먼저 들어갈 것인가 하는 결정은 유한 시간 내에 결정되어야 한다.

 

3. 유한 대기 ( Bounded waiting ) 

- 어느 스레드라도 기다리고 있다면 유한 시간 내에 임계 구역 안에 들어갈 수 있어야 한다.

 

 

 

현재 공부 부분

 

O/S

1. 프로세스 관리

    -cpu schedueling ( CPU 스케쥴링 ) : RR, SJR, FCFS...

    -synchronization ( 동기화 ) : 임계 구역 해결, 프로세스 실행 순서 제어

2. 메모리 관리

3. 파일 관리

4. I/O 관리

 

 

 

이런 동기화들을 위한 도구들이 있는데 대표적으로 세마포어모니터이다.

세마포어 

-철도의 깃발을 연상, 동기화 문제 해결을 위한 소프트웨어 툴 

(소프트웨어 툴에는 세마포어, 모니터 등이 있다.)

 

정수형 변수와 두 개의 동작 ( P, V )로 이루어져 있다.

 

동작

- P ( 검사 )  : acquire()

 

-V ( 증가 ) : release()

 Semaphore는 내부의 정수 값(value)이 있고 P(acquire)와 V(release) 메서드

 

그리고 큐(Queue)가 있다.

 

 

 

 

 

앞 서 배운 프로세스에 줄 서서 기다리는 모습이다.

 

 어떤 스레드는 레디큐에서 기다리면서 CPU 서비스를 받다가 세마포어에 대해서

 

acquire을 호출할 수 있다. 그때 if가 true가 된다면 세마포어에 queue로 들어가게 되고

 

결과적으로 ready queue로 들어가지 못하고 block 되게 된다. block 된 후는 CPU 서비스를 받지 못하게 된다.

 

해방이 되려면 또 다른 프로세스가 돌면서 release를 호출한다면  value를 증가시키게 되고

 

조건을 만족한다면 갇혀있는 한 스레드를 빼내서 다시 레디 큐로 보내게 된다. 그리고 다시 CPU 서비스를 받을 수 있게 된다

 

 

그렇다면 value는 무엇을 의미할까? 

: number of permit 즉 허용의 개수

 

세마포어는 동기화 중에서도 상호 베타를 목적으로 사용한다. 세마포어 안에는 정수 값(value) 이 들어

 

있다고 했는데 1이라고 가정해보자.

1. 우선 프로세스(스레드)가 CPU 서비스를 받게 되면서 acquire을 호출하게 된다.

acquire() 시 0이므로 통과하게 되고 임계 구역으로 접근해서 자원을 쓴다. 

 

2. 1이 임계 구역의 코드를 돌던 중 시간 흐름에 의하여 다른 프로세스(스레드)가 문맥 전환되면서 CPU 서비스를 받는다. acquire()을 호출 시 -1이 되므로 이 프로세스는 큐에 갇힌다(block).  큐에 갇힌다는 것은 임계 구역 안으로는 들어올 수

없게 만든다는 것이다.

 

3. 시간 흐름에 의하여 1의 프로세스(스레드)가 문맥 전환되면서 다시 CPU 서비스를 받는다. 임계 구역에 있는 코드를

다 돌고 release()를 호출한다. 즉 value는 0이 되고 if 조건을 만족하니 갇혀있는 프로세스를 깨워서

ready queue로 보낸다.

 

4. 2는 이제 임계구역 코드에 접근이 가능하다.

 

1~4의 과정을 통해 우리는 상호배타를 가능하게 할 수 있다.

 

 

 

 

세마포어를 통한 Ordering

 

P1이 P2보다 먼저 실행되고 싶을 때는?

 

1. 세마포어의 초기값을 0으로 둔다. 

 

2.  P2의 시작에 acquire()을 P1의 끝에 release()를 통해 순서를 정할 수 있다.

 

P2가 만일 먼저 CPU 서비스를 받게 되면 value는 0에서 -1이 되고 if 조건이 만족되면서

 

P2를 queue에 가두게 된다. 

 

 

즉 동기화를 통해

 

임계 구역 문제 해결과 프로세스 실행 순서 제어가 가능하다.