ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제] 뮤텍스(Mutex), 세마포어(Semaphore) 그리고 모니터(Monitor)
    ComputerScience/운영체제 2020. 6. 14. 00:10

    이 셋은 모두 운영체제의 동기화 기법이다.

    일단 뮤텍스와 세마포어부터 살펴보자.

    운영체제에선 공유된 자원에 대해 여러 프로세스, 쓰레드가 접근하여 문제가 발생하는 것을 방지하고자 운영체제 동기화 기법을 만들었다.

    1. 뮤텍스(Mutex, 상호배제) aka Mutual exclusion

    공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것이다.
    임계영역(Critical Section)을 가진 스레드들의 Running time이 서로 겹치지 않게 단독적으로 실행되게 하는 것.
    다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 LockingUnlocking을 사용.

    한 쓰레드가 임계영역에 들어가기 위해선 lock을 하고 나올 땐, unlock를 해준다.

    bool unlocked;
    
    void lock()
    {
    	while(!unlocked)//다른 스레드에 의해 critical section이 이미 선점된 경우 계속 루프
    		{
            	if(unlocked) //다른 스레드가 작업을 마치고 unlock하면, 루프 탈출
                break;
            }
            
           unlocked=false; //이제 내가 선점
    
    }
    
    
    void unlock()
    {
    	unlocked=true;// 할일을 끝낸 스레드는 락을 푼다.
    }
    lock();
    /*----------------------*/
    /*---Critical Section---*/
    /*----------------------*/
    unlock();

    생각보다 간단하다.

    2. 세마포어(Semaphore)

    세마포어도 뮤텍스와 마찬가지로 동기화 기법 중 하나.
    뮤텍스가 임계 영역에 들어가는 스레드가 하나라면, 세마포어는 복수가 가능하다.
    열쇠키가 여러개라고 보면 된다.

    waitsignal을 통해 구현한다.
    일반적으로 , wait이 먼저 호출되며 임계영역에 들어갈 수 있는지 확인한다.
    혹은, 먼저 실행되어야 하는 프로세스가 실행됐는지 확인한다. 조건에 만족하면 wait을 빠져나와 임계영역으로 들어간다.
    이후 signal이 호출되고 임계영역에서 빠져나왔음을 알린다.

    S=3; //임계영역에 들어갈 수 있는 스레드의 개수
    
    void wait(int s)
    {
    	s--;
        if(s<0)
        {
        //add this process into waiting queue
        }
    }
    
    void signal(int s)//일 다하고 나 나와, 다음 애 들어가
    {
    	s++;
        if(s>0)
        {
        //pop the process from the waiting queue (기다리고 있던 애를 임계영역에 넣어줌)
        }
    }
    wait(s);
    /*----------------------*/
    /*---Critical Section---*/
    /*----------------------*/
    signal(s);

    뮤텍스와 세마포어의 차이
    세마포어의 바이너리 값을 갖는 것이 뮤텍스이다.

    3. 모니터(Monitor)

    뮤텍스는 다른 프로세스간에 동기화 할 때 사용할 수 있다는 것이고, 모니터는 하나의 프로세스 내에서 다른 스레드 간의 동기화에 사용된다는 것, 모니터는 프레임워크나 라이브러리 그 자체에서 제공된다. C언어에는 없고 Java에는 있다. 모니터는 일련의 동기화 작업들이 캡슐화되어 있어서 synchronized, wait(), notify()등의 키워드를 통해 좀 더 편하게 동기화 할 수 있다.

    즉, 달리 말해 세마포어는 귀찮게 임계구역 앞에 wait을 설정하고 끝나고 signal을 설정해줘야 하지만 모니터는 그럴 필요 없이 함수 앞에 synchronized를 붙여주기만 하면 알아서 상호배제하여 함수의 작업을 수행한다.

    댓글

Designed by Tistory.