๐Ÿ“š Computer Science/CS

[์ปดํ“จํ„ฐ ๋ฐ‘๋ฐ”๋‹ฅ์˜ ๋น„๋ฐ€] 5์žฅ. ์บ์‹œ(Cache)

ibelieveinme 2025. 2. 9. 09:30
728x90

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 ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค. ๋™๊ธฐ ์ž‘์—….

 

[๋งˆ๋ฌด์œผ๋ฆฌ]

์ž ๊ธˆ ์—†๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์•ผํ•  ๋•Œ๋งŒ ๋ช…๋ น์–ด ์žฌ์ •๋ ฌ์— ์‹ ๊ฒฝ์“ฐ์ž.

 

728x90