์ปดํจํฐ ์์คํ
์์์ ๋ฐ์ดํฐ๊ฐ ์ ๊ทผ๋๋ ํจํด
-> ์ ์ฅ๋ ๊ณณ์ด ์์ ๊ฑฐ๊ณ ๊ทธ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์์ ์ฐ์ฐ์ ํด์ ์ฐ์ฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ ์์น์ ์ ์ฅํ๋ค.
์ฝ๊ธฐ๋ง ํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์์ ์ฐ์ฐ์ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ ์ฅํ๋ ๊ณผ์ ์ ๋๊ฐ ๋จผ์ ์ ์ฅํ๋๋์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์๊ณ ๊ทธ ๋ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ synchonization๋ฌธ์ ๋ผ๊ณ ํ๋ค.
Storage box๋ฅผ ์ฌ๋ฌ Excution box๊ฐ ๊ณต์ ํ๋ค๊ณ ํ๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธธ๊น?
-> count++๊ฒฐ๊ณผ๊ฐ ๋ฐ์๋๊ธฐ ์ ์ count--๊ฐ ์คํ๋๊ณ count++ ๋ฐํํ count--๊ฐ ๋ฐํ๋๋ค๋ฉด count++์ ์คํ๋์ง ์์ ๊ฒ๊ณผ ๊ฐ๊ฒ ๋๋ค. (1๋บ๊ฑฐ๋ง ๋ฐ์)
ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ Race Condition์ด๋ผ๊ณ ํ๋ค.
process๋ ์ผ๋ฐ์ ์ผ๋ก ์๊ธฐ ์ฃผ์๊ณต๊ฐ๋ง ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ Race Condition์ด ๋ฐ์ํ์ง ์๋๋ค
-> ๊ทธ๋ฌ๋ ์ด์์ฒด์ ์ ์์ฒญํด์ผ ํ๋ ๋ถ๋ถ์ ๋ํด์๋ ์์คํ
์ฝ์ ํ๋ค.
-> ์ปค๋์ ์ฝ๋๊ฐ ๊ทธ ํ๋ก์ธ์ค๋ฅผ ๋์ ํด์ ์คํ์ด ๋๊ณ
-> ์ปค๋์ ์ฝ๋๊ฐ ์คํ๋๋ค๋ ์๋ฏธ๋ ์ปค๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ค๋ ์๋ฏธ์ด๋ค.
-> ์ปค๋์ ์ฝ๋๋ฅผ ์คํํ๋ ๋์ค ๋ค๋ฅธ process์๊ฒ CPU๊ฐ ๋์ด๊ฐ๊ฒ ๋์ ๋
-> ์ด ์น๊ตฌ ์์คํ
์ฝ์ ํด์ ์ปค๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์ ์๋ค
-> Race Condition ๋ฐ์
์ปค๋์ ์ฝ๋๊ฐ ์คํ์ค์ผ ๋ interrupt๊ฐ ๋ฐ์ํ ์ ์๋ค.
-> ํ๋ ์ผ์ ์ค์งํ๊ณ interrupt๋ฅผ ์ฒ๋ฆฌํ๋ค.
-> interrupt๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋ ๋ํ ์ปค๋์ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ Race Condition์ด ๋ฐ์ํ๋ค.
์ ์ ๋ ๋ฒจ์์ ๋ณ ์ผ์ด ์์ง๋ง ์ปค๋์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค.
๊ณ ๊ธ์ธ์ด๋ก ๋ 1์ฆ๊ฐ์ํค๋ ๋ฌธ์ฅ์ด CPU๋ด๋ถ์์๋ ์ฌ๋ฌ๊ฐ์ instruction์ผ๋ก ์คํ๋๋ค.
-> ๋ฉ๋ชจ๋ฆฌ์ ์๋ count๋ผ๋ ๋ณ์ ๊ฐ์ CPU์์ register๋ก ๋ถ๋ฌ๋ค์ด๊ณ ๊ฐ์ 1์ฆ๊ฐ ์ํจ ํ register์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ ์ฌ๋ ค๋๋ค.
๋ฐ์ดํฐ๋ฅผ register๋ก ์ฝ์ด๋๋ฆฐ ์์ ์์ interrupt๊ฐ ๋ค์ด์์ ๋ ์์
์ ๋ฉ์ถ๊ณ ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ๋ฃจํด์ผ๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
-> interrupt handler ๋ํ ์ปค๋ ์ฝ๋์ด๊ธฐ ๋๋ฌธ์ count--๋ฅผ ์ ๊ทผ ํ ์ ์๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋?
-> ์ค์ํ ๋ณ์๋ฅผ ๊ฑด๋ค์ด๊ณ ์๋ ์ํฉ์์๋ interrupt๊ฐ ๋ค์ด์๋ interrupt ์ฒ๋ฆฌ๋ฃจํด์ผ๋ก ๋ณด๋ด์ง ์๋๋ค. (instruction์ด ๋๋ ํ ์ฒ๋ฆฌ ํ ์ ์๋๋ก ํ๋ค.)
์ด์์ฒด์ ์๊ฒ ํน์ ์๋น์ค๋ฅผ ๋ถํํ๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
process๋ง๋ค CPU ํ ๋น์๊ฐ์ด ์กด์ฌํ๊ณ ๊ทธ ์๊ฐ์ด ๋๋๋ฉด CPU๋ฅผ ๋ฐ๋ฉํด์ผ ํ๋ค.
user๋ ๋ฒจ์ ์๋ค๊ฐ ์๊ฐ์ด ๋๋๋ฉด ์๊ด์๋๋ฐ
-> system call์ ํตํด kernel๋ชจ๋๊ฐ ์ํ์ค์ด๋ค.
-> ์ด ๋, count์ ๊ฐ์ ์ฆ๊ฐ์ํค๋ ๋์ค CPU ํ ๋น์๊ฐ์ด ์ข
๋ฃ๋๋ฉด B์๊ฒ CPU๊ฐ ๋์ด๊ฐ๊ณ count์ ์ ๊ทผํ๋ค.
-> count++์ ํ๋ฒ๋ง ์ ์ฉ ๋ ๊ฒ์ด๋ค. (๋ฎ์ด์ฐ๊ธฐ)
ํด๊ฒฐ์ฑ
!
-> ์ปค๋๋ชจ๋์ ์์ ๋๋ CPU๋ฅผ ๋บ๊ธฐ์ง ์๊ฒ ํ๋ค.
critical ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ง์กฑํด์ผ ํ๋ 3๊ฐ์ง ์กฐ๊ฑด
Bounded Waiting : process๊ฐ critical section์ ๋ค์ด๊ฐ๊ธฐ๊น์ง ๋๋ฌด ์ค๋ ์๊ฐ ๊ธฐ๋ค๋ ค์๋ ์๋๋ค.(starvation X)
์ฝ๋๋ critical-section์ด๊ฑฐ๋ ์๋๊ฑฐ๋ ์ฆ, ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ ์ ์๋ ์ฝ๋์ด๊ฑฐ๋ ์๋๊ฑฐ๋๋ก ๋๋ ์ ์๋ค.
๊ณต์ ๋ฐ์ดํฐ์ ์ ๊ทผ ํ ์ ์๋ ์ฝ๋๋ฅผ critical section์ด๋ผ๊ณ ํ๋ค.
๊ณต์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ์ ๊ทผํ๊ฒ ํ๋ฉด ๋์์ ๊ทผ์ ํตํด ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๊ทผ ์ด์ ์ entry section์ ๋ฃ์ด์ lock์ ๊ฑธ์ด์ผ ํ๋ค.
-> critical section์ด ๋๋๋ฉด lock์ ํ์ด์ ๋ค๋ฅธ process๊ฐ critical section์ ์ ๊ทผ ํ ์ ์๋๋ก ํด์ผํ๋ค.
์ฝ๋์์ lock์ ๊ฑธ๊ณ ํธ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
critical section์ ๋ค์ด์๋ค ๋๊ฐ๊ธฐ ์ ์ CPU๋ฅผ ๋บ๊ธฐ์ง ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ค.
-> ์ฆ, ๊ณ ๊ธ์ธ์ด์์ instruction์ด ํ๋ฒ์ ์คํ๋๋๊ฒ์ด ์๋๋ผ ๋๋ ์ ธ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ CPU๋ฅผ ๋บ๊ธธ ์ ์๋ค. (๋ฌธ์ ์ )
while (turn != 0) : ๋ด ์ฐจ๋ก๊ฐ ์๋ ๋์์ ๊ณ์ while๋ฌธ์ ๋๊ฒ ๋ค.
์ด ์ฝ๋๋ mutual exclution์ ๋ง์กฑ์ํจ๋ค.
-> ๊ทธ๋ฌ๋ progress๋ ๋ง์กฑ์ํค์ง ๋ชปํ๋ค.
P0๊ฐ ๋ ๋น๋ฒํ๊ฒ critical section์ ๋ค์ด๊ฐ๊ณ ์ถ์ด๋ P1์ด critical section์ ๋ค์ด๊ฐ์ผ๋ง P0๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
P1์ด critical section์ ํ๋ฒ๋ง ๋ค์ด๊ฐ๋ค๋ฉด P0๋ ๋น๋ฒํ๊ฒ ๋ค์ด๊ฐ๊ณ ์ถ์ด๋ ํ ๋ฒ ๋ฐ์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ค.
๋ฐ๋ผ์ Algorithm 1์ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ํด๊ฒฐํ์ง ๋ชปํ๋ค.
flag๋ผ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. process๋ ๊ฐ๊ฐ ์์ ์ flag๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
-> flag๋ ๋ณธ์ธ์ด critical section์ ๋ค์ด๊ฐ๊ณ ์ ํ๋ ์์ง๋ฅผ ํํํ ๋ณ์
flag๋ฅผ true๋ก ํ ํ CPU๋ฅผ ๋บ๊ธด ํ ๋ค๋ฅธ process์์๋ flag๋ฅผ true๋ก ํ๋ฉด ์๋ก while๋ฌธ์์ ๋น ์ ธ๋๊ฐ์ง ๋ชปํ๋ ์ํฉ์ด ์ฐ์ถ ๋ ์ ์๋ค.
-> critical section ์ดํ์ falg = falseํ๊ธฐ ๋๋ฌธ์ด๋ค.
-> progress ๋ฌธ์ ์ ์ด ๋ฐ์ ํ ์ ์๋ค.(์๋ฌด๋ ๋ค์ด๊ฐ์ง ๋ชปํ๋ค.)
flag : ๋ด๊ฐ critical section์ ๋ค์ด๊ฐ๊ฒ ๋ค๋ ์์ง
turn : ๋ค ์ฐจ๋ก๋ ๋ด ์ฐจ๋ก๋
์๋๋ฐฉ์ด ๊น๋ฐ์ ๋ค๊ณ ์์ง ์๊ฑฐ๋ ๋ค๊ณ ์๋๋ผ๋ ๋ด ์ฐจ๋ก๋ผ๋ฉด critical section์ ๋ค์ด๊ฐ ์ ์๋ค.
Busy Waiting(=spin lock)์ด ๋ฌธ์ ๊ฐ ๋๋ค.
-> ๋ณธ์ธ์ CPU ํ ๋น์๊ฐ์ ๋ฐ๋์ง ์์ ์ธ๋ชจ์๋ ๊ณณ์๋ค๊ฐ ์ฌ์ฉํด๋ฒ๋ฆฐ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ํ๋์ instruction์ผ๋ก ํด๊ฒฐ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ์ด๋๋ ์ผ์ด๋ค.
-> ํ๋์ instruction์ด๋ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ค.
-> inturrupt๋ ํ๋์ instruction์ ํด๊ฒฐํ๊ณ ํ์ธํ๋ค.
์ฝ๊ณ ์ฐ๋ ์์
์ด ํ๋์ H.W instruction์ผ๋ก ์คํ ๋ ์ ์๋ค๋ฉด ๋น๊ต์ ๊ฐ๋จํ lock์ ๊ฑธ๊ณ ํธ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ๋ ์ ์๋ค.
-> Test_and_set(a) : a๋ฅผ ์ฝ์ด๋ด๊ณ a์ ๊ฐ์ 1(True)๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํ๋์ instruction
lock ์ด 0(False) ์ด์๋ค๋ฉด 1๋ก ๋ง๋ค๊ณ while๋ฌธ ํต๊ณผ
1(True) ์ด์๋ค๋ฉด while ๋ฌธ์์ ๋๊ธฐํ ๊ทธ๋๋ก 1๋ก ์ ์ง