๊ณต์ ๋ฐ์ดํฐ(Shared data)์ ๋ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผํ๋ฉด data inconsistency๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง: ํ๋ ฅ ํ๋ก์ธ์ค๋ค์ด ๋ฐ๋ฅธ ์์๋ก ์คํ(orderly execution)ํ๋ ๊ฒ์ ๋ณด์ฅํ๋ ๋งค์ปค๋์ฆ์ด ํ์
์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ์์์ ์ ๊ทผํ๋ ์ํฉ. ๋ฐ์ดํฐ์ ์ต์ข ์ฐ์ฐ ๊ฒฐ๊ณผ๋ ๋ง์ง๋ง์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ ํ๋ก์ธ์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- kernel ์ํ ์ค ์ธํฐ๋ฝํธ ๋ฐ์ ์
- Process๊ฐ system call์ ํ์ฌ kernel mode๋ก ์ํ ์ค์ธ๋ฐ context switch๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ
- Multiprocessor์์ shared memory ๋ด์ kernal data
ํ๋ก์ธ์ค(์ฐ๋ ๋)๊ฐ ๊ณต์ ์์์ ๋ณ๊ฒฝํ ์ ์๋ ์ฝ๋ ๋ถ๋ถ
-
Mutual Exclusion(์ํธ๋ฐฐ์ ): ํ๋ก์ธ์ค๊ฐ CS ๋ถ๋ถ์ ์ํ ์ค์ด๋ฉด ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์ค๋ค์ ๊ทธ๋ค์ CS์ ๋ค์ด๊ฐ๋ฉด ์๋๋ค.
-
Progress(์งํ): ์๋ฌด๋ CS์ ์์ง ์์ ์ํ์์ CS์ ๋ค์ด๊ฐ๊ณ ์ ํ๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด CS์ ๋ค์ด๊ฐ๊ฒ ํด์ฃผ์ด์ผ ํ๋ค.
-
Bounded Waiting(ํ์ ๋๊ธฐ): ํ๋ก์ธ์ค๊ฐ CS ์ง์ ์ ์์ฒญํ ํ์ ์์ฒญ์ด ํ์ฉ๋ ๋๊น์ง ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ CS ์ง์ ์ด ํ์ฉ๋๋ ํ์์ ์ ํ์ด ์์ด์ผ ํ๋ค. -> ๊ทธ ์ด๋ค ํ๋ก์ธ์ค๋ CS ์ง์ ์ ์์ํ ๊ธฐ๋ค๋ฆฌ์ง ์์์ผ ํ๋ค.
Higher-level software tools: Mutex Locks, Semaphores, Monitors ๋ฑ
CS์ ๋ค์ด๊ฐ๊ธฐ์ ์ lock์ ํ๋ํ๊ณ , ๋์ฌ๋๋ lock์ ๋ฐํํ๋ค.
-
ํน์ง
-
Locking ๋ฉ์ปค๋์ฆ์ผ๋ก ์ค์ง ํ๋์ ํ๋ก์ธ์ค๋ ์ค๋ ๋๋ง์ด ๋์ผํ ์์ ์ mutex๋ฅผ ์ป์ด CS์ ๋ค์ด์ฌ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ํ๋ก์ธ์ค๋ ์ค๋ ๋๋ง์ด CS๋ฅผ ๋ฒ์ด๋ ๋ mutex๋ฅผ ํด์ ํ ์ ์๋ค.
-
acquire()๊ณผ release()๋ atomic ํด์ผํ๋ค.
-
Busy Waiting: CS์ ๋ค์ด๊ฐ๊ธฐ ์ํด์ ๊ณ์ํด์ acquire()๋ฅผ ํธ์ถํ๋ ๋ฐ๋ณต๋ฌธ์ ์คํํ๋ค. -> lock์ด ๊ฐ์ฉํด์ง๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉด์ ํ๋ก์ธ์ค๊ฐ ๊ณ์ ๋ฐ๋ณต ํ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ spinlock์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํ๋ค.
-
but ๋ฉํฐํ๋ก์ธ์ ์์คํ ์์ ํ๋ก์ธ์ค๊ฐ ๊ณ์ ์ผ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ Context Switching์ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์ฅ์ ์ด ๋ ์๋ ์๋ค. -> ํ๋ก์ธ์ค๋ค์ด ์งง์ ์๊ฐ ๋์ Lock์ ์์ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด mutex๊ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์๋ค.
- Busy Waiting์ด ์๋ Mutex Lock: Test and Set์ ์ฌ์ฉ
- Test and Set: ํ๋์จ์ด์ ์ผ๋ก atomicํ๊ฒ ์ํํ ์ ์๋๋ก ํ๋ค.
- lock์ ํ๋ํ์ง ๋ชปํ๋ฉด ํ๋ก์ธ์ค๋ lock์ ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ์ํ๋ก ์ ํํ๊ณ CPU๋ฅผ ๋ด์ด ๋์
-
-
semaphore S: ์ฌ์ฉ ๊ฐ๋ฅํ ํน์ ์์์ ๊ฐ์
-
Semaphore ์ฐ์ฐ
- P operation(wait(S), acquire(S))
- V operation(signal(S), release(S))
-
Signaling ๋ฉ์ปค๋์ฆ์ผ๋ก lock์ ๊ฑธ์ง ์์ ์ค๋ ๋๋ Signal์ ๋ณด๋ด lock์ ํด์ ํ ์ ์๋ค.
-
์ฉ๋
- ์ํธ ๋ฐฐ์ (mutual exclusion) -> binary semaphore
- ์ ํ ๊ฐ์์ ์์ ์ ๊ทผ, ํ์ ๋ concurrency -> counting semaphore
-
semaphore ๊ฐ: 0 ๋๋ 1(1๋ก ์ด๊ธฐํ); S=1: unlock, S=0: lock
-
์๊ณ๊ตฌ์ญ ์ ๊ทผ ์ ์ด์ ์ฌ์ฉ
- semaphore ๊ฐ: ๊ฐ์ฉ ์์ ๊ฐ์๋ฅผ ์๋ฏธ(์ต๋ ๊ฐ์ฉ ์์ ๊ฐ์๋ก ์ด๊ธฐํ)
- ์ ํ ๊ฐ์์ ์์์ ์ ๊ทผ ์ ์ด์ ์ฌ์ฉ
- Busy Waiting์ด ์๋ค.(spin lock)
- semaphore๋ฅผ ์ด์ฉํ ๋๊ธฐํ
-
Busy Waiting์ด ์๋ Semaphore
-
Busy Waiting์ด ์๋ Semaphore
- Block & Wakeup ๋ฐฉ์(sleep lock)
- semaphore ๊ฐ์ ๋จผ์ ๊ฐ์ -> ์์๊ฐ ๊ฐ๋ฅํ๋ค.
- ์์์ ํฌ๊ธฐ๋ semaphore๋ฅผ ๋๊ธฐํ๋ ํ๋ก์ธ์ค๋ค์ ๊ฐ์์ด๋ค.
- ๋ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ semaphore์ ๋ํด P ๋๋ V ์ฐ์ฐ์ด ์ค์ฒฉ๋์ด ์คํ๋์ง ์๋๋ก ํด์ผํ๋ค.(atomic ์คํ)
์ํธ ๋ฐฐ์ ๋ฅผ ์ ๊ณตํด์ฃผ๋ ๊ณ ์์ค์ ๋๊ธฐํ ์ถ์ํ ๋ฐ์ดํฐํ(ADT)
- semaphore์ ๋จ์ ์ ๊ทน๋ณต. ex) wait()์ signal() ์ฐ์ฐ์ ์์ ์ค๋ฅ๊ฐ ์์ ์ ์๋ค.
- monitor ์์๋ shared data์ ๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ procedure๋ฅผ ์ ์ํด๋๊ณ ํด๋น shared data๋ procedure๋ฅผ ํตํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
- monitor๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ์ procedure๋ค์ ๋์์ ์คํํ ์ ์๋๋ก ํ๋ค.
- monitor ๋ด์์๋ ํ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง์ด ํ๋ ๊ฐ๋ฅํ๋ค.
- ํ๋ก๊ทธ๋๋จธ๊ฐ lock์ ๊ฑธ ํ์๊ฐ ์๋ค. vs semaphore
- condition variable(ํ๋ก์ธ์ค๊ฐ monitor ์์์ ๊ธฐ๋ค๋ฆด ์ ์๋๋ก ํด์ค๋ค.)์ด ์ฌ์ฉ๋๋ค. -> wait()์ signal() ์ฐ์ฐ์ ์ํด์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- wait() ๋ฅผ ํธ์ถํ ์ฐ์ฐ์ ํ๋ก์ธ์ค๋ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ signal() ์ ํธ์ถํ ๋๊น์ง ์ผ์ ์ค์ง(suspend) ๋๋ค.
- signal() ์ฐ์ฐ์ ์ ํํ ํ๋์ ํ๋ก์ธ์ค๋ง ์ฌ๊ฐ์ํจ๋ค. ์ผ์ ์ค์ง๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ์๋ฌด๋ฐ ์ํฅ์ด ์๋ค.