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 |