반응형

1. 상호배제를 위한 세마포 원리 및 코드

상호 배제의 기능을 수행한다.

 

 

< 원리 >

 

 

< 함수 내부 >

 

 

mutex가 양수이면 들어갈 수 있다.

S.value = mutex 이다.

0 또는 음수이면 사용중이라는 의미이다. (ex) -1이면 대기자가 1명이라는 뜻

 

wait(S)

S.value = -1이면

if문에 들어가서 add this process to S.L

즉, 진동벨을 나누어주고 다른 일을 수행할 수 있도록 한다.

 

signal(S)

수행이 끝나면 S.value 값을 1 올려준다.

그럼에도 아직 대기자가 남아있다면(즉, S.value가 0보다 작거나 같다면)

remove a process P from S.L;

wakeup(P);

즉, 아까 나눠줬던 진동벨을 울려 대기자들을 다시 불러온다.

 

 

 

 

2. 세마포의 장점

: 간단하게 구현된다.

 

 

 

 

3. 동기화 도구로써의 세마포

: 프로세들간에 실행 순서가 정해져 있을 때 사용한다.

: 세마포는 바쁜 대기를 유발하지 않는 동기화 도구이다. 

 

* 중요 *

0으로 초기화된 flag를 사용한다. 즉 mutex = 0; 으로 초기화

 

 

 

ex) A -> B 의 실행 순서가 지켜져야 할 때

세마포 동작 예시

 

flag = 0 이므로 Pj가 먼저 실행된다고 하더라도 wait 상태에 들어갈 것이다.

Pi에서 A가 실행되고 signal(flag);를 해서 flag를 1로 만들 때까지 절대 B를 실행할 수 없는 것이다.

 

 

 

 

 

4. 세마포의 문제점

: 세모포 변수를 여러 개 두고 실행할 경우 교착 상태와 기아 상태를 유발할 수 있다.

 

1) 교착 상태

: 이상의 프로세스들이 대기중인 프로세스들 단지 하나에 의해서만 야기될 있는 사건을 무한정 기다리는 상황

 

2) 기아 상태

무한 정지, 프로세스들이 세마포 큐에서 제거되지 않고 무한정 대기하는 것

 

 

 

ex) flag가 1로 초기화된 경우

P0

wait(S)에서 flag가 0이 되고

wait(Q)에서도 flag가 0이 되어

기다리는 중

 

P1

wait(Q)에서 flag가 하나 더 감소하여 -1이 되고

wait(S)에서도  flag가 하나 더 감소하여 -1이 되어

기다리는 중....

 

-> 서로가 서로를 기다리느라 무한정 기다리는 상황에 빠지게 된다.

 

 

 

 

 

 

5. 고전적 동기화 문제 : 세마포로 해결해보기

 

* 초기화 : full = 0, empty = n, mutex = 1

 

 

-> full은 생산된 데이터의 개수, empty는 남은 버퍼의 개수

 

 

가운데에

wait(mutex);        wait(mutex);

...                          ...

signal(mutex);      signal(mutex);

는 상호배제를 위한 세마포를 구현한 것

 

생산자 위쪽 wait(empty);

소비자 아래쪽 signal(empty); 

는 생산자 동기화를 위한 세마포

 

생산자 아래쪽 signal(full);

소비자 위쪽 wait(full); 

는 소비자 동기화를 위한 세마포

 

 

 

 

 

 

 

 

6. Readers - Writers 문제

: 리더랑 라이터가 여러 명일 때

 

-> 라이터가 없을 때에는 리더가 여러 명이 들어갈 수 있다.

 

 

 

 

 

7. 모니터(Moniters)

: 세마포 연산자들을 한 데에 모아놓은 객체이다.

: 공통된 객체 내에서 활동하도록 보장한다.

: 오류 디버깅을 쉽게 할 수 있게 한다.

 

-> 많은 세마포 사용시, 잘못된 사용으로 오류가 발생하기 쉽기 때문에 사용한다.

 

 

 

 

 

 

 

 

 

 

 

* 정보처리기사 문제 *  

  1. 프로세스들 간에 상호배제해야한다.
  2. 임계 구역은 여러 사용자가 동시에 사용하지 않도록 하는것
  3. 임계 영역 안에서의 작업은 신속히 이루어져야
  4. 어떤 프로세스가 임계영역 내에서 실행중일때 인터럽트가 발생한다고

하더라도 프로세스는 실행을 멈추지 않는다.

    5. 임계영역에서 무결성을 보장한다.(값이 꼬이지 않음)

    6. 하드웨어 자원이 필요한 : Test&Set 명령어

반응형

+ Recent posts