본문 바로가기

Computer Science/OS

세마포

이것을 사용해서 하면

들어갈 때 true로 만들고 나올 때 false가 나옵니다.

 

누군가는 계속 시도만 하고 들어가지 못하는 문제는 여기에서 어떻게 해결할 까요?

 

위 알고리즘으로 기아문제(=계속 기다림)를 해결했습니다.

 

기다리는 놈들 풀어주는 것 입니다.

waiting[j] 하는 놈을 풀어주는 것입니다.

즉, lock을 풀지않고 Pj를 임계영역으로 들어가게 만들어 줍니다.

 

만약 임계영역에 P5가 들어가 있고 P7이 들어가려고 합니다.

P7은 3번 문장, while(waiting[i] && key)에 걸려있습니다.

 

j=7일 때 waiting[7] = false로 만듭니다.

 

 

프로세스가 0~9까지 있다고 합시다.

프로세스 4,7,9가 동시에 들어가게 된다면 어떻게 될까요?

3개중에 2개는 3번 문에 걸쳐있고 한개만 임계영역에 들어갑니다.

 

만약 7이 임계영역에 들어가있다면 4,9는 무엇을 하고 있을까요?

3번문에 걸쳐있습니다.

 

 

탈출 할 때 P7은 P9를 임계영역에 들어갈 수 있또록 만듭니다.

 

지금 P7 -> P9 -> P4가 수행되는 동안 lock 변수는 어떻게 바뀔까요?

처음에 False였다가 P7이 들어갈 때  True로 바뀌었습니다.

P9P4가 들어가도 바뀌지 않고

P4가 끝나면 false로 바뀝니다.

 

TestAndSet으로 상호배재를 해결하려 하면 보통 기아문제가 생긴다는 것 입니다.

 

근데 계속 while문을 쓰니 바쁜대기가 생깁니다.

 

운영체제에서는 프로세스를 관리하기 때문에 해결할 수 있습니다.

 

 

세마포

TestAndSet - 프린터가 하나있으면 한명이 사용하고 있다면 아무도 사용 못한다.

 

상호배제 - 공유자원이 여러개 인것

 

정수변수란 사용 가능한 자원의 개수 표현입니다.

mutax는 자원의 갯수가 1개니깐 정수가 1일 것입니다.

 

표준 단위 연산 => 한번 시작하면 끝까지 다된 다는 것입니다.

 

네덜란드어로 P와 V가 어원입니다.

Probe’ren

1. [타동사] ((probeerde, heeft geprobeerd)) 시험해보다, 검사하다, 입어보다, 맛보다, 시식[시음]하다, 음미하다

 

Verho’gen

1. [타동사] ((verhoogde, heeft verhoogd)) 높이다, 높게 하다

2. [타동사] (쇠 따위를) 높이다, 반음 올리다

3. [타동사] (가격을) 올리다, 상승시키다

 

내려간 상태 (자원 없어 대기)

차단기가 올라간 상태 (자원 사용 가능)

 

P는 진입하는 연산입니다. 차단기를 내립니다.

V는 차단기를 엽니다.

 

P,V를 다른 말로도 표현합니다. 

P => wait

들어가기 전에 다른 것이 있다면 기다리기 때문입니다.

 

V => signal

다른 프로세스를 깨운다는 의미가 있습니다.

 

 

자원의 개수(프린터의 수)

 

자원의 개수가 1개이다.

임계영역에 서로 들어가려 하면 어떻게 될까요

 

하나가 임계영역에 들어가 있다면 S=0일 것입니다.

사용 가능한 자원이 없어진 것입니다.

 

임계영역에 나와서 V연산을 하면 S=1로 만들고 다른 프로세스가 임계영역에 들어갈 수 있을 것입니다.

 

내가 들어갈 때 S=0으로 만들고 들어갑니다.

 

하지만 이런식으로 바쁜대기(while문 계속 쓰는것) 을 해결할 수 는 없습니다.

 

 

ex)프린터가 1개밖에 없다면

mutex는 1로 초기화 해야합니다.

 

mutal exclusion이라는 뜻입니다.

자원이 1개 있다는 것을 전제로 한 것입니다.

 

mutex - 이번에는 자원이 6개 입니다.

공유 자원이 6개 일 때 세마포는 뭐로 초기화 해야 자원 사용이 원할할까요? 6개

 

3개를 사용하고 있다면 세마포는 사용 가능한 자원이 몇개 일 까요? 3개

 

1번 _______ = 0(while문에 걸려있음)

2번 _______ = 시그널 연산

 

왜 전부다 wait하게 할까요? 현재 공유 자원으로 들어가지 못하게 하기위해서 입니다.

프로세스간의 동기화(= 순서제어 하기 위해)

 

시그널 연산 호출하면 기다리는 것 하나를 풀어줄 수 있습니다.

 

S1이 일어난 후 S2가 일어나게 하고 싶다!

 

세마포로 동기화를 시킬 수 있습니다.

 

세마포는 synch는 0로 초기화

 

만약 P2가 먼저 실행되도 wait(1)가 실행되면 기다릴 수 밖에 없습니다.

 

 

 

세마포의 종류

사용 가능한 자원의 수를 세마포에 담습니다.

 

 

wait는 내가 사용 못하고 있는 상태 입니다.

signal을 보내서 사용가능 상태로 만듭니다.

 

P(S) 연산은 wait에 해당합니다.

V(S)연산은 무조건 1로 바꿉니다.

 

위 그림은 이진 세마포에 대한 연산을 의미합니다.

 

S는 1로 초기화

사용 가능 상태는 1로 적어야 합니다.

 

 

계수 세마포에 대해 알아봅시다

계수 세마포는 사용가능 자원이 어러개 입니다.

 

프린터 6개가 모두 사용한다면 그 때 서야 사용 불가능 상태가 욉니다.

그러다가 1개가 멈춘다면 사용 가능 상태가 됩니다.

 

s는 사용가능 자원으로 초기화

 

 

바쁜 대기를 해결 했나요? no

공유자원이 여러 개인 경우 일반화 합니다.

즉, 공유자원을 채크 합니다.

 

만약 TestAndSet은 lock 1,2,3 으로 공유자원을 다른 자원처럼 사용합니다.

 

진짜 세마포는 바쁜 대기를 해결합니다.

인터럽트는 준비상태로 가는 것 입니다.

실행 -> 대기는 어떨 때 될까요? 입출력 이벤트, 그냥 이벤트가 발생하면 대기상태로 갑니다.

 

대기 상태로 바뀌는 것은 wait에 들어가야 할 까요? signal에 들어가야 할까요?

wait 입니다.

 

바쁜 대기를 wait에서 대기 합니다.

 

정확히는 재시작(ready)상태로 보냅니다.

 

대기 상태에 있다가 재시작 하는 것은 signal 입니다.

 

P,V 연산을 좀 수정해 봅시다.

S=S-1

S=S+1

728x90