๋ณด๋ฌ์์ผ๋ฉด ๊ณต๊ฐ๋๋ฅด๊ณ ๊ฐ์ ใ ์กํ์ธ ํ์ดํ ใ ใ ใ
13.1 ๋ณ๋ ฌ ์ฒ๋ฆฌ ์๊ฐ
๋ณ๋ ฌ ์ฒ๋ฆฌ
- ๋ค์์ ํ๋ก์ธ์๋ค์ด ์ฌ๋ฌ ํ๋ก๊ทธ๋จ๋ค ๋๋ ํ ํ๋ก๊ทธ๋จ์ ๋ถํ ๋ ๋ถ๋ถ๋ค์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ธฐ์
์ปดํจํฐ ์์คํ ๋ถ๋ฅ (Flynn์ ๋ถ๋ฅ)
- SISD
- SIMD(๋๊ฐ์ ์ฐ์ฐ, ์ฌ๋ฌ ๋ฐ์ดํฐ) : ๋ณ๋ ฌ ์ฒ๋ฆฌ
- MISD
- MIMD(์ฌ๋ฌ ์ฐ์ฐ, ์ฌ๋ฌ ๋ฐ์ดํฐ) : ๋ณ๋ ฌ ์ฒ๋ฆฌ
ํ๋ก์ธ์๋ค์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์ : MIMD
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (shared memory architecture)
- ๋ถ์ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ (distributed memory architecture)
๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ํธ ์ฐ๊ฒฐ๋ง / ๋ฒ์ค, ํฌ๋ก์ค๋ฐ ์ค์์น..
- ์ฌ๋ฌ ํ๋ก์ธ์์์ ๊ฐ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(critical section) ์ฝ๊ฑฐ๋ ์ธ ๋ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
- (ํ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ด ์ฐ๋ ๋๋)
๋ถ์ฐ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
- ํ๋ก์ธ์๋ง๋ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ์ํธ ์ฐ๊ฒฐ์ํจ ๊ตฌ์กฐ
- (๋ฉ์ธ์ ์๋ ๋ฐ์ดํฐ๋ค์ ๊ฐ์ ํ๋ก์ธ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์์ ๊ฐ์ ์ฐ๋ ๋๋)
13.2 ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ธ ๊ฐ์ง ์ ํ ๋ฐฉ๋ฒ
- ์์ ๋ฉ์ด : ๋ช ๋ น์ด ์์ค์ ๋ณ๋ ฌ์ฑ : ์ ์ ํ๋ก์ธ์ค ์์ฑ ์ ์ง ์ค๋ฒํค๋
- ์ค๊ฐ ๋ฉ์ด : ํ๋ก์์ ์์ค์ ๋ณ๋ ฌ์ฑ
- ํฐ ๋ฉ์ด : ํ๋ก๊ทธ๋จ ์์ค์ ๋ณ๋ ฌ์ฑ : ๋ณ๋ ฌ์ฑ ๋ถ์ฌ ๊ธฐํ ์๋ฉธ (ํ๋๋ง๋)
13.3 ์ธ๋งํฌ์ด
Process
- Terminate : ์ ํด์ง ์๊ฐ ์์ ์๊ณ๊ตฌ์ญ ์คํ์ ๋๋
- Fair Scheduling : ํ์ ๋ ์๊ฐ ์์ ์๊ณ๊ตฌ์ญ์ ๋ค์ด๊ฐ
์๊ณ ๊ตฌ์ญ (Critical region)
- ์ด๋ค ํ์คํฌ์ ์ผ๋ถ๋ถ์ผ๋ก, ์ด ๋ถ๋ถ์ ์คํ ์ค์ผ ๋ ์ด ํ์คํฌ์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋ค๋ฅธ ํ์คํฌ๋ค์ ์คํ์ด ๊ธ์ง๋๋ค.
- ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ๊ณต์ ํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์น (๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ผ๋ ๋์ค๋๊ฑฐ๊ฒ ๋ค)
Mutual Exclusion (์ํธ ๋ฐฐ์ )
- ํ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผ ์ค์ผ ๋, ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ ๊ทผ์ ์ ํํ๋ ๊ฒ
์ธ๋งํฌ์ด (Semaphor)
-๋ ๊ฐ ์ด์์ ํ์คํฌ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ- ์์์ ์ ๊ทผ์ ํ๋ก์จ ์ ์ดํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ.
๊ทธ๋ฌ๋ ์ด๋ ํ ์๊ฐ์ ์ค์ง ํ๋์ ํ์คํฌ๋ง์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ๋ค์ต์คํธ๋ผ ๊ฐ๋ฐ, Algol 68
- ์๊ณ ๊ตฌ์ญ์์์ Mutual Exclusion์ ๋ณดํธํด์ค๋ค.
- ํ๋ก์ธ์ค๊ฐ ํธ์ถ ๊ฐ๋ฅํ primitives(๊ธฐ๋ณธํจ์)
- binary valued variable : 0๊ณผ 1๋ก ๊ตฌ๋ถ. ํด๋น ์์ ์ฌ์ฉ ๋ถ๊ฐ/๊ฐ๋ฅ
wait(s) : if s = 1 then s:= 0 else ํ๋ก์ธ์ค P๋ฅผ ๋๊ธฐํ์ ๋ฃ์
signal(s) : if queue!= empy then ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค ์คํ์ค๋น else s:=1
wait(0) ์ธ ๊ฒฝ์ฐ๋ ์ฌ์ฉ๋ถ๊ฐ์ธ ์ํฉ์ด๋ฏ๋ก ํ๋ก์ธ์ค๋ฅผ ํ์ ๋ฃ๊ณ ๋๊ธฐํ๋ค. wait(1) ์ธ ๊ฒฝ์ฐ๋ ์ฌ์ฉ๊ฐ๋ฅํ ์ํฉ์ด๋ฏ๋ก s:=0 ์ผ๋ก ๋ฐ๊พธ๊ณ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค.
signal(s) ๋ s ๊ฐ์ ๋ฌด๊ดํ๊ฒ ํ์ ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค๊ฐ ์๋์ง ์๋์ง์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. ํ์ ์์ผ๋ฉด ํ๋ก์ธ์ค ์คํ์ค๋น๋ฅผ, ํ์ ์์ผ๋ฉด ์ฌ์ฉ๊ฐ๋ฅํ ์ํฉ์ด๋ฏ๋ก s:=1์ผ๋ก ๋ฐ๊พผ๋ค. -> ๊ทธ๋ฅ ๋จ์ํ๊ฒ s๊ฐ์ ๋ฐ๋ผ 0์ธ์ง 1์ธ์ง ์ ํธ๋ฅผ ๋ณด๋ด๋ ์ญํ ..?
Counting semaphore
- ๊ณต์ ์์์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ์ผ๋, ์ด๋ค ์๊ฐ์ ์ฌ์ฉํ ์ ์๋ ์์์ ๊ฐ์๋ฅผ ๋ํ
- integer ๋ณ์ ํ๋ ์ ์ธํด๋๊ณ ๊ฑฐ๊ธฐ์ ํ์ฌ ์ฌ์ฉ๊ฐ๋ฅํ ์์ ๊ฐ์ ์ ์ฅํด๋์
Down mutex : ํ๋ก์ธ์ค P๊ฐ ๊ณต์ ์์์ ํ๊ฐ ์ด์ฉํ๊ณ ์ ํ ๋ ํธ์ถ
if mutex == 0 then ํ๋ก์ธ์ค P๋ฅผ ๋๊ธฐํ์ ๋ฃ์ else mutex := mutex - 1
โ
Up mutex : ํ๋ก์ธ์ค P๊ฐ ๊ณต์ ์์ ์ด์ฉ์ ๋๋์ ๋
if queue == empty then mutex := mutex + 1 else ๋๊ธฐ์ค์ธ ํ๋ก์ธ์ค ์คํ
๊ทธ๋ฌ๋๊น.. ์๋ฅผ ๋ค์ด mutex ๊ฐ์ 50์ผ๋ก ์ ํด๋๊ณ ์์. ๊ณต์ ์์์ ํ๋ ์ฌ์ฉํ๋ฉด 49๊ฐ ๋จ์. ๋ค ์ฌ์ฉํ๋ฉด ๋ค์ ๋ฐ๋ฉํด์ ๋ค์ 50๊ฐ๋ก.