모니터도 기말!
시그널을 보내면 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가 없으니 나갈 수 없어서 교착상태가 일어납니다.
이런식으로 해결할 수 있습니다.
'Computer Science > OS' 카테고리의 다른 글
교착상태 회피하는법 (0) | 2021.11.09 |
---|---|
교착상태 자세히 보기 (0) | 2021.11.08 |
모니터의 개념과 구조, 구현 (0) | 2021.10.26 |
세마포의 구현 , 모니터의 개념 (0) | 2021.10.25 |
세마포 (0) | 2021.10.19 |