본문 바로가기

Computer Science/OS

모니터 추가설명, 교착 상태와 기아 상태

모니터도 기말!

 

시그널을 보내면 2개의 프로세스가 살아납니다.

선택해야 합니다.

살아난 것을 돌리지, 내가 돌릴지

 

 

세마포 = 조건변수? 

 

조건변수랑 세마포랑 비슷해 보입니다. 

왜냐하면 P() = wait() 

V() = siganl()

연산의 이름조차도 비슷합니다.

 

결국 차이는 있습니다. 

 

조건변수를 wait하면 x_sem에서 무조건 기다립니다.(무조건, 누가 깨워줄 때 까지)

 

signal은 무조건 하지 않습니다.

 

x_count란? 조건변수 x에서 기다리는 애들이 몇명인지 알려줍니다.

x_count x_sem에서 대기하는 프로세스가 몇개인지 알려주는 변수입니다.

즉, 대기하는 프로세스가 있다면 signal을 합니다.

 

코드의 흐름을 보면 wait(x_sem)에서 signal이 올 때까지 기다립니다.

signal이 온다면 x_count--부터 실행되겠지요

 

wait()에서 내가 대기를 하기 전에 signal로 살려줘야 합니다.

왜냐하면 모니터에는 하나의 프로세스만 동작할 수 있기 때문입니다.

그 대상들은 모니터안에서 기다리고 있는 애들(=next)

모니터에 들어오고 싶어하는 애들(mutex)

입니다.

 


wait하기전에 signal은 왜해줄까요?

모니터 안에는 반드시 하나의 프로세스가 돌아가야 하기 때문입니다.

 

x_count--는 조건변수에서 나올 때 실행됩니다.


x.signal연산에서의 흐름

내가 wait를 하고있다가 누군가 나를 깨워줬으니 wait(next)에서 빠져나올 수 있습니다.

즉, next에서 기다리는 것이 하나 줄었으니 그 다음에 실행되는 

next_count--를 실행합니다.

 


문제)

wait(x_sem)은 어디서 어디로 갈까요?

왼쪽으로 가야 합니다.

내가(x) 조건변수 안으로 들어갔으니 누군가는 모니터 안으로 들어와야 합니다!

 

signal(next)하면 어떤 조건변수에서 모니터로 들어갈까요?

signal이 가리키는 곳은 next(=s) 입니다.

시그널을 보낸 놈이 들어가는 곳입니다.

 

signal(mutex)하면 어떤 조건변수에서 모니터로 들어갈까요?

e 부분 입니다.

 

 

 

 

조건변수와 세마포의 차이 

근본적인 차이는

모니터 내에서는 하나의 프로세스만 돌아갈 수 있습니다.

세마포는 다른 프로세스를 깨워줘도 깨워준 프로세스는 계속 실행상태가 될 수 있습니다.

 

signal을 해주면 2개의 프로세스가 돌아가게 됩니다.

그런데 모니터는 1개밖에 안됩니다.

 

모니터에서 wait는 기다리는 것입니다.

  • 대기하는 것이 없으면 의미가 없습니다.

 

세마포는 무조건 기다리는 것이 아니고 자원을 점유하는 느낌입니다.

  • 점유할 수 있게 대기하기 위해서 기다리는 것입니다.
  • 자원을 차지하고(wati) 놓아주고(signal) 하는 것입니다.

wait(mutex)에서 signal을 받고

밑의 코드로 내려갑니다.

body of function모니터안에서 작업하는 것입니다.

 

if문 부터는 내가 나갈 때입니다.

 

next에 기다리는 것이 아무것도 없다면

  • wait(mutex)
  • signal(mutex) 

2개만 동작하게 됩니다.


만약 조건변수가 2개이다!

그러면 구현할 때 조건변수(세마포)는 몇 개 필요할까요?

4개 입니다.

 

mutex, next

x_sem1, x_sem2가 될 것입니다.


근대 여기서 대기하고 있는 e,s만 풀어줄까요?

모니터를 signal-and-wait로 구현했기 때문입니다.

아니였습니다.

 

signal-and-continue도 마찬가지로 조건변수를 건들이지 않습니다.

 

왜 조건변수는 안꺼내주냐의 답입니다.

 

 


body of function을 한 후에 조건변수에 대한 signal은 프로그램 논리상하는 것이지 자동으로 하는 것이 아닙니다.

즉, 검은 색 글시는 컴파일러가 만든 것이고

body of function은 사람이 짜는 것입니다. 그래서 조건변수를 signal하는 것을 body of function에 넣을 수도 있습니다.



1번의 답 

mutex = 1이 되야 합니다.

모니터에 들어갈 수 있는 자원의 수는 1개이기 때문입니다.


2번의 답

next의 값은? 이라고 물어보는 것 입니다.

초기값은 0입니다.

처음에 내가 조건변수에 signal을 보내고 내가 wait가 됩니다.

내가 진짜 wait하는 것입니다. wait할 때 next가서 대기하니 처음에는 당연히 0일 것입니다.


3번의 답

next_count의 값은? 이라고 물어보는 것입니다.

(signal을 보낸 착한 애들은 몇명이냐?)

초기값은 0입니다.

 

ex)

지금 next에 들어있는 것이 2개이니 next_count는 2일 것입니다.


4번의 답

0입니다.

조건변수는 0이여야지 wait연산 할 때 바로 기다릴 수 있습니다.


 

3번 입니다.

세마포는 조건변수를 가지고 있지 않습니다.

 


1번 입니다.

자원을 차지하면 자원을 차지한 것 가지고 무언가를 하면 됩니다.

 

교착상태의 개념

 

 

 

 

왜 교착상태가 발생할까요?

이런식으로 자원을 사용하기 때문이빈다.

 

자원 요청에서 다른 프로세스가 사용 중이면 대기하기 때문입니다.

 

교착상태의 예 - 스풀링

동시에 보조기억장치에 대한 작동을 온라인에서 계속 한다.

 

간단히,

입출력을 할 때 디스크를 버퍼로 사용하는 것입니다.

 

 

cpu가 빠른 속도로 밀어내니 프린터가 감당을 못합니다.

그래서 디스크에다가 버퍼를 두는 것입니다.

 

근데 여러 작업을 동시에 디스크에다가 넣을 수 있는대

여기서 교착상태가 나타날 수 있습니다.

 

상황)

cpu는 계속보내고 있습니다

cpu는 이거 했다가 저거했다가 합니다.

버퍼는 좀 모았다가 처리하는것이 의미가 있습니다.

디스크가 더 모을려고 하는대 너무 많이 모여서 프린터에게 전달할 수 없습니다.

ex) file1,2,3,4가 모여야지만 프린터로 나갈 수 있는데 file4가 없으니 나갈 수 없어서 교착상태가 일어납니다.

 

이런식으로 해결할 수 있습니다.

 

728x90

'Computer Science > OS' 카테고리의 다른 글

교착상태 회피하는법  (0) 2021.11.09
교착상태 자세히 보기  (0) 2021.11.08
모니터의 개념과 구조, 구현  (0) 2021.10.26
세마포의 구현 , 모니터의 개념  (0) 2021.10.25
세마포  (0) 2021.10.19