Mutual Exclusion Solutions (OS supported SW solution)
Spinlock
โ ์ ์ ๋ณ์
โ ์ด๊ธฐํ, P(), V() ์ฐ์ฐ์ผ๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅ
- ์ ์ฐ์ฐ๋ค์ indivisible (or atomic) ์ฐ์ฐ
- OS support
- ์ ์ฒด๊ฐ ํ instruction cycle์ ์ํ๋จ
![](https://blog.kakaocdn.net/dn/bIznEZ/btrTGX9y22E/kG3HlOwU7g6l3VmR75L3fK/img.png)
โ P, V ์ฐ์ฐ์ ํตํด active ์ํ๋ฅผ ํ์ธํ๊ณ ์๊ณ์์ญ์ ์ง์ ํ๋ค
ํน์ง
โ ๋ฉํฐ ํ๋ก์ธ์ค ์์คํ
์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
โ Busy waiting
- lock์ ๋๊ธฐํ๋ ๋์ loop๋ฅผ ๋๋ฉด์ busy waiting ์ํ๋ก ๋๊ธฐ
Semaphore
โ 1965๋
Dijkstra๊ฐ ์ ์
โ Busy waiting ๋ฌธ์ ํด๊ฒฐ
โ ์์ด ์๋ ์ ์ํ ๋ณ์(S)
- ์ด๊ธฐํ ์ฐ์ฐ, P(), V()๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅ
- P: Probern(๊ฒ์ฌ)
- V: Verhogen(์ฆ๊ฐ)
โ ์์์ S๋ณ์ ํ๋์ ready queue ํ๋๊ฐ ํ ๋น๋จ
semaphore์ ์ข ๋ฅ
โ Binary semaphore
- S๊ฐ 0๊ณผ 1 ๋ ์ข ๋ฅ์ ๊ฐ๋ง ๊ฐ๋ ๊ฒฝ์ฐ
- ์ํธ๋ฐฐ์ ๋ ํ๋ก์ธ์ค ๋๊ธฐํ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
โ Counting semaphore
- S๊ฐ 0 ์ด์์ ์ ์ ๊ฐ์ ๊ฐ์ง ์ ์๋ ๊ฒฝ์ฐ
- Producer-Consumer ๋ฌธ์ ๋ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ
- ์์ฐ์ - ์๋น์ ๋ฌธ์
์ฐ์ฐ
โ ์ด๊ธฐํ ์ฐ์ฐ: S๋ณ์์ ์ด๊ธฐ๊ฐ์ ๋ถ์ฌํ๋ ์ฐ์ฐ
โ P() ์ฐ์ฐ, V() ์ฐ์ฐ
![](https://blog.kakaocdn.net/dn/55eGa/btrTGZ0DBy6/lNaDETk4Pk212x15kkUMKk/img.png)
โ ์์์ ํ ๋น ๋ฐ์ง ๋ชปํ๋ฉด ready queue(๋๊ธฐ์ค)์์ ๋๊ธฐ
โ ํ๋ก์ธ์ค๊ฐ ๋๊ฐ ๋ ready queue์ ์๋ ํ๋ก์ธ์ค ์ค ํ๋๋ฅผ wake up ์ํจ๋ค!
โ ๋ชจ๋ indivisible ์ฐ์ฐ
- OS support
- ์ ์ฒด๊ฐ ํ instruction cycle์ ์ํ
Semaphore๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๋ค
โ ์ํธ๋ฐฐ์ ๋ฌธ์ (Mutual exclusion)
โ ํ๋ก์ธ์ค ๋๊ธฐํ ๋ฌธ์ (process synchronization problem)
โ ์์ฐ์-์๋น์ ๋ฌธ์ (producer-consumer problem)
โ Reader - writer problem
โ Dining philosopher problem
โ ๊ธฐํ
Mutual exclusion
![](https://blog.kakaocdn.net/dn/oXi9Y/btrTEY9yGcG/ofvy0G2aY9hkmnGRRCYuXK/img.png)
Process synchronization
![](https://blog.kakaocdn.net/dn/cjAdqo/btrTCgiPzEZ/HeIq3sNNk79l9eTNCN34Lk/img.png)
โ Process๋ค์ ์คํ ์์ ๋ง์ถ๊ธฐ
- ํ๋ก์ธ์ค๋ค์ ๋ณํ์ ์ด๋ฉฐ, ๋น๋๊ธฐ์ ์ผ๋ก ์ํ
Producer-Consumer problem
![](https://blog.kakaocdn.net/dn/dk0I0T/btrTEQcMjGu/FmduzzWH1SiiaCmEhnE6Y0/img.png)
โ ์์ฐ์ ํ๋ก์ธ์ค: ๋ฉ์ธ์ง๋ฅผ ์์ฑํ๋ ํ๋ก์ธ์ค ๊ทธ๋ฃน
โ ์๋น์ ํ๋ก์ธ์ค: ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌ๋ฐ๋ ํ๋ก์ธ์ค ๊ทธ๋ฃน
Producer-Consumer problem with Single Buffer
![](https://blog.kakaocdn.net/dn/p3e0A/btrTBJrTeiQ/0076msCdVJ77cXos1ADKJ0/img.png)
โ 2๊ฐ์ ๋ณ์ ์์ฑ (consumed, produced)
โ producer๋ buffer๊ฐ ๋น์ด์๋์ง (consumed) ์ฒดํฌ ํ buffer์ ๋ฉ์ธ์ง(M) ๋ฃ๊ธฐ
โ ์ดํ produced ๋ณ์ 0 -> 1
โ consumer๋ ๋ฉ์ธ์ง๊ฐ ์๋์ง (produced) ํ์ธ
- ์์ผ๋ฉด ๋ฉ์ธ์ง ์๋น ํ cousumed 0 -> 1
- ์์ผ๋ฉด ๊นจ์์ค ๋๊น์ง ready queue์์ ๋๊ธฐ
Producer-Consumer problem with N-Buffer
![](https://blog.kakaocdn.net/dn/M9ZVe/btrTFWDj5JC/8IQ0zzblMM3Wmr9zXYJD5K/img.png)
โ buffer๋ ์ํ ํ ์ฌ์ฉ
![](https://blog.kakaocdn.net/dn/dAIVbQ/btrTGYOa0Wf/PHHte2mS9vN5jrKvK7wQI0/img.png)
โ mutexP: producer / mutexC: consumer -> ์ํธ๋ฐฐ์ ๊ตฌํ
โ nrfull: ์ฐจ ์๋ buffer์ ์ / nrempty: ๋น์ด ์๋ buffer์ ์
โ producer
- producer๋ ์์ฐํ ๋ nrempty๋ฅผ ํตํด์ ๊ณต๊ฐ์ด ์๋์ง(> 0) ํ์ธ
- ๊ณต๊ฐ์ด ์์ผ๋ฉด ๊ณต๊ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ฃ๊ณ ์ํํ์ ์์น ๊ฐฑ์ (์์ผ๋ฉด ready queue)
- nrfull ๋ณ์ ์ฆ๊ฐ
โ consumer
- ์๋นํ ๋ nrfull์ ํตํด ๋ฉ์ธ์ง๊ฐ ์๋์ง(> 0) ํ์ธ
- ๋ฉ์ธ์ง๊ฐ ์์ผ๋ฉด ๋ฉ์ธ์ง๋ฅผ ๊ฐ์ ธ๊ฐ๊ณ ์ํํ ์์น ๊ฐฑ์ (์์ผ๋ฉด ready queue)
- nrempty ๋ณ์ ์ฆ๊ฐ
Reader-Writer problem
โ Reader
- ๋ฐ์ดํฐ์ ๋ํด ์ฝ๊ธฐ ์ฐ์ฐ๋ง ์ํ
โ Writer
- ๋ฐ์ดํฐ์ ๋ํด ๊ฐฑ์ ์ฐ์ฐ์ ์ํ
โ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ ํ์
- reader๋ค์ ๋์์ ๋ฐ์ดํฐ ์ ๊ทผ ๊ฐ๋ฅ
- writer๋ค(๋๋ reader์ writer)์ด ๋์ ๋ฐ์ดํฐ ์ ๊ทผ ์ ์ํธ๋ฐฐ์ (๋๊ธฐํ) ํ์
โ ํด๊ฒฐ๋ฒ
- reader/writer์ ๋ํ ์ฐ์ ๊ถ ๋ถ์ฌ
- reader preference solution
- writer preference solution
reader preference solution
![](https://blog.kakaocdn.net/dn/clKsPa/btrTGaakm6T/fGmvhJf14FJusvYk2PZTC0/img.png)
โ wmutex: writer / rmutex: reader
โ nreaders: reader์ ์
โ Reader
- ์๊ธฐ๊ฐ ์ฒ์ ์ฝ์ ๋ writer ์ํธ๋ฐฐ์
- reader ์ ์ฆ๊ฐ
- ์ฝ๊ธฐ๋ ์ฌ๋ฌ ๋ช ์ด ํด๋ ๋๋ค (์ํธ๋ฐฐ์ x)
- ๋ง์ง๋ง์ผ๋ก ๋๊ฐ ๊ฒฝ์ฐ์ writer ์ํธ๋ฐฐ์ ํด์
ํน์ง
โ No busy waiting
- ๋๊ธฐํ๋ ํ๋ก์ธ์ค๋ block(asleep) ์ํ๊ฐ ๋๋ค
โ seamaphore queue์ ๋ํ wake-up ์์๋ ๋น๊ฒฐ์ ์
- starvation problem
Eventcount / Sequencer
โ ์ํ์ ๋ฒํธํ์ ๋น์ทํ ๊ฐ๋
โ Sequencer
- ์ ์ํ ๋ณ์
- ์์ฑ ์ 0์ผ๋ก ์ด๊ธฐํ, ๊ฐ์ํ์ง ์์
- ๋ฐ์ ์ฌ๊ฑด๋ค์ ์์ ์ ์ง
- ticket() ์ฐ์ฐ์ผ๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅ
โ ticket(S)
- ํ์ฌ๊น์ง ticket() ์ฐ์ฐ์ด ํธ์ถ ๋ ํ์๋ฅผ ๋ฐํ
- indivisible operation
โ Eventcount
- ์ ์ํ ๋ณ์
- ์์ฑ ์ 0์ผ๋ก ์ด๊ธฐํ, ๊ฐ์ํ์ง ์์
- ํน์ ์ฌ๊ฑด์ ๋ฐ์ ํ์๋ฅผ ๊ธฐ๋ก
- read(E), advance(E), await(E, v) ์ฐ์ฐ์ผ๋ก๋ง ์ ๊ทผ ๊ฐ๋ฅ
โ read(E)
- ํ์ฌ Eventcount ๊ฐ ๋ฐํ
โ advance(E)
- E <- E + 1
- E๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ํ๋ก์ธ์ค๋ฅผ ๊นจ์ (wake-up)
โ await(E, v)
- v๋ ์ ์ํ ๋ณ์
- if (E < v)์ด๋ฉด E์ ์ฐ๊ฒฐ๋ Q_E์ ํ๋ก์ธ์ค ์ ๋ฌ(push) ๋ฐ CPU scheduler ํธ์ถ
Mutual exclusion
![](https://blog.kakaocdn.net/dn/0FFNH/btrTGbG3KJ9/32YKXsdgy6lttqkG6oQKf1/img.png)
producer-consumer problem
![](https://blog.kakaocdn.net/dn/YdiO2/btrTIsuG91s/QoQqkNoj8SnClhH5PfdJC1/img.png)
ํน์ง
โ No busy waiting
โ No starvation
- FIFO scheduling for Q_E
โ Semaphore๋ณด๋ค ๋ low-level control(์์ ์์) ๊ฐ๋ฅ
'โญ Group_Study > Operating System' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[4์ฃผ์ฐจ] Deadlock: Deadlock and Resource types (0) | 2022.12.22 |
---|---|
[3์ฃผ์ฐจ] Mutual Exclusion Solutions (Language-Level solution) (0) | 2022.12.21 |
[3์ฃผ์ฐจ] Mutual Exclusion Solutions (SW & HW) (1) | 2022.12.17 |
[3์ฃผ์ฐจ] Process Synchronization and Mutual Exclusion (0) | 2022.12.16 |
[2์ฃผ์ฐจ] Scheduling Algorithms (0) | 2022.12.14 |
๋๊ธ