CS지식/운영체제

TIL 정리_86

ran4 2022. 5. 13. 11:10

http://www.kocw.net/home/m/search/kemView.do?kemId=1046323

운영체제 강의를 듣고 정리한 내용입니다

 

 

추상 자료형 : ObjectOperation으로 이루어져있다.

논리적으로 정의를 하는 것을 말한다.

 

Semaphore S

이전의 방식들을 추상화시킨 방법으로 정수값을 가질 수 있는 추상자료형이다

lock을 걸고 푸는 것을 간단하게 사용가능하게 만든다

공유 자원을 획득하고 반납하는 것을 처리해준다

 

P연산과 V연산에 의해서만 접근 가능하다

P(S) : //lock을 거는 과정

while(S<=0) do no-op;

s--;

-> 자원을 획득한다

V(S) : //lock을 푸는 과정

while(S<=0) do no-op;

s++;

-> 자원을 반납한다

 

코드로 구현 

Synchronization variable
-> semaphore mutex;
Process Pi
do {
P(mutex);
critical section
V(mutex);
remainder section
} while(1)
-> busy-wait는 효율적이지 못하다 (spin lock)
->> Block & Wakeup 방식의 구현이 필요하다 (sleep lock)

 

Block/Wakeup

Semaphore를 다음과 같이 정의한다

typedef struct {

int value;

struct proccess*L;

} semaphore;

 

block와 wakeup을 다음과 같이 가정한다

block

커널은 block을 호출한 프로세스를 suspend 시킨다

-> 프로세스의 PCBsemaphore에 대한 wait queue에 넣는다

 

wakeup(P)

block된 프로세스 Pwakeup 시킨다

-> 프로세스의 PCBready queue로 옮긴다

 

구체적인 Semaphore 연산의 구현

 

P(S) :
S.value--;
if(S.value < 0) {
add this process to S.L;
block();
}

V(S) :
S.value++;
if(S.value <= 0) {
remove a process P from S.L;
wakeup(P);
}

 

 

Busy wait vs Block/wakeup

  • Critical section의 길이가 긴 경우 Block/Wakeup이 적당하다
  • Critical section의 길이가 매우 짧은 경우 Block/wakeup의 오버헤드가 busy-wait 오버헤드보다 커질 수 있다

-> busy-wait를 써도 무방하다

  • 일반적으로는 Block/wakeup 방식이 더 좋다

 

2가지 타입의 Semaphore

  • Counting semaphore
  • 도메인이 0 이상인 임의의 정수값

주로 resource counting에 사용된다

 

Binary semaphore (== mutex)

0 또는 1의 값만 가질 수 있는 semaphore

주로 mutual exclusion(lock/unlock)에 사용된다

 

 

  • Semaphore를 사용할 때 주의할 점

Deadlock

둘 이상의 프로세스가 서로 상대방에 의해 충족될 수 있는 event

무한히 기다리는 현상을 말한다

-> 프로세스 P0P1이 얻어야 하는 event 순서를 동일하게 구성하여 해결한다

 

Starvation

indefinite blocking

프로세스가 suspend 된 이유에 해당하는 세마포어 큐에서 빠져나갈 수 없는 현상

-> 특정 프로세스들만 자원을 공유하여 다른 프로세스가 자원을 얻지 못하는 것을 말한다

 

'CS지식 > 운영체제' 카테고리의 다른 글

TIL 정리_95(동기화 관련 문제(2))  (0) 2022.05.22
TIL 정리_94(동기화 관련문제)  (0) 2022.05.21
TIL 정리_85  (0) 2022.05.12
TIL 정리_84  (0) 2022.05.11
TIL 정리_83  (0) 2022.05.10