본문 바로가기

컴퓨터공학/운영체제

세마포어

반응형

38장 세마포어

 

다중 스레드는 공유된 데이터를 같이 접근할 수 있다록 보니 작업들 사이에 실행 시기를 맞추는 동기화 작업이 필요로 한데 이것을 처리하는 방법이 다른 스레드가 접근하지 못하도록 Mutual exclusion(상호 배제)가 필요하고 공유 변수에 대해서는 Exclusive Access가 필요한다

파이썬에서는 lock.acquire() / lock.release() 이런 형태로 구현

 

lock.acquire()

...

lock.release()

이렇게 소스가 있으면 A,B,C,D 스레드가 있다고 할 때 A 스레드가 acquire()를 실행하고 임계영역에 접근한 뒤 release가 될때까지 다른 스레드는 acquire()문에서 대기한다

 

lock.acquire() ~ lock.release() 사이의 영역을 임계영역

공유데이터를 임계자원

 

임계영역에 한 개의 스레드만 접근하는 방식을 mutex나 바이너리 세마포어라고 하며

두개 이상의 스레드를 접근하는 방식을 세마포어라고 한다

 

세마포어 방식은 슈도 코드(pseudo-code)로 설명한다

*슈도 코드란 c언어, python 등 한 언어에 구속된 언어가 아닌 로직을 설명하기 위해 쓴 언어

P(S) : wait(S){

           while(S<=0)

           ;
           S--;
}

임계영역 코드 실행

V(S) : signal(S){

S++

}

이렇게 되면 가령 S에 2를 넣게 되면

첫번째 스레드는 임계영역코드를 정상적으로 실행하고 임계영역에 있을때는 S가 1이되고, 

두번째 스레드는 임계영역코드에 있을때 S가 0이되고, 세번째 스레드는 S++이 될때까지 while문을 계속 돌게된다.

이런식으로 처리해줄 수 있는데 이게 바쁜대기

 

계속적으로 바쁜대기를 하게 되면 성능이 저하하기 때문에 이를 보완한 방법이

P(S) : wait(S){

	if(S<=0)
        {
           대기큐 삽입
           block()
        }
     S--

}

임계영역 코드 실행

V(S){

        S++
        if(S>=0)
        {
           대기큐 제거
           wakeup()
        }

}

 

POSIX에서 이걸 구현한 것이

sem_open() : 세마포어 생성 , sem_wait() : 임계영역 접근 전에 세마포어를 잠근다, sem_post() : 세마포어 잠금을 해제한다

반응형

'컴퓨터공학 > 운영체제' 카테고리의 다른 글

페이지폴트  (0) 2019.11.27
다중페이징시스템  (0) 2019.11.26
가상메모리의 이해 - 페이징 기법  (0) 2019.11.25
가상메모리  (0) 2019.11.25
교착상태와 기아상태  (0) 2019.11.25