ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 12. 임계구역과 세마포어
    운영체제/운영체제 정리 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에 가두게 된다. 

     

     

    즉 동기화를 통해

     

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

    '운영체제 > 운영체제 정리' 카테고리의 다른 글

    14. 모니터  (0) 2019.12.31
    13. 교착상태 ( Deadlock)  (0) 2019.12.15
    11. 프로세스와 쓰레드  (0) 2019.11.11
    10. CPU 스케쥴링  (0) 2019.10.28
    9. 문맥전환, 선점과 비선점  (0) 2019.10.13
Designed by Tistory.