ecsimsw

Semaphore 본문

Semaphore

JinHwan Kim 2019. 10. 2. 03:46

Semaphore

 

   동기화를 위한 소프트웨어적 도구, critical point를 엑세스하는 사용자의 수를 제한하고, 제한 인원 외의 프로세스는 LIST에 넣어 이를 순차적으로 관리한다.

 

   프로세스 제한 수를 관리하는 변수 valueWait(), Signal() 두 함수로 이루어져 있다. value는 음수일 때, 그 절댓 값은 대기 중인 프로세스의 수이다.

 

 Waitvalue를 확인하여, 그 값이 0보다 작은 값, 1개 이상의 대기가 존재하면 현재 프로세스를 대기열에 넣어두고 block 호출로 프로세스를 중지한다. Signalvalue가 양수이면 아직 사용자 수가 제한 수보다 적음을 의미하므로 무시하고, 0이하의 값, 즉 대기하는 프로세스가 있는 상황에서는 rellease를 통해 사용자 한명을 더 허용할 수 있으므로 list에서 프로세스를 가져와 wakeUp 시킨다.

 

semaphore

Structure / Wait / Signal

 

   structure Semaphore{

    int value;

    structure Process* pList;

    void acquire(); // wait

    void release(); // signal

    }

 

   void acquire(){

    value--;

    if(value <0){

       pList.push(this.process);

       block();

     }

    }

 

   void release(){

    value++;

    if(value <= 0){

       P = pList.pop();

       wakeUp(P);

     }

    }

 

Process

 

   sem.acquire();

   ///////////////

   critical point

   ///////////////

   sem.release();

 

Question

 

   - 결국 semaphore 객체도 공유 자원 아닌가? sem.value를 감가산하는 과정, 또 그것을 조건으로 프로세스를 처리하는 과정에서 critical section problem이 있지 않나?

     semaphore가 변수로 사용중인 프로세스의 수를 확인하고 문지기 역할을 하는 것은 알겠는데 semaphore 자체가 공유 자원이 아닌가 싶어 이게 완벽한 솔루션이 되는 이유를 모르겠다.

'Computer Science > Operating system' 카테고리의 다른 글

Dead Lock  (0) 2019.10.07
Traditional synchronization example / Producer and Consumer problem  (0) 2019.10.02
Process Synchronization  (0) 2019.09.26
Process / Thread  (0) 2019.09.26
Cpu scheduling  (0) 2019.09.24
Comments