์์ ์ CPU ์์ ๋ฑ ํ๋์ ์ฝ์ด๋ง ์์์ด์. ๋ชจ๋ ์์ ์ ์ด ํ๋์ ๋๋ก ์ฒ๋ฆฌ๋์ฃ . ๊ทธ๋ฐ๋ฐ ์ด์ ๋ ๋ฉํฐ์ฝ์ด ์๋. CPU ์์ ๋ ๊ฐ, ๋ค ๊ฐ, ์ฌ๋ ๊ฐโฆ ์ฌ์ง์ด ์์ญ ๊ฐ์ ์ฝ์ด๊ฐ ๋ค์ด ์๋ ์๋์ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๊ถ๊ธ์ฆ ํ๋.
"์ฝ์ด๊ฐ ๋ง์์ก๋๋ฐ ์ ์ปดํจํฐ๊ฐ ๊ทธ๋ ๊ฒ๊น์ง ๋นจ๋ผ์ง์ง ์์๊น?"
๊ทธ ์ด์ ๋ ์์ฃผ ๊ฐ๋จํฉ๋๋ค. ์ฝ์ด๋ผ๋ฆฌ ํ์ ์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ด์์.
๊ทธ๋์ ์ด๋ฒ ์๋ฆฌ์ฆ์์๋ ๋ฉํฐ์ฝ์ด ์๋์ ์ปดํจํฐ๊ฐ ์ด๋ป๊ฒ ํ๋ ฅํ๋์ง, ๊ทธ ์์ ๊ท์น๊ณผ ์ถฉ๋, ์กฐ์จ ๋ฐฉ์์ ์ด์ผ๊ธฐ์ฒ๋ผ ํ์ด๋ณผ ๊ฑฐ์์. ์ฒซ ํ๋ถํฐ ํจ๊ป ๋ ๋๋ณผ๊น์?
ํ๋์ CPU๋ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ์๋ํฉ๋๋ค.
ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์๋๊ฐ ๋๋ฌด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์, CPU๋ ์์ ์ ์ฅ์์ธ ์บ์(Cache)๋ฅผ ์ฌ์ฉํด์.
๊ทธ๋ฆฌ๊ณ ๋ฉํฐ์ฝ์ด CPU์์๋ ๊ฐ ์ฝ์ด๊ฐ ์์ ๋ง์ ์บ์(L1, L2)๋ฅผ ๊ฐ๊ณ ์์ด์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ ๋๋ค.
์๋ฅผ ๋ค๋ฉด:
์ด๊ฑด ์ฑ๋ฅ ์ธก๋ฉด์์๋ ์์ฃผ ์ข์ ๊ตฌ์กฐ์ง๋งโฆ ๋ฌธ์ ๊ฐ ํ๋ ์๊ฒจ์.
๋ฌธ์ ๋ ์ฝ์ด๋ค์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ค๋ฅด๊ฒ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ด์์.
x
๊ฐ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์๋ 0์ผ๋ก ์ ์ฅ๋์ด ์์x = 1
๋ก ๋ฐ๊พธ๊ณ , ๊ทธ ๊ฐ์ ์๊ธฐ L1 ์บ์์ ์ ์ฅํจ (๋ฉ๋ชจ๋ฆฌ๋ ์์ง ์
๋ฐ์ดํธ ์ ๋จ)x = 0
์ ์๊ธฐ ์บ์์ ๊ฐ์ง๊ณ ์์์ด ์ํ์์ CPU1๊ณผ CPU2๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋ณด๊ฒ ๋๋ฉด, ๊ฐ์ ํ๋ก๊ทธ๋จ์ธ๋ฐ๋ ๊ฒฐ๊ณผ๊ฐ ์์ธก ๋ถ๊ฐ๋ฅํ๊ฒ ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
์ด์ฒ๋ผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ ์ฝ์ด๊ฐ ์๋ก ๋ค๋ฅด๊ฒ ์บ์ฑํด์ ์์คํ
์ ์ฒด์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ ํ์์
์ฐ๋ฆฌ๋ ์บ์ ์ผ๊ด์ฑ ๋ฌธ์ (Cache Coherency Problem)๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ์ผ์ด ์์ฃผ ํํด์.
์ด๋ด ๋ ์บ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ฒจ์:
๋ฐ๋ก ์บ์ ์ผ๊ด์ฑ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๊ฑฐ์์.
๋ํ์ ์ธ ํ๋กํ ์ฝ์ธ MESI๋ ๊ฐ ์บ์ ๋ธ๋ก์ ์ํ๋ฅผ Modified, Exclusive, Shared, Invalid ๋ค ๊ฐ์ง๋ก ๊ด๋ฆฌํ๋ฉด์,
๋ฅผ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ๊ณ , ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ฒญ์ ๋ฐ๋ผ ์บ์ ์ํ๋ฅผ ๋๊ธฐํํฉ๋๋ค.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก MESI ํ๋กํ ์ฝ์ด์์. ์ด๊ฑด ๊ฐ ์บ์ ๋ธ๋ก์ด ์ด๋ค ์ํ์ธ์ง ์๋ ค์ฃผ๋ ๊ท์น์ด์์.
์ํ | ์๋ฏธ |
---|---|
M (Modified) | ์์ ๋จ. ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฆ. ๋๋ง ๊ฐ๊ณ ์์ |
E (Exclusive) | ๋๋ง ๊ฐ๊ณ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ |
S (Shared) | ์ฌ๋ฌ ์บ์๊ฐ ๊ณต์ ์ค. ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ |
I (Invalid) | ๋ฌดํจํ๋จ. ๋ ์ด์ ๋ชป ์ |
x
๋ฅผ Modified
์ํ๋ก ๊ฐ๊ณ ์๋ค๊ฐx
๋ฅผ ์ฝ์ผ๋ฉด โ ๋ ๋ค Shared
์ํ๋ก ์ ์ดx
๋ฅผ ์ฐ๋ ค๊ณ ํ๋ฉด โ ๋ค๋ฅธ ์บ์๋ค ๋ฌดํจํ ์์ฒญ โ Modified
์ํ ์ง์
์ด๋ ๊ฒ ์๋ก์ ์ํ๋ฅผ ์กฐ์ ํ๋ฉด์ ์บ์ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฝ์ด๋ผ๋ฆฌ๋ ์ด๋ป๊ฒ ์๋ก๊ฐ ์ด๋ค ์ํ์ธ์ง ์ ์ ์์๊น์?
๋ฐ๋ก ๋ฒ์ค๋ฅผ ๋ชฐ๋ ์ฟ๋ฃ๋ ๋ฐฉ์, Bus Snooping์ ๋๋ค.
๊ฐ ์บ์๋ ๊ณต์ฉ ๋ฒ์ค๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐ์ํด์.
์ด๋ ๊ฒ ์๋ก ๋์น ๋ณด๋ฉฐ ์บ์ ์ํ๋ฅผ ๊ด๋ฆฌํด์.
ํ์ง๋ง ์ฝ์ด๊ฐ ๋ง์์ง๋ฉด ๋ชจ๋๊ฐ ๋ฒ์ค๋ฅผ ์ฟ๋ฃ๋ ๊ตฌ์กฐ๋ ํผ์กํด์ง๊ณ ํ์ฅ์ฑ์ด ๋จ์ด์ง์ฃ .
์ฝ์ด ์๊ฐ ์์ญ ๊ฐ, ์๋ฐฑ ๊ฐ๊ฐ ๋๋ฉด ์ฟ๋ฃ๊ธฐ ๋ฐฉ์์ ํ๊ณ์ ๋ถ๋ชํ๋๋ค.
๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ ๋๋ ํฐ๋ฆฌ ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ด์์.
์์:
๋ง์น ์ค๊ฐ ๊ด๋ฆฌ์์ฒ๋ผ ๊ฐ์ ๊ฐ๊ณ ์๋ ์ํ๋ฅผ ํ์ ํด์ ์ ํํด์ฃผ๋ ๊ฑฐ์ฃ .
์บ์ ์ผ๊ด์ฑ๋ง ์ ์ ์งํ๋ฉด ๋์ผ๊น์? ์๋์์.
CPU๋ ๋ด๋ถ์ ์ผ๋ก ๋ช ๋ น์ด ์์๋ฅผ ๋ฐ๊ฟ ์คํํ๊ธฐ๋ ํด์. ์? ๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด์์.
x = 1;
y = x + 1;
์ด๋ฐ ์ฝ๋์กฐ์ฐจ CPU๋ y๋ฅผ ๋จผ์ ๊ณ์ฐํ ์๋ ์์ด์!
๊ทธ๋์ ๊ฐ ์ธ์ด๋ CPU๋ง๋ค "์ด๋ ์ ๋๊น์ง ์์๋ฅผ ๋ณด์ฅํ ๊ฒ์ธ์ง"๋ฅผ ๋ช ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ(Memory Model)์ด ์กด์ฌํด์.
volatile
memory_order_acquire
๊ฐ์ ํค์๋๊ฐ ๋ฐ๋ก ๊ทธ๊ฑธ ์ํ ๊ฑฐ์์.
๋ฉํฐ์ฝ์ด์ ํ์ ์ '์์'๊น์ง ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค.
์ด์ ์ผ๊ด์ฑ์ ๋ค์ก๋ค๋ฉด, ์ง์ง ๋ฉํฐ์ฝ์ด์ ํ, ๋ณ๋ ฌ์ฑ(Parallelism)์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ๊ฒ์.
๋ฉํฐ์ฝ์ด๋ ์ฌ๋ฌ ๊ฐ์ ์ฝ์ด๊ฐ ํ๋์ CPU ์์ ์๋ ๊ตฌ์กฐ๊ณ ,
๋ณ๋ ฌ์ฑ์ ์ด ์ฝ์ด๋ค์ด ๋์์ ์์
์ ์ํํ๋ ๋ฅ๋ ฅ์
๋๋ค.
ํ์ง๋ง ์ค๋ ๋๋ผ๋ฆฌ ์์์ ๊ณต์ ํ๋ค ๋ณด๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ด์.
์:
x++
์ ์คํํ๋ฉด?๊ทธ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ๋๊ธฐํ(Synchronization) ๊ธฐ๋ฒ์ ๋๋ค.
๋๊ตฌ | ์ญํ |
---|---|
๋ฎคํ ์ค(Mutex) | ํ ๋ฒ์ ํ๋๋ง ์์ ์ ๊ทผ ๊ฐ๋ฅ |
์ธ๋งํฌ์ด | ๋์์ N๊ฐ๊น์ง๋ง ์ ๊ทผ ํ์ฉ |
๋ฝ/Unlock | ์์ ์ ๊ธ๊ณผ ํด์ |
ํ์ ์๋ ์ถฉ๋ ๋ฐฉ์ง๊ฐ ํ์์์.
CPU์๋ ๋ ๊ฐ์ง ์คํ ๋ชจ๋๊ฐ ์์ด์:
์ฌ์ฉ์ ๋ชจ๋์์ ์ปค๋ ๊ธฐ๋ฅ์ ์ฐ๊ณ ์ถ์ผ๋ฉด?
์์คํ ์ฝ(System Call)์ ํตํด ์ปค๋ ๋ชจ๋๋ก ์ ํํด์ผ ํด์.
ํ์ง๋ง ์ด ์ ํ์๋ ๋น์ฉ์ด ๋ค์ด์. ๋๋ฌด ์์ฃผ ์ ํํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ฃ .
๋ง์ง๋ง์ผ๋ก, CPU๊ฐ ์ด์ฌํ ์์
์ค์ธ๋ฐ
๊ฐ์๊ธฐ ์ธ๋ถ์์ ๊ธด๊ธํ ์ผ์ด ์๊ธฐ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๊ทธ๊ฑธ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก ์ธํฐ๋ฝํธ ์์คํ ์ด์์.
์ ํ | ์์ | ์ค๋ช |
---|---|---|
ํ๋์จ์ด | ํค๋ณด๋, ๋ง์ฐ์ค | ์ธ๋ถ ์ฅ์น ์์ฒญ |
์ํํธ์จ์ด | ์์คํ ์ฝ, 0์ผ๋ก ๋๋๊ธฐ | ๋ด๋ถ ๋ฐ์ |
๋๊ธฐ/๋น๋๊ธฐ | ์์ธ vs ์ฅ์น ์ ํธ | ๋ฐ์ ์์ ๊ธฐ์ค |
์ธํฐ๋ฝํธ๋ ์ค์๊ฐ ๋ฐ์์ฑ๊ณผ ์์ ์ฑ์ ์ฑ ์์ง๋๋ค.
๊ฐ๋ | ์์ฝ |
---|---|
์บ์ ์ผ๊ด์ฑ | ์ฝ์ด๋ง๋ค ๋ค๋ฅธ ๊ฐ ๋ฐฉ์ง (MESI) |
์ํ ์ ์ด | ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ์บ์ ์ํ ์ ํ |
Bus Snooping | ์บ์๋ค์ด ๋ฒ์ค๋ฅผ ์ฟ๋ฃ๊ณ ์กฐ์ ํจ |
๋๋ ํฐ๋ฆฌ ๋ฐฉ์ | ์ค์ ๊ด๋ฆฌ์๋ก ํ์ฅ์ฑ ํ๋ณด |
๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ | ๋ช ๋ น์ด ์์ ๋ณด์ฅ ์ฌ๋ถ๋ฅผ ๊ท์ |
๋ณ๋ ฌ์ฑ & ์ค๋ ๋ | ์ฌ๋ฌ ์์ ๋์ ์คํ์ ์ํ ๊ตฌ์กฐ |
๋๊ธฐํ | ์ถฉ๋ ๋ฐฉ์ง๋ฅผ ์ํ ์ ์ด ์ฅ์น |
์ฌ์ฉ์/์ปค๋ ๋ชจ๋ | ๊ถํ ๊ตฌ๋ถ ๋ฐ ๋ชจ๋ ์ ํ ๊ตฌ์กฐ |
์ธํฐ๋ฝํธ ์์คํ | ๊ธด๊ธ ์ํฉ ๋์์ ์ํ CPU ๊ตฌ์กฐ |
๋ฉํฐ์ฝ์ด๋ ์ฑ๋ฅ์ด ์๋ ํ์ ์ด๋ค.
์ ๋๋ ์ญํ ๊ณผ ์ฒ ์ ํ ์กฐ์จ์ด ์ง์ง ๋น ๋ฆ์ ๋ง๋ ๋ค.