5. ์์ ๊ฒ์ผ๋ก ํฐ ์ฑ๊ณผ ์ด๋ฃจ๊ธฐ, ์บ์
5.1 ์บ์, ์ด๋์๋ ์กด์ฌํ๋ ๊ฒ.
[์บ์์ ํ์ ๋ฐฐ๊ฒฝ]
์์คํ ์ ์ฑ๋ฅ์ ์๋์ ์ผ๋ก ๋๋ฆฐ ์ชฝ์ ๋ง์ถ์ด ์ ํ๋๋ค.
CPU์ ์๋ >>>>> ๋ฉ๋ชจ๋ฆฌ์ ์๋. ๋ฉ๋ชจ๋ฆฌ๋ CPU์ 1/100 ์์ค์ ํด๋นํ๋ค.
CPU์ ๋ฉ๋ชจ๋ฆฌ์ ์๋์ฐจ๋ก ์ธํด CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฝ๊ณ ์ฐ์ง ์๋๋ก ‘์บ์’๊ฐ ๊ฐ๋ฐ๋์๋ค.
์บ์์ ์ต๊ทผ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ป์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฉฐ CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ช ๋ น์ด์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ผ ํ ๋ ๋ฌด์กฐ๊ฑด ๋จผ์ ์บ์์์ ํด๋น ๋ด์ฉ์ ์ฐพ๋๋ค.
[์บ์์ ๋ฌผ๋ฆฌ์ ํํ]
x86๊ณผ ๊ฐ์ ์ต์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์๋ ์ค์ ๋ก 3๋จ๊ณ์ ์บ์๊ฐ ์ถ๊ฐ๋์ด ์๋ค. L1 ์บ์, L2 ์บ์, L3 ์บ์.
L1 > L2 >> L3 ์์ผ๋ก ์๋๊ฐ ๋น ๋ฅด๋ค.
๊ฐ ๊ณ์ธต์ ํฌ๊ธฐ๋ ๋ค์ ๊ณ์ธต์ ํฌ๊ธฐ๋ณด๋ค ์๋ค.
[์บ์์ ๋ฌธ์ ]
1. ์บ์ ๊ฐฑ์
* ๋ฌธ์ ์ ์์ธ
์บ์๋ก ์ธํด CPU๊ฐ ๋์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ผํ์ง ์๊ฒ ๋๋ฉฐ CPU๋ ์บ์์ ์ง์ ๊ธฐ๋ก์ ํ ์ ์๊ฒ ๋์๋ค. ์ด๋ก ์ธํด ์บ์์ ๋ฐ์ดํฐ๋ ๊ฐฑ์ ๋์์ง๋ง ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ ์์ง ๊ฐฑ์ ๋์ง ์๋ ‘๋ถ์ผ์น ๋ฌธ์ ’๊ฐ ๋ฐ์ํ ์ ์๋ค.
* ํด๊ฒฐ๋ฐฉ๋ฒ
1) ์บ์๋ฅผ ๊ฐฑ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํจ๊ป ๊ฐฑ์ ํ๋ ‘์ฐ์ ๊ธฐ์ ’ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. (๋๊ธฐ)
2) ์บ์์ ์ฉ๋๋ ์ ํ๋์ด ์๊ธฐ์ ์ฉ๋์ด ๋ถ์กฑํ๋ฉด ์์ฃผ ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์๋ ๊ฐฑ์ ํ๋ค. ‘ํ๊ธฐ์ ๋ฐฉ์’ (๋น๋๊ธฐ)
2. ๋ค์ค ์ฝ์ด ์บ์์ ์ผ๊ด์ฑ
* ๋ฌธ์ ์ ์์ธ
๋จ์ผ CPU์ ์ฑ๋ฅ์ ์ฝ๊ฒ ํฅ์๋์ง ์์ง๋ง ๋ค์ค ์ฝ์ด๋ก ์ซ์๋ฅผ ๋๋ฆด ์ ์๋ค.
๊ฐ CPU์๋ ์บ์๊ฐ ์๋ก ์กด์ฌํ๋ค. ์ฆ, ์ด๋๋ ๊ฐฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
* ํด๊ฒฐ๋ฐฉ๋ฒ
์บ์ ํ ๊ฐ์์ ๊ฐฑ์ ๋ ๋ณ์๊ฐ ๋ค๋ฅธ CPU ์ฝ์ด์ ์บ์์๋ ์กด์ฌํ๋ค๋ฉด ์ด ์บ์๋ ํจ๊ป ๊ฐฑ์ ํ๋ค. MESI ๊ท์น.
[๋์คํฌ์ ์บ์๋ก ํ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ]
๋ฉ๋ชจ๋ฆฌ ํ๋จ์๋ ‘๋์คํฌ’๊ฐ ์กด์ฌํ๋ค. ์ฆ, ๋์คํฌ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ฒจ์ผ CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ ์ฌ์ด์ ์บ์๋ฅผ ์ถ๊ฐํ ์๋ ์์ง๋ง, ์ต์ ์ด์ ์ฒด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ผ๋ถ๋ฅผ ๋์คํฌ์ ์บ์๋ก ์ฌ์ฉํ๋ค.
[๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ]
1) ํ๋ก์ธ์ค๊ฐ ์์ฒญํ๋ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๊ฐ ๋์ด๋ ๊ด์ฐฎ๋ค.
why? ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋, ๋ฉ๋ชจ๋ฆฌ๋ ์์ฃผ ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ๊ธฐ๋กํ๊ณ ์ด ๋ฐ์ดํฐ๊ฐ ์ฐจ์งํ๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํด์ ํ๋ค. ๊ทธ๋ผ ๋ค์ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ ์ ์๋ค.
2) ๋ก์ปฌ ๋์คํฌ๋ ์๊ฒฉ์ ๋ถ์ฐ ํ์ผ ์์คํ ์ ์บ์๋ก ์ฌ์ฉ๋๋ค.
๋์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋, ํ๋์ ๋ก์ปฌ ๋์คํฌ๋ก ๋ถ์กฑํ๋ฉด ‘๋ถ์ฐ ํ์ผ ์์คํ ’์ ์ฌ์ฉํ๋ค. ๋ก์ปฌ ๋์คํฌ๊ฐ ์๊ฒฉ์ ๋ถ์ฐ ํ์ผ ์์คํ ์์ ์ ์ก๋ ํ์ผ์ ์ ์ฅํ๋ฉด ๋คํธ์ํฌ๋ฅผ ํตํ์ง ์๊ณ ๋ก์ปฌ ๋์คํฌ์ ์ง์ ์ ๊ทผํ ์ ์๋ค.
5.2 ์ด๋ป๊ฒ ์บ์ ์นํ์ ์ธ ํ๋ก๊ทธ๋จ์ ์์ฑํ ๊น?
1. ํ๋ก๊ทธ๋จ ์ง์ญ์ฑ์ ์์น
1) ์๊ฐ์ ์ง์ญ์ฑ: ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์ ๊ทผํ ํ ์ด ์กฐ๊ฐ์ ์ฌ๋ฌ๋ฒ ์์ฃผ ์ฐธ์กฐํ๋ค.
2) ๊ณต๊ฐ์ ์ง์ญ์ฑ: ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์ฐธ์กฐํ ๋ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ ์ฐธ์กฐํ๋ค.
2. ๋ฉ๋ชจ๋ฆฌ ํ ์ฌ์ฉ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋น๋ฐ์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ํ ์์ญ ์ด๊ณณ์ ๊ณณ์ ํฉ์ด์ ธ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. => ‘๋ฉ๋ชจ๋ฆฌ ํ ๊ธฐ์ ’๋ก ํฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ๋ฏธ๋ฆฌ ํ ๋น๋ฐ์ผ๋ฉด ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์์์ ๊ณต๊ฐ์ ์ง์ญ์ฑ์ ๋์ผ ์ ์๋ค.
3. ํซ ๋ฐ์ดํฐ์ ์ฝ๋ ๋ฐ์ดํฐ์ ๋ถ๋ฆฌ
์์ฃผ ์ฌ์ฉ๋์ง ์๋ ๋ณ์๋ cold data, ์์ฃผ ์ฌ์ฉ๋๋ ๋ณ์๋ hot data๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฝ๋ ๋ฐ์ดํฐ์ ํซ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ๋ ๋์ ์ง์ญ์ฑ์ ์ป์ ์ ์๋ค.
4. ์ง์ญ์ ์์น ๊ด์ ์์ ๋ณด๋ฉด ๋ฐฐ์ด์ด ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ณด๋ค ์ข๋ค.
๋ฐฐ์ด์ ํ๋์ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๊ณณ์ ๊ณณ์ ํฉ์ด์ ธ ์์ ์ ์๋ค.
๋ค๋ง, ๋ ธ๋๊ฐ ๋น๋ฒํ๊ฒ ์ถ๊ฐ/์ญ์ ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด ‘์ฐ๊ฒฐ ๋ฆฌ์คํธ’๊ฐ ๋ฐฐ์ด๋ณด๋ค ์ฐ์ํ ์ ์๋ค. ๋ ธ๋์ ์ถ๊ฐ/์ญ์ ์ ๋๋ ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์์๋ ์บ์ ์นํ์ ์์ ๋ฐ์ํ๊ณ ์ถ๋ค๋ฉด ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์์ฑ์ ‘๋ฉ๋ชจ๋ฆฌ ํ’์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฒญํ๋ฉด ๋๋ค.
5.3 ๋ค์ค ์ค๋ ๋ ์ฑ๋ฅ ๋ฐฉํด์
๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๊ฐ ์บ์์ ์ ์ฅ๋ ๋ ‘์บ์ ๋ผ์ธ’์ด๋ผ๋ ๋ฌถ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
์บ์ ๋ผ์ธ์ ๋ณดํต 64Byte ํฌ๊ธฐ ์ด๊ณ ์บ์๊ฐ ์ ์คํ์ง ๋ชปํ ๋ ์ด ๋ฌถ์ ๋ฐ์ดํฐ๊ฐ ์บ์์ ์ ์ฅ๋๋ค.
์บ์์ ๋ฌถ์ ๋ฐ์ดํฐ๋ก ์ ์ฅ๋๋ฉฐ ๋ค์ค ์ฝ์ด ์บ์์์ ‘์บ์ ํ๊น’ or ‘์บ์ ํํ’ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
1. ์บ์ ํ๊น ๋ฌธ์
CPU1์ ์บ์1์ a ๋ณ์๋ฅผ ์ธ ๋ CPU2์ ์บ์2์ a๋ณ์๊ฐ ์๋ค๋ฉด CPU2์ a๋ณ์๋ฅผ ๋ฌดํจํ ์ํจ๋ค.(์บ์ ํ๊น1)
๋ฐ๋๋ก CPU2์ ์บ์2์ a ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ CPU1์ ์บ์1์ a๋ณ์๋ฅผ ๋ฌดํจํํ๋ค.(์บ์ ํ๊น2)
์ฆ, ๋น๋ฒํ๊ฒ ์บ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด ์บ์๊ฐ ์์ ์ ์ญํ ์ ํ์ง ๋ชปํ ๋ฟ ์๋๋ผ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ๊น์ง ์ ํ์ํฌ ์ ์๋ค.
2. ๊ฑฐ์ง ๊ณต์ ๋ฌธ์
์๋ ๋ ํ๋ก๊ทธ๋จ์ ํตํด ์บ์ ๋ฐ์ดํฐ ๊ฑฐ์ง ๊ณต์ ๋ฌธ์ ๋ฅผ ์์๋ณด์.
1) ์ค๋ ๋ 2๊ฐ๋ก a๋ณ์์ b๋ณ์๋ฅผ ๊ฐ๊ฐ 5์ต ๋ฒ ์ฆ๊ฐ์ํจ๋ค.
void add_a(){ for(int i = 0; i < 500000000; i++){ ++global_data.a; } } void add_b(){ for(int i = 0; i < 500000000; i++){ ++global_data.b; } } void run(){ thread t1 = thread(add_a); thread t2 = thread(add_b); t1.join(); t2.join(); } |
2) ๋จ์ผ ์ค๋ ๋๋ก a๋ณ์์ b๋ณ์๋ฅผ 1์ฉ 5์ต ๋ฒ ์ฆ๊ฐ์ํจ๋ค.
void run(){ for(int i = 0; i < 500000000; i++){ ++global_data.a; } for(int i = 0; i < 500000000; i++){ ++global_data.b; } } |
1) 2) ํ๋ก๊ทธ๋จ์ ์คํ์๊ฐ์ ๋น๊ตํด๋ณด์.
๋ค์ค ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋จ: 3์ด.
๋จ์ผ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ํ๋ก๊ทธ๋จ: 2์ด.
๋ค์ค ์ค๋ ๋๋ ์ด๋ค ๋ณ์๋ ๊ณต์ ํ์ง ์์ง๋ง ์ด ๋ ๋ณ์๊ฐ ๋์ผํ ์บ์ ๋ผ์ธ(cache line)์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๊ณ์ ์บ์ ํ๊น์ด ๋ฐ์ํ๋ฉฐ ์๋๋ฅผ ์ง์ฐ์ํค๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด ๋ ๋ณ์ ์ฌ์ด์ ์บ์ ๋ผ์ธํฌ๊ธฐ๋งํผ์ ์ฌ์ฉ๋์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ด๋ค. 4*16 = 64 Byte.
struct data { int a; int arr[16]; int b; } |
5.4 ๋ดํํฌ์ ํ์ ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ
[๋น์์ฐจ์ ๋ช ๋ น์ด ์ฒ๋ฆฌ(OUt of Order Execution, OoOE)]
CPU๋ ๋ฐ๋์ ์๊ฒฉํ๊ฒ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ฑํ ์ฝ๋์ ์์๋๋ก ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์คํํ์ง ์๋๋ค.
why? CPU์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ ์๋ ์ฐจ์ด ๋๋ฌธ.
CPU๊ฐ ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์๊ฒฉํ ์์๋๋ก ์คํํ๋ฉด ๋ช ๋ น์ด๊ฐ ์์กดํ๋ ํผ์ฐ์ฐ์๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ํ์ดํ๋ผ์ธ ๋ด๋ถ์ ‘๋น ๊ณต๊ฐ’์ธ ์ฌ๋กฏ์ด ์๊ธด๋ค. ์ด๊ฑธ ์ด๋ฏธ ์ค๋น ์๋ฃ๋ ๋ค๋ฅธ ๋ช ๋ น์ด๋ก ์ฑ์ฐ๋ฉด ๋ช ๋ น์ด์ ์คํ ์๋๋ฅผ ๋์ผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(***์ ํ ๊ด๊ณ์ ๋ ๋ช ๋ น์ด๊ฐ ์๋ก ์ด๋ค ์์กด ๊ด๊ณ๊ฐ ์์ ๋๋ง. ***์๊ธฐ ์์ ์ด์ธ์ ๋ ๋ค๋ฅธ ์ฝ์ด๊ฐ ํด๋น ์ฝ์ด๋ฅผ ๋ฐ๋ผ๋ณผ ๋๋ง)
1) ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์์ฑํ๋ ๋จ๊ณ: ์ปดํ์ผ ์ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ ๋ ฌํจ.
2) CPU๊ฐ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๋จ๊ณ: ์คํ ์ค์ ๋ช ๋ น์ด๊ฐ ๋น์์ฐจ์ ์ผ๋ก ์คํ๋จ.
๋น์์ฐจ์ ๋ช ๋ น์ด ์ฒ๋ฆฌ ์, ์บ์๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์บ์์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ์์ ์ ๋น๊ต์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฐ๋ค. ์บ์์ ์ผ๊ด์ฑ ์์ ์ ์ CPU๋ ๋ฐ๋์ ๋๊ธฐ์ํ๋ฅผ ์ค์งํด์ผ ํ๋ค. ๋น์์ฐจ์ ๋ช ๋ น์ด ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉฐ ์บ์์ ์ผ๊ด์ฑ ์์ ์ ์ต์ ํํ๊ธฐ ์ํด ์ผ๋ถ ์์คํ ์ ‘์ ์ฅ ๋ฒํผ(store buffer)’ ๋ฑ์ ๋๊ธฐ์ด์ ์ถ๊ฐํ๋ค.
์ฆ, ์ ์ฅ๋ฒํผ์ ๊ธฐ๋กํจ์ผ๋ก์จ ์บ์๊ฐ ๊ฐฑ์ ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ๋ช ๋ น์ด๋ฅผ ๊ณ์ ์คํํ ์ ์๋ค.
[๋น์์ฐจ์ ์คํ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ]
๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ(Memory Barrier) ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ํตํด ์ค๋ ๋์ CPU์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ผ๊ณ ๊ฐ์ ๋ช ๋ น์ ๋ด๋ฆฌ์.
1) LoadLoad: CPU๊ฐ Load ๋ช ๋ น์ด ์คํ ์, ๋ค์์ ์ค๋ Load ๋ช ๋ น์ด๊ฐ ๋จผ์ ์คํ๋์ง ์๋๋ก ๋ฐฉ์ง.
2) StoreStore: CPU๊ฐ Store ๋ช ๋ น์ด ์คํ ์ ๋ค์์ ์ค๋ Store ๋ช ๋ น์ด๊ฐ ๋จผ์ ์คํ๋์ง ์๋๋ก ๋ฐฉ์ง.
3) LoadStore:Load ๋ช ๋ น์ด๊ฐ ์บ์์ ์ ์คํ์ง ๋ชปํ ๋, ์ผ๋ถ CPU์์๋ ๋ค์์ ์ค๋ Store ๋ช ๋ น์ด๋ฅผ ๋จผ์ ์คํํ ์ ์๋ค. Load ๋ช ๋ น์ด ๋ค์์ Store ๊ฐ ๋จผ์ ์คํ๋์ง ์๋๋ก ๋ฐฉ์ง.
4) StoreLaod: Store ์ค์ Load ์์ ์ ๋จผ์ ์ํํ ์ ์๋ค. ๋๊ธฐ ์์ .
[๋ง๋ฌด์ผ๋ฆฌ]
์ ๊ธ ์๋ ํ๋ก๊ทธ๋๋ฐ์ ํด์ผํ ๋๋ง ๋ช ๋ น์ด ์ฌ์ ๋ ฌ์ ์ ๊ฒฝ์ฐ์.