[OS]Process Synchronization(Monitor)

zzarbttoo·2021년 8월 7일
0

OS(운영체제)

목록 보기
8/12

이 글은 KOCW에 공개되어있는 '반효경 교수님'의 운영체제 강의 및 강의 교재 Operation System Concepts(a.k.a 공룡책🦕)의 내용을 기반으로 작성했습니다.

이번 챕터에서는 지난 챕터에 이어 Process Synchronization의 Monitor에 관해 정리해보겠습니다
오류가 있다면 댓글로 정정 부탁드립니다


Monitor

동시 수행중인 프로세스 사이에서 abstract data type의 안전한 공유를 보장하기 위한 high-level synchronization construct

  • 모니터 내에서는 한번에 하나의 프로세스만이 활동 가능(active 한 process 0일 때 모니터 사용 가능해짐)
  • 프로그래머가 동기화 제약 조건을 명시적으로 코딩할 필요 없음(일일히 락을 걸어줄 필요가 없다)
  • 모니터 안에서 실행하다 무언가 충족이 안돼서 프로세스가 오래 걸린다면 그 프로세스를 잠들게 한다
  • 충족되지 않은 값을 변수(condition variable)로 두게 된다
  • Monitor과 세마포어는 다른 용도로 이용되는 코드이다

| condition variable (x, y)

프로세스가 모니터 안에서 기다릴 수 있도록 하기 위해 condition variable을 이용한다(세마포어와 비슷한 역할 함)

  • condition variable은 wait와 signal 연산에 의해 접근이 가능하다
  • 자원 여분이 있다면 바로 주고, 없으면 wait, 끝나면 signal을 통해 빠져나가도록 하는 함수를 만든다

wait

  • x.wait()를 invoke를 한 프로세스는 다른 프로세스가 x.signal()를 하기 전까지 suspend 된다(어떤 프로세스를 잠들게 하고, x라는 condition variable에 줄 서있게 된다)

signal

  • x.signal()은 정확하게 하나의 suspend된 프로세스를 resume한다 (잠들어 있는 프로세스를 깨워줌)
  • suspend된 프로세스가 없으면 아무일도 일어나지 않는다

| Bounded Buffer Problem

monitor bounded_buffer
{

int buffer[N];
condition full, empty; 

void produce(int x){
if there is no empty buffer
   empty.wait(); 
add x to an empty buffer
   full.signal();
}

void consume(int *x){
if there is no full buffer 
    full.wait();
remove an item from buffer and store it to *x
    empty.signal();
}

}
  • condition variable(full, empty)은 값을 가지지 않고 자신의 큐에 프로세스를 매달아서 sleep 시키거나 큐에서 프로세스를 깨우는 역할만 함
  • 세마포어를 이용할 때는 데이터 출입이 있을 때 락을 걸었었지만, 모니터에서는 생산자/소비자 상관 없이 다른 프로세스의 접근을 모니터가 막아주기 때문에 락을 걸 필요가 없다(한번에 하나의 프로세스만 접근 가능)
  • 잠들어 잇는 프로세스가 있다면 signal이 작동하겠지만, 없다면 signal 변수에 아무 일도 일어나지 않는다

| Dining Philosophers Example(모니터)

monitor dining_philosopher
{

enum {thinking, hungry, eating} state[5];
condition self[5];

void pickup(int i){
state[i] = hungry;
test(i);
if (state[i] != eating){
self[i].wait();
}

void putdown(int i){
state[i] = thinking'
test((i+4)%5);
test((i+1)%5);
}


void test(int i){
if ((state[(i+4)%5] != eating) && (state[i] == hungry) && (state[(i+1) %5] != eating)){
state[i] = eating;
self[i].signal();
}

void init(){
for (int i = 0; i < 5; i++) state[i] = thinking;
}
}

↑ 모니터 코드로 진입하게 된다 
Each Philosopher
{
pickup(i);
eat();
putdown(i);
think();
}while(1)
- 젓가락을 잡는 것은 모니터 내부의 함수
profile
기록하는 것을 좋아하는 사람입니다

0개의 댓글