Day17 - jeremy0405/Codesquad_CS GitHub Wiki
ํ๋ก์ธ์ค ๋๊ธฐํ
Race Condition
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ์ฐ์ฐ์(CPU or Process)๊ฐ ๋ง์ ๊ฒฝ์ฐ Race Condition์ด๋ผ๊ณ ํ๋ค. ์ด ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ์ฝ๋ ์์ญ(Critical-Section)์์ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ๋ง๊ฐ์ง๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํ๋ค.
OS์์ Race Condition์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ
- kernel ์ํ ์ค ์ธํฐ๋ฝํธ ๋ฐ์ ์
- Process๊ฐ system call์ ํด์ kernel mode๋ก ์ํ ์ค์ธ๋ฐ context switch๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ
- Multiprocessor์์ shared memory ๋ด์ kernel data
์์ 1, 2 ์ํฉ์์์ Race condition ํด๊ฒฐ๋ฒ
โ ์ธํฐ๋ฝํธ๊ฐ ๋ค์ด ์๋ ์ค์์์ (์ปค๋์์ ) ๋๋ธ ํ์ ์ธํฐ๋ฝํธ๋ฅผ ์ฒ๋ฆฌํจ
3 ์ํฉ์์์ Race condition ํด๊ฒฐ๋ฒ
- ํ๋ฒ์ ํ๋์ CPU๋ง ์ปค๋์ ๋ค์ด๊ฐ ์ ์๋๋ก ํจ โ ์์ฒญ ๋นํจ์จ์ ์ด๋ผ์ ์ฌ์ฉํ์ง ์์
- ํ๋์ CPU๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ํ๋ผ๋ฉด lock์ ๊ฑธ์ด์ ๋ค๋ฅธ CPU๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ก ํจ
Critical section ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์ ๋ง์กฑํด์ผ ํ ์กฐ๊ฑด 3๊ฐ์ง
- Mutual Exclusion (์ํธ ๋ฐฐ์ )
- ํ๋ก์ธ์ค ํ๋๊ฐ critical section์ ๋ค์ด๊ฐ๋ฉด ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ค์ด๊ฐ์ง ๋ชปํ๊ฒ ํ๋ ๊ฒ
- Progress
- ์๋ฌด๋ critical section์ ๋ค์ด๊ฐ ์์ง ์๋ค๋ฉด ๋ค์ด๊ฐ๊ฒ ํ๋ก์ธ์ค๊ฐ ํ๋๋ง ๋ค์ด๊ฐ๊ฒ ํ๋ฝํด์ฃผ๋ ๊ฒ
- Bounded Waiting
- ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ด ์ ํํด์ผ ํจ (์ธ์ ๊ฐ critical section์ ๋ค์ด๊ฐ๊ฒ ํด์ค์ผ ํจ)
- critical section์ ๋ค์ด๊ฐ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๊ฐ 3๊ฐ์ผ ๋ 1 2 ๋ฒ ํ๋ก์ธ์ค๋ง ๊ณ์ ์๋ค๊ฐ๋คํ๊ณ 3๋ฒ์ด ๋ชป๋ค์ด๊ฐ๋ Starvation ํ์์ด ๋ฐ์ํจ
Critical-Section์ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ
-
int turn
์ ๊ฐ์ง๋ ๋ฐฉ๋ฒ โ ์์ ๋ค์ด๊ฐ๋ ํ๋ก์ธ์ค๊ฐ turn์ ๋ค์ ํ๋ก์ธ์ค ์ฐจ๋ก๋กค ๋ฐ๊พธ๊ณ ๋๊ฐ์ฃผ๋ฉด ์์ ์ turn์ด ๋๋ฉด ๋ค์ด๊ฐ๋ฅ ๋ฐฉ์์ผ๋ก Critical-Section์ ํ๋์ ํ๋ก์ธ์ค๋ง ๋ค์ด๊ฐ๋๋ก ํจโ turn์ ๋ด ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ค์ผ ๋ด๊ฐ ๋ค์ด๊ฐ ์ ์์ โ ์๋ฌด๋ critical section์ ๋ค์ด๊ฐ์ง ์์๋ค๋ฉด turn์ ๋๊ฐ ๋ด ๊ฐ์ผ๋ก ๋ณ๊ฒฝํด์ค?? โ Progress ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํจ
-
boolean flag[]
๋ฅผ ๊ฐ์ง๋ ๋ฐฉ๋ฒโ ๋ด๊ฐ ๋ค์ด๊ฐ๊ณ ์ถ์ผ๋ฉด ์์ ์ flag๋ฐฐ์ด์ ture๋ก ๋ง๋ ์ดํ flag๋ฐฐ์ด์ ๋ชจ๋ ๋ค ๋ณธ ํ์ ์์ ์ ์ ์ธํ ๊ฒ๋ค์ด ๋ชจ๋ false์ผ๋๋ง critical section์ ๋ค์ด๊ฐ.
โ ๋ง์ฝ ๋ค๋ฅธ์ ๋ true๋ฅผ ๋ค๊ณ ๋์์ ๋๋ true๋ฅผ ๋ค๊ฒ ๋๋ค๋ฉด Progress์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํจ
-
1, 2 ๋ฐฉ๋ฒ์ ์งฌ๋ฝ
int turn
๊ณผboolean flag[]
๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์์.์๋๋ฐฉ์ด ๊น๋ฐ์ ๋ค๊ณ ์๊ณ ์๋๋ฐฉ ์ฐจ๋ก์ด๋ฉด ๊ธฐ๋ค๋ฆผ
์๋๋ฐฉ์ด ๊น๋ฐ์ ๋ค๊ณ ์์ง๋ง ๋ด ์ฐจ๋ก์ด๋ฉด ๋ด๊ฐ ๋ค์ด๊ฐ
โ Busy Waiting(spin lock) ๋ฌธ์ ๋ด ์ฐจ๋ก๋ฅผ ํ์ธํ ๋ ค๊ณ
while(1)
์ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ฉด์ ๊ณ์ ๋์ ๊ฐ์ ์ฒดํฌํด์ผ ํ๋ค. โ CPU์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ ๋ญ๋นํ๋ ๊ฒ
์์ ์๊ณ ๋ฆฌ์ฆ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ํ๋ก๊ทธ๋๋ฐ ์ฝ๋๋ก์จ Software์ ์ผ๋ก ํด๊ฒฐํ๋ ค๋ ๊ฒ์ด๋ค.
Critical section ๋ฌธ์ ๋ฅผ Hardware๋ก ํ๋ฉด ๊ต์ฅํ ์ฝ๊ฒ ํ ์ ์๋ค.
Hardware์ ์ผ๋ก Critical section์ ํธ๋ ๋ฐฉ๋ฒ
- Test & Set
- ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์์ ๊ณผ ์ฐ๋ ์์ ์ ๋์์ ์ํํ๋๋ก ํ๋์จ์ด๊ฐ ์ง์ํ๋ค. ๋ฐ๋ผ์ ๋๊ตฐ๊ฐ ์ฝ๊ณ ์์ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์์ ์ ํด์ ๋ฐ์ดํฐ์ ์์ค์ ์ ๋ฐํ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์์ฒ ์ฐจ๋จํ๋ค.
- ๋ค์ด๊ฐ๊ธฐ ์ ์ ๊ฐ์ ์ฝ์ ๋๋ ๋ฌด์กฐ๊ฑด ์ฝ๊ณ 1๋ก ์ธํ ํ๊ณ ์ฒ๋ฆฌ ๋คํ๊ณ ๋๊ฐ ๋ ๊ฐ์ 0์ผ๋ก ๋ฐ๊ฟ์ค
์์์ Software, Hardware์ ์ผ๋ก Critical Section์ ์์ ํ๊ฒ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๊ณต๋ถํด๋ณด์๋๋ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ํญ์ Critical Section์ ๋ค๋ฃจ๊ธฐ ์ํด์ ์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ต์ฅํ ํ๋ ์ผ์ด๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋๋จธ๋ค์ ์ํด์ Semaphore ๋ผ๋ ์ถ์์๋ฃํ์ด๋ Monitor๋ผ๋ ๊ฒ์ ํตํด์ Critical Section์ ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
Semaphore
Semaphore โ ์ถ์์๋ฃํ = ์ค๋ธ์ ํธ + ์คํผ๋ ์ด์
ํ๋ก๊ทธ๋๋จธ๊ฐ ์ถ์์ ์ผ๋ก Semaphore์ ํตํด์ ๋จ์ํ ์ฝ๋ฉ์ ํ ์ ์๊ฒ ๋๋ค.
Semaphore :
- Object : Integer variable (์์์ ๊ฐ์) โ ํ ๋น ํ ์ ์๋ ์์์ ๊ฐ์
- ๋ง์ฝ Object์ Integer variable์ด 3์ด๋ฉด ํd๋ฒ์ 3๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผ ๊ฐ๋ฅ
- Object๊ฐ 0 ๋๋ 1๋ง ๊ฐ์ง ์ ์๋ ๊ฒฝ์ฐ : Binary Semaphore (=mutex) type
- Object๊ฐ 0 ์ด์์ ์์์ ์ ์ ๊ฐ : Counting Semaphore type
- operation : P ์ฐ์ฐ๊ณผ V์ฐ์ฐ (atomic ์ฐ์ฐ 2๊ฐ)์ผ๋ก ๊ตฌ์ฑ๋์ด ์์
- P ์ฐ์ฐ : ๋ฐ์ดํฐ lock (์์ ํ๋ ํ lock์ด๋ฏ๋ก ์์์ ํ๋ํ๋ ๊ณผ์ )
- V ์ฐ์ฐ : ๋ฐ์ดํฐ unlock (์์ ๋ฐ๋ฉ ๊ณผ์ + ํน์ ๋๊ธฐ์ ์๋ค๋ฉด ๊นจ์์ค)
Semaphores๋ฅผ ๊ตฌํํ๋ ๋ฐ์ ์์ด์ 2๊ฐ์ง ๋ฐฉ์์ด ์์
- busy-waiting(=spin lock) ๋ฐฉ์ โ CPU๋ฅผ ์ก๊ณ while๋ฌธ์ ๊ณ์ ๋๋ฉด์ ๊ธฐ๋ค๋ฆผ
- Block/Wake up(=sleep lock) ๋ฐฉ์ โ ๋ฆฌ์คํธ์ ์ฌ์ด ์ํ(CPU๋ฅผ ๋ฐ๋ฉ)๋ก ๋ด๊ณ ์์์ค๋ฉด ๊นจ์์ค
2๊ฐ์ง ๋ฐฉ๋ฒ ์ค ๋ฌด์์ด ๋ ์ข์๊น?
๋น์ฐํ Block/Wake up ๋ฐฉ์์ด ํจ์ฌ ํจ์จ์ (blocked๋ก ๋ง๋ค์ด์ CPU๋ฅผ ๊ณ์ ๋ค๊ณ ์์ง ์๊ธฐ ๋๋ฌธ)
ํ์ง๋ง ํ๋ก์ธ์ค์ ๊ธธ์ด๊ฐ ๋๋ฌด ์งง์ ๊ฒฝ์ฐ์๋ blocked, wake ํ๋ context switch ๋๋ฌธ์ ๋นํจ์จ์ ์ผ ๋๋ ์์ง๋ง ๋ณดํต์ ํญ์ ํจ์ฌ ํจ์จ์ ์
Semaphore์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์
- Deadlock ํ์
-
ํ๋์ ํ๋ก์ธ์ค๊ฐ A๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ B๋ฐ์ดํฐ์ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ค๊ณ ํ ๋ ๋ ๋ถ๋ถ ๋ชจ๋ ๋ค cpu๋ฅผ ํ๋ํด์ ์ผ์ ํด์ผ ํ๋๋ฐ process1์ด A์ ์ ๊ทผํ๊ณ B์์ ๋๊ธฐ์ค์ด๊ณ process2๊ฐ B์ ์ ๊ทผํ๊ณ A์ ์ ๊ทผํ๊ณ ์์ผ๋ฉด ํ์ ๋ฌดํ ๋๊ธฐ ์ํ์ ๋น ์ง.
โ ์์์ ํ๋ํ๋ ์์๋ฅผ ๋ง์ถฐ์ฃผ๋ฉด Deadlock ํ์์ ํด๊ฒฐํ ์ ์์
โ A๋ฐ์ดํฐ์ ๋ฌด์กฐ๊ฑด ๋จผ์ ์ ๊ทผํ ์ดํ์ B๋ฅผ ์ ๊ทผํ๋๋ก
- Starvation ํ์ (Deadlock๋ Starvation์ ์ผ์ข )
- ํน์ ํ๋ก์ธ์ค๋ค๋ง ์์์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ๊นจ์ฐ์ง ์๊ณ ์๊ธฐ๋ค๋ผ๋ฆฌ๋ง ๋ค์ด๊ฐ๋ค๊ฐ ๊นจ์ฐ๊ณ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํจ.
Semaphore ์์ฒด์ ๋ฌธ์ ์
- ์ฝ๋ฉ์ด ์ด๋ ค์
- ์์ฑํ ์ฝ๋์ ์ ํ์ฑ ์ ์ฆ์ ํ๊ธฐ๊ฐ ํ๋ฌ
- ํ๋ฒ์ ํ๋ก๊ทธ๋๋จธ์ ์ค์๊ฐ ์์คํ ์ ์น๋ช ์ ์
โ Monitor๋ฅผ ํตํด์ ํด๊ฒฐํ ์ ์์
Monitor
๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๊ธฐ ์ํด์๋ Monitor์ ๋ด๋ถ์ ํ๋ก์์ ๋ฅผ ํตํด์๋ง ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋๋ก ํ๋ ๊ฒ
๋ชจ๋ํฐ๊ฐ ์์ฒ์ ์ผ๋ก ๋ชจ๋ํฐ ๋ด๋ถ์ ์๋ ํ๋ก์์ ๋ ๋์์ ์คํ๋์ง ์๋๋ก ํจ
โ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๋ฝ์ ๊ฑธ ํ์๊ฐ ์์ด์ง
โ ๊ต์ฅํ ์ฅ์ !! โ ๋ณดํต ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฝ์ ๊ฑธ๊ณ ํธ๋ ๊ณผ์ ์์ ์ค์๊ฐ ๋ง์๋ฐ ์ด๋ฐ ์ค์๋ฅผ ์์จ ์ ์์
์์์ ๊ฐ์๋ Monitor๋ ์์์ผ ํ๊ธฐ ๋๋ฌธ์
variable์ ํตํด์ ์์์ ๊ฐ์๋ฅผ ์ ์ฅํด๋์.
condition variable์ ํ์ฌ signal()
, wait()
์ ์ฐ์ผ ์ํ๋ง์ ๊ฐ์ง๊ณ ์์
buffer[N] โ ์์์ ๊ฐ์
condition full, empty; โ ์ปจ๋์
์ ๋ํ๋ด๋ ๋ณ์, ๊ฐ์ ๊ฐ์ง์ง ์๊ณ signal()
, wait()
์ ์ฐ์ผ ์ํ๋ง์ ๊ฐ์ง๊ณ ์์.