CPU๋ ๊ฐํ(on-off)๋ง ์ดํดํ๋ ๋งค์ฐ ์์์ ์ธ ๊ธฐ๊ณ.
์ ์์ค ์ธ์ด: ์ฒ๊ณต์นด๋ -> ์ด์ ๋ธ๋ฆฌ์ด
๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด: ๋ช ๋ น์ ๊ท์น๊ณผ ํจํด์ statement(๋ฌธ)์ผ๋ก -> ์ค์ฒฉ๋ statement๋ฅผ syntax(๊ตฌ๋ฌธ)์ผ๋ก -> syntax๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋๋ก syntax tree(๊ตฌ๋ฌธํธ๋ฆฌ)๋ก ์ค๋น -> compiler๊ฐ ๋ฆฌํ๋ ธ๋๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ๊ธฐ๊ณ๋ช ๋ น์ด๋ก ๋ฒ์ญ
ํด์ํ ์ธ์ด: CPU ํ์ ๋ณ๋ก ๋ค๋ฅธ ๊ธฐ๊ณ์ด๋ฅผ ์ฐ๋ ๋ฌธ์ ๊ฐ ์์. ๋ง์น ์์ด๊ฐ ๊ตญ์ ํต์ฉ์ด๋ก ์ฌ์ฉ๋๋ฏ์ด CPU ํ์๊ณผ ๋ฌด๊ดํ ํ์ค ๋ช ๋ น์ด ์งํฉ์ ๋ง๋ค์ด ์ฌ์ฉํ๊ณ , CPU์ ๊ธฐ๊ณ ๋ช ๋ น์ด ์คํ ๊ณผ์ ์ ๋ชจ๋ฐฉํ๋ ํ๋ก๊ทธ๋จ์ ๋ฐ๋ก ์ค๋นํด์ ์คํํ๋ ๊ฒ์ผ๋ก ํด๊ฒฐ. '๋ชจ๋ฐฉ'ํ๋ค๊ณ ํํํ ๊ฒ์, ํ์ค ๋ช ๋ น์ด๋ก๋ง ์คํํด๋ ๊ฐ CPU์ ํน์ฑ์ ๋ง๋ ๊ธฐ๊ณ๋ช ๋ น์ด๊ฐ ์คํ๋๋ ๋งฅ๋ฝ์ ์๋ฏธํ ๊ฒ. ์ด๋ฌํ CPU ์๋ฎฌ๋ ์ด์ ํ๋ก๊ทธ๋จ์ ๊ฐ์๋จธ์ (virtual machie) ํน์ ์ธํฐํ๋ฆฌํฐ(interpreter) ๋ผ๊ณ ๋ถ๋ฆ.
์ปดํ์ผ๋ฌ๋ ๊ณ ์์ค ์ธ์ด๋ฅผ ์ ์์ค ์ธ์ด๋ก ๋ฒ์ญํ๋ "ํ๋ก๊ทธ๋จ"์ ์ผ์ข
.
์์ค์ฝ๋๋ฅผ ์
๋ ฅํ๋ฉด ์คํ ํ์ผ์ ๋ฐํํ๋ค. ํ
์คํธ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ ์ด๋ผ๊ณ ๋ณผ ์๋ ์๋ค.
int a = 1;
int b = 2;
while (a < b)
{
b = b - 1;
}
โฌ๏ธ
T_Keyword int
T_Identifier a
T_Assign =
...
(๊ฐ ํ์ด ํ๋์ ํ ํฐ์ ์๋ฏธ)
while
ํค์๋์ ํ ํฐ์ ์ฐพ์ผ๋ฉด ๋ค์ ํ ํฐ์ (
์ฌ์ผ ํ๋ค๋ ์ ์ ํ์ ํด์์ ์งํ.์ด๊ฒ์ ์ค์ ๋ก๋ ๋งค์ฐ ๋ณต์กํ ๊ณผ์ .
์ดํ์๋, ์์ค์ฝ๋๊ฐ ์์คํ์ผ์ ์๋ฏ ๊ธฐ๊ณ๋ช ๋ น์ด๋ ๋์ํ์ผ(object file)์ ์ ์ฅ๋๋๋ฐ, ์ฌ๋ฌ ๊ฐ์ ๋์ํ์ผ์ ๋ฌถ๊ธฐ ์ํด ๋งํฌ(link) ๋ผ๋ ์์ ์ด ํ์.
๋ง์ปค๋ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ๋์ ํ์ผ ์ฌ๋ฌ๊ฐ๋ฅผ ํ๋๋ก ๋ฌถ์ด ํ๋์ ์ต์ข
์คํ ํ์ผ์ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ ์ผ์ข
.
์ฌ๋ฌ ๊ฐ์ ๋์ ํ์ผ์ ํ๋๋ก ๋ฌถ๋ ํ์๋ ์ฃผ๋ก '์ธ๋ถ ์ฝ๋'๋ฅผ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋๋ฐ ํ๊ธฐ ์ํจ.
์ธ๋ถ ์ฝ๋๋ '์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ' ํน์ '๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ'๋ก ์ ๊ณต๋ ์ ์์.
๋งํฌ ๊ณผ์ ์ ์ฌ๋ฒ ํด์(symbol resolution) / ์คํ ํ์ผ ์์ฑ / ์ฌ๋ฐฐ์น(relocation) ๋ฑ์ผ๋ก ๊ตฌ์ฑ.
.lib
(win) / .a
(linux)dll
(win) / lib*.so
(linux).relo.text
์ .relo.data
์ ๊ธฐ๋กํด ๋๊ณ ํด๋น ์ฌ๋ฒ์ ์์์ ์ฃผ์๊ฐ์ ๋ถ์ฌ.์ถ์ํ๋ ํํ๋ ฅ์ ํฅ์ํด ์์ฌ์ํต์ ํจ์จ์ ๋์ด๊ณ , ์ธ๋ถ ์ฌํญ์ ๊ฐ์ถฐ ๋ด์ฉ์ ๋ณดํธํ๊ฒ ํด์ค.
ํ๋ก๊ทธ๋๋ฐ๊ณผ ์ถ์ํ
๋ชจ๋ ๊ธฐ๋ฐ์ ์ค๊ณ์์๋ API๋ผ๋ ์ถ์ํ๊ฐ ์กด์ฌ.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์ถ์ํ๋ฅผ ์ง์ํ๊ธฐ ์ํ ์์ ๋ง์ mechanism ์ ์ ๊ณต. (e.g. OOP์ ๋คํ์ฑ)
์์คํ
์ค๊ณ์ ์ถ์ํ
CPU - ๋ช
๋ น์ด ์งํฉ
๊ธฐ๊ณ ๋ช
๋ น์ด - ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
์
์ถ๋ ฅ - ํ์ผ
์คํ์ค์ธ ํ๋ก๊ทธ๋จ - ํ๋ก์ธ์ค
๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ - ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ
๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ - ์์ผ
ํ๋ก์ธ์ค์ ํ๋ก์ธ์ค์ ์ข
์์ ์ธ ์คํ ํ๊ฒฝ - ์ปจํ
์ด๋
CPU, ์ด์ ์ฒด์ , ์์ฉ ํ๋ก๊ทธ๋จ - ๊ฐ์ ๋จธ์
์ถ์ํ ๊ณ์ธต์ ํธ๋ฆฌํ์ง๋ง, ๊ณ ๊ธ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋๊ธฐ ์ํด์ ์ ์์ค ๊ณ์ธต์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค.
์ด์์ฒด์
ํ๋ก๊ทธ๋จ ์คํ์ ์ํด์๋,
๋๋ถ์ด, ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ ๋์์ ์คํ ์ํค๊ธฐ ์ํด์๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ context ์ ๋ณด๋ฅผ ๋ด์ ๊ตฌ์กฐ์ฒด๊ฐ ํ์ํ๋ฐ ์ด๋ฅผ ํ๋ก์ธ์ค(process)๋ผ๊ณ ํจ.
์ด๋ฅผ ์ฌ๋์ด ํญ์ ์๋์ผ๋ก ํ๊ธฐ์๋ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก,
๋ฑ์ ๋ชจ์๋ ํ๋ก๊ทธ๋จ์ด '์ด์ ์ฒด์ '(operating system).
์ด์ ์ฒด์ ์ผ ๋ง๋ก ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด๋ผ๋ ๋จ์ด์ ๊ฐ์ฅ ์ ํฉ.
ํ๋ก์ธ์ค์ ์ค๋ ๋
ํ๋ก์ธ์ค๋ ๊ฐ์๋ฉ๋ชจ๋ฆฌ ๋๋ถ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฒด๋ฅผ ๋ ์ ํ๋ ๊ฒ ๊ฐ์ด ๋์ํ๋๋ฐ, ํ๋ก์ธ์ค ๋ด๋ถ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์์.
ํ๋ก์ธ์ค์ ๋จ์ ์ ์ง์
ํจ์(entry function)๊ฐ main
ํ๋๋ก ๊ณ ์ ๋์ด ์์ด ๊ธฐ๊ณ๋ช
๋ น์ด๋ฅผ ํ ๋ฒ์ ํ๋์ CPU์์ ๋ฐ์ ์คํํ์ง ๋ชปํ๋ค๋ ๊ฒ.
์ฌ๋ฌ ๊ฐ์ CPU๊ฐ ๋์ผํ ํ๋ก์ธ์ค์ ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์คํํ๊ฒ ํ ์๋ ์์๊น.
ํ๋์ ํ๋ก์ธ์ค์ ์ฌ๋ฌ ๊ฐ์ ์คํ ํ๋ฆ์ ๊ฐ์ง๋๋ก ํ ์ ์์.
๊ฐ ์คํ ํ๋ฆ์ ํด๋นํ๋ entry point๋ฅผ ์ฌ๋ฌ ๊ฐ์ CPU PC ๋ ์ง์คํฐ์ ๋๋์ด ์ง์ ํ๋ฉด ๋จ.
๊ทธ ์คํ ํ๋ฆ ํ๋๋ฅผ ์ค๋ ๋(thread)๋ผ๊ณ ํจ.
CPU๊ฐ ํ ๊ฐ(๋จ์ผ ์ฝ์ด)๋ผ๋ ์คํํ๋ฆ์ ๊ต์ฒดํ๋ฉด์ ๋ง์น ๋์์ ์คํ๋๋ ๊ฒ ์ฒ๋ผ ๋์์ํฌ ์ ์์. ์ค๋ ๋๋ ์ด์ ์ฒด์ ๊ณ์ธต์์ ๊ตฌํ๋๊ณ ์ฝ์ด์ ๊ฐ์์๋ ๋ฌด๊ดํ๊ธฐ ๋๋ฌธ.
์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ ํ๋์ ํ๋ก์ธ์ค์ ์ํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณต์ ํ๋ค๋ ์ด์ ์ด ์์.
๋จ, ๊ณต์ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ํธ ๋ฐฐ์ (mutual exclustion)์ ๋๊ธฐํ(synchronization)์ ํตํด ํด๊ฒฐํด์ผ ํจ.
๊ฐ ์ค๋ ๋ -> ์คํ ํ๋ฆ -> ์ง์
ํจ์๋ ํจ์๋ฅผ ์คํํ๊ธฐ ์ํ ๊ฐ์์ ์คํ ํ๋ ์์ด ํ์ํจ.
์ฆ ์ค๋ ๋๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์คํ ํ๋ ์๋ ์ฌ๋ฌ๊ฐ ํ์. ์ด๋ ์ค๋ฒํค๋๋ก ์์ฉ.
์ค๋ ๋๊ฐ ์ฒ๋ฆฌํ๋ ์์ ์, ์๋ช ์ฃผ๊ธฐ ๊ด์ ์์ ๋ณผ ๋ long task ์ short task ๊ฐ ์์
long task์ ๊ฒฝ์ฐ ์ ์ฉ ์ค๋ ๋๋ฅผ ์์ฑํด ์ถฉ๋ถํ ๋์ํ ์ ์์ง๋ง,
short task๋ ์ค๋ ๋ ๊ฐ์๊ฐ ๋ง์์ ธ์ ์ค๋ ๋ ์์ฑ ์ข
๋ฃ ์์
, ๊ฐ ์ค๋ ๋๊ฐ ํ์ํ ์คํ ์์ญ ํฌ๊ธฐ, ์ค๋ ๋ ๊ฐ ์ ํ ๋ถ๋ด ๋ฑ์ ๋ถ๋ด์ด ๋งค์ฐ ์ปค์ง.
๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ ๋ ๊ด๋ฆฌ ์ ๋ต์ด ์กด์ฌ.
์ค๋ ๋ ํ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ณ ์ ์ ์ธ producer-consumer ํจํด.
์ค๋ ๋ ํ ๋ด์ ์ค๋ ๋๋ ํฌ๊ฒ producer-thread ์ consumer-thread๋ก ๋๋์ด ์์
์์
์์ฒด๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ฒด์ ๋ด์ฉ.
struct task
{
void* data;
handler handle;
}
producer-thread๊ฐ ์ฒ๋ฆฌํ ์์
์ ๊ตฌ์กฐ์ฒด ํํ๋ก queue์ ๋ฃ๊ณ ->
queue์ ๋ธ๋กํน ์ํ๋ก ๋๊ธฐํ๋ consumer-thread๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌ.
๋ค์์ ์ค๋ ๋๊ฐ queue์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๋๊ธฐํ๊ฐ ํ์.
์ค๋ ๋ ํ์ ์ ์ ํ ์ค๋ ๋ ์๋ ์ฒ๋ฆฌํ๋ ์์
์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋๋ฐ,
1. CPU ์ง์ฝ์ ์ธ ์์
: '์ฐ์ฐ'์ด ์ฃผ๋ฅผ ์ด๋ฃจ๋ ์์
.
์ค๋ ๋ ์์ CPU ์ฝ์ด์ ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ผํ๋ค๋ฉด ๋ฆฌ์์ค๋ฅผ ์ถฉ๋ถํ ํ์ฉ ๊ฐ๋ฅ
2. ์
์ถ๋ ฅ ์ง์ฝ์ ์ธ ์์
: ์ฐ์ฐ์ ์ ๊ณ ์
์ถ๋ ฅ์ ์๊ฐ์ ๋ง์ด ์ฐ๋ ์์
.
N๊ฐ์ ์ฝ์ด์ ๋ํด WT(waiting time), CT(computation time) ์ด๋ผ๊ณ ํ๋ฉด N * (1 + WT/CT)
๋ผ๋ ๊ณต์.
ํ์ง๋ง ์ ๋ ๊ณต์์ ์๋ค. ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์.
ํ๋ก์ธ์ค ๋ฆฌ์์ค๋ ์ค๋ ๋ ๊ฐ ๊ณต์ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ค๋ ๋ ์ ์ฉ ๋ฆฌ์์ค๋ ๋ฌด์์ด ์์๊น?
์ค๋ ๋ ์ ์ฉ ๋ฆฌ์์ค (thread-private resource)
์ค๋ ๋๋ ์ฌ์ค 'ํจ์ ์คํ' ์ด๋ค.
CPU๋ ์ง์
ํจ์์์ ์คํ์ ์์ํด์ ํ๋์ ์คํ ํ๋ฆ์ ์์ฑํ๋๋ฐ, ์ด๊ฒ์ด ๋ค๋ฆ ์๋ ์ค๋ ๋.
๊ฒฐ๊ตญ ์ค๋ ๋ ์ ์ฉ ๋ฆฌ์์ค๋ ํจ์ ์คํ์ ํ์ํ
์คํ ์์ญ
, ํ๋ก๊ทธ๋จ ์นด์ดํฐ
, ์คํ ํฌ์ธํฐ
, ํจ์ ์คํ ์ ์ฌ์ฉ๋๋ ๋ ์ง์คํฐ ์ ๋ณด
๊ฐ ๋ ์ ์๊ณ , ์ด๋ฅผ ์ค๋ ๋ ์ํฉ ์ ๋ณด (thread context) ๋ผ๊ณ ํ๋ค.
์ด ์ ์ฉ ๋ฆฌ์์ค๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ ๋ชจ๋ ์ค๋ ๋ ๊ฐ์ ๊ณต์ ๋๋ ๋ฆฌ์์ค.
์ฆ, ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์์ '์คํ ์์ญ'์ ์ ์ธํ ๋๋จธ์ง ์์ญ์ ๋ชจ๋ ๊ณต์ ํ๋ค. (๊ฐ๋
์ ์ผ๋ก๋ ๊ทธ๋ ๋ค)
์๋๋ ๋ชจ๋ ๊ณต์ ๋ฆฌ์์ค.
๊ธฐ๊ณ๋ช
๋ น์ด
๊ฐ ์ ์ฅ๋๋ ์์ญ.์ ์ญ ๋ณ์
๊ฐ ์ ์ฅ๋๋ ์์ญ.ํฌ์ธํฐ
๋ง ์ป์ ์ ์๋ค๋ฉด ๋ค๋ฅธ ๋ชจ๋ ์ค๋ ๋๊ฐ ํด๋น ์์ญ์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ๊ณต์ ๋ฆฌ์์ค์ด๋ค.ํฌ์ธํฐ
๋ง ๊ฐ์ ธ์ฌ ์ ์๋ค๋ฉด ์ง์ ์ฝ๊ณ ์ธ ์ ์๋ค.๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ์ฝ๋์ ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ์ ์์ํ ๋ / ์คํ ์ค์ผ ๋ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.์ด๋ฆฐ ํ์ผ
์ ๋ํ ์ ๋ณด๋ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.๋ง์ง๋ง์ผ๋ก ํน์ํ ์ค๋ ๋ ์ ์ฉ ๋ฐ์ดํฐ๊ฐ ์๋ค. ์ค๋ ๋ ์ ์ฉ ์ ์ฅ์ (thread local storage).
__thread int a = 1; // ์ค๋ ๋ ์ ์ฉ ์ ์ฅ์
๊ทธ๋์ ๊ฐ๊ฐ์ ์ค๋ ๋์์ ๋ ์ ์ ์ผ๋ก ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ค๋ ๋ ์์ (thread safe) ์ด๋ ๋ฌด์์ธ๊ฐ
๋ค์ค ์ค๋ ๋์์ ์ค๋ ๋์ ๊ฐ์์ ํธ์ถ ์์์ ๋ฌด๊ดํ๊ฒ ํญ์ ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋๋ ์ฝ๋.
์ด๋ป๊ฒ ํด์ผ '์ค๋ ๋ ์์ 'ํ๊ฐ?
์ค๋ ๋ ๊ณต์ ๋ฆฌ์์ค์ ์ฌ์ฉ์ ์ ์ํด์ผ ํ๋ค.
์ฆ, ์ค๋ ๋ ์ ์ฉ ๋ฆฌ์์ค์ ์ค๋ ๋ ๊ณต์ ๋ฆฌ์์ค๋ฅผ 'ํ์ 'ํ ํ,
ํ์
ํด๋น ๋ฆฌ์์ค์ '์ ์'๋ณด๋ค๋ '์ฌ์ฉ'์ ํตํด ์ ์ฉ ๋ฆฌ์์ค์ธ์ง ๊ณต์ ๋ฆฌ์์ค์ธ์ง ํ์ ํ๋ค.
์ค๋ ๋ ์ ์ฉ ๋ฆฌ์์ค
ํจ์์ ์ง์ญ ๋ณ์, ์ค๋ ๋์ ์คํ ์์ญ, ์ค๋ ๋ ์ ์ฉ ์ ์ฅ์
๋จ, ํจ์ ์ง์ญ ๋ณ์๋ผ๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์ ์ฉ ๋ฆฌ์์ค๊ฐ ์๋ ์ ์๋ค.
์ค๋ ๋ ๊ณต์ ๋ฆฌ์์ค
ํ ์์ญ
๊ณผ ๋ฐ์ดํฐ ์์ญ
์ผ๋ก ๊ตฌ์ฑ๋๋ค๊ณ ํ ์ ์๋ค.์ฒ๋ฐฉ
๊ฐ์ฅ ๋จผ์ , ์ค๋ ๋ ๊ฐ์ ์ด๋ค ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํด์ผ ํ๋์ง ๊ณ ๋ คํด๋ณด๊ณ ,
๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ์ต๋ํ ๊ณต์ ํ์ง ์๋ ๊ฒ์ด ์์น.
๊ณต์ ๋ฆฌ์์ค๋ฅผ ์ด์ฉ ์ ์์ด ์ฌ์ฉํด์ผ ํ๋ค๋ฉด,
์ค๋ ๋ ์ ์ฉ ์ ์ฅ์
ํน์ ์ฝ๊ธฐ ์ ์ฉ
์ผ๋ก ์ ์ธํ๋ค.์์์ฑ ์ฐ์ฐ (atomic operation)
์ ํ์ฉํด ๋ฆฌ์์ค ์ ๊ทผ ์์๋ฅผ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ํผํ๋ค.๋๊ธฐํ ์ ์ํธ ๋ฐฐ์ (mutual exclustion in synchronization)
์ ์ฌ์ฉํ๋ค.์ฝ๋ฃจํด(coroutine)์ด๋
์ฝ๋ฃจํด์ ์ฌ์ฉ์ ์ํ(user mode) ์ค๋ ๋.
์์ ์ ์ด์ ์คํ ์ํ๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ, ๋ค์ ์คํ๋ ๋ ์ด์ ์ ์ผ์ ์ค์ง๋์๋ ์ง์ (์ฐ๊ฒฐ ์์ ์ง์ )์์ ๊ณ์ ์คํ์ด ๊ฐ๋ฅํ ํจ์.
์ฆ, ์ปค๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ํ๋์ ํ๋ก์ธ์ค์์ ์ฌ๋ฌ๊ฐ์ ์คํ ํ๋ฆ์ ๊ฐ์ง ์ ์๋ ๋ฐฉ๋ฒ.
์ฝ๋ฃจํด์ ์ญ์ฌ
์ปค๋ ์ค๋ ๋๊ฐ ์๋ ์์ , ๋์์ฑ์ ๊ฐ์ง๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ธฐ ์ํด ๊ณ ์๋ ๊ฝค ์ค๋๋ ๊ธฐ์ .
์ฝ๋ฃจํด์ด ๊ตฌํ๋๋ ๋ฐฉ๋ฒ
์ค๋ ๋์ ๊ตฌํ๊ณผ ๋ณธ์ง์ ์ผ๋ก ์ฐจ์ด๊ฐ ์๋ค.
์ผ์ ์ค์ง ๋ ๋์ ์ํ ์ ๋ณด์๋ ๋ ๊ฐ์ง
์ผ๋ฐ ํจ์์ ์ํ ์ ๋ณด๋ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ ์ค '์คํ ์์ญ' ์ ํด๋น ํจ์์ ์คํ ํ๋ ์์ ์ ์ฅ๋๊ณ ,
์ฝ๋ฃจํด์ ์ํ ์ ๋ณด๋ 'ํ ์์ญ' ์ ํด๋น ์ฝ๋ฃจํด์ ์คํ ํ๋ ์์ ์ ์ฅํ๋ค.
์ฝ๋ฃจํด์ ์ฅ์
์ฝ๋ฐฑ ํจ์ (callback function) ๋
๋ค๋ฅธ ์ฝ๋์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ์คํ ๊ฐ๋ฅํ ์ฝ๋.
์ฝ๊ฒ ๋งํด, ๋ณ์์ฒ๋ผ ์ ๋ฌํ ์ ์๋ ํจ์.
์ฝ๋ฐฑ ํจ์๊ฐ ํ์ํ ์ด์
// ๋ณ์ ๋ฏธ์ฌ์ฉ
int _sum = 10;
_some_func(10);
int _b = 10 + 1;
// ๋ณ์ a ์ฌ์ฉ
int a = 10;
int sum = a;
some_func(a);
int b = a + 1;
์ฝ๋๋ฅผ ์์ฑํ ๋, ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ์ด ์ฉ์ดํ๋ค.
๋ง์ฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๋ถ๋ถ์์ 10์ ๋ค๋ฅธ ์ซ์๋ก ๋ฐ๊พธ๊ณ ์ถ์ ๋, ์ซ์ 10์ด ์ฌ์ฉ๋ ๋ถ๋ถ์ ์ ๋ถ ๋ฐ๊ฟ์ผ ํ์ง๋ง,
๋ณ์ a๋ฅผ ์ฌ์ฉํ ๋ถ๋ถ์์๋ a์ ๊ฐ๋ง ๋ค๋ฅธ ์ซ์๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
ํจ์์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง.
ํจ์๋ฅผ ๋ณ์์ฒ๋ผ ์ ๋ฌํ ์ ์๋ค๋ฉด(-> ์ฝ๋ฐฑ ํจ์), ์์ ์ ์ํด ์ ๋ฌํด์ฃผ๋ ํจ์์ ๋ด์ฉ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
๋ํ ์ฝ๋ฐฑ์ ์ ๋ฌ ๋ฐ๋ ํจ์๋, ์ฌ๋ฌ ์ข
๋ฅ์ ์ฝ๋ฐฑ์ ๊ด๋ฆฌํ ํ์ ์์ด ๋จ์ํ ์ ๋ฌ ๋ฐ์ ์ฝ๋ฐฑ์ ์คํํด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
// ์ฝ๋ฐฑ ๋ฏธ์ฌ์ฉ (๋ณ์ ๋ฏธ์ฌ์ฉ)
void make_donut()
{
...
if (TeamA) { form_A();}
else if (TeamB) { form_B();}
else if (TeamC) { form_C();}
...
}
// ์ฝ๋ฐฑ ์ฌ์ฉ (๋ณ์ ์ฌ์ฉ)
void make_donut(f)
{
...
f();
...
}
void formed_C() { ... }
make_donut(formed_C);
์ฝ๋ฐฑ ํจ์์ ์ข ๋ฅ
๋๊ธฐ ์ฝ๋ฐฑ
๋น๋๊ธฐ ์ฝ๋ฐฑ
๋น๋๊ธฐ ์ฝ๋ฐฑ์ ํตํ ์๋ก์ด ํ๋ก๊ทธ๋๋ฐ ์ฌ๊ณ ๋ฐฉ์
ํจ์ ํธ์ถ์ ๊ธฐ๋ณธ์,
ํ๋
(request) ํ๋ค.์ฒ๋ฆฌ
(handle) ํ๋ค.๋๊ธฐ ํธ์ถ์ ๊ทธ๋ฅ 1, 2๋ฒ์ ์์ฐจ์ ์ผ๋ก ์คํ.
res = request();
handle(res);
๋น๋๊ธฐ ํธ์ถ์ '์ฒ๋ฆฌ'๋ฅผ ๋ค๋ฅธ ์คํ ํ๋ฆ์์ ์ํํ๋ค.
์ฆ, ์ค์ ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ๋ค๋ฅธ ์ค๋ ๋/ํ๋ก์ธ์ค/์์คํ
์์ ์๋ฃํ ์ ์๋ค.
request(handle)
๋ฌธ์ฅ์ผ๋ก ์ค๋ช
ํ๋ฉด,
"์ฐ๋ฆฌ๋ ์ด๋ค ์ผ
์ ํด์ผ ํ๋์ง ์๊ณ , ์ธ๋ถ ๋ชจ๋์ ์ธ์
ํด์ผ ํ๋์ง ์๋ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ"์ด ์ฝ๋ฐฑ์ด๋ค.
์ด๋ ์๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ์ ์ฉํ๋ค.
์๋ ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋, ํน์ ์๊ธฐ์ ์ด๋ค ์์
์ ์ํํด์ผ ํ๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ.
์ฃผ๋ก ๋คํธ์ํฌ ๋ฐ์ดํฐ ์์ ์ด๋ ํ์ผ ์ ์ก ์๋ฃ์ ๊ฐ์ ์ด๋ค ์ด๋ฒคํธ(event)๊ฐ ๋ฐ์ํ๋ ๊ทธ ์๊ธฐ๋ง์ ์๊ณ ,
์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋(handler)๊ฐ ํ์ํ ๋ ์ฝ๋ฐฑ์ด ์ ์ฐ์ธ๋ค.
-> ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฒคํธ ์ค์ฌ ํ๋ก๊ทธ๋๋ฐ(event-driven programming) ์ ์ ํฉํ๋ค.
๋น๋๊ธฐ ์ฝ๋ฐฑ์ ๋ฌธ์
์ฝ๋ฐฑ ์ง์ฅ(callback hell)
// ๋๊ธฐ ์ฝ๋ฐฑ
service_a = GetServiceA();
service_b = GetServiceB(service_a);
service_c = GetServiceC(service_b);
service_d = GetServiceD(service_c);
// ๋น๋๊ธฐ ์ฝ๋ฐฑ
GetServiceA(function(service_a) {
GetServiceB(service_a, function(service_b) {
GetServiceC(service_b, function(service_c) {
GetServiceD(service_c, function(service_d) {
...
});
});
});
});
๋น๋๊ธฐ ์ฝ๋ฐฑ์ ํจ์จ์ฑ, ๋๊ธฐ ์ฝ๋ฐฑ์ ์ฝ๋ ๋จ์์ฑ๊ณผ ๊ฐ๋์ฑ์ ๋์์ ๋๋ฆด ์ ์๋ ๋ฐฉ๋ฒ? -> ์ฝ๋ฃจํด (2.8์ ์์ ๊ณ์)
๋๊ธฐ
ํ๋
ํ๊ณ , ๊ทธ ์ดํ์ ํ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌ
ํจ.* ์ ํ ํตํ - A๊ฐ ๋งํ๋ฉด B๊ฐ ๋ฃ๊ณ , B๊ฐ ๋ค ๋ค์ผ๋ฉด A๊ฐ ๋ค์ ๋งํ๋ค.
๋น๋๊ธฐ
ํ๋
ํ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ์์
์ ์ด์ด๊ฐ.์ฒ๋ฆฌ
ํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋๊ฐ์ง* ์ด๋ฉ์ผ - A๊ฐ ์์ฑํ๋ ๋์ B๋ ๋ค๋ฅธ ์ผ์ ํ๊ณ , B๊ฐ ํ์ ํ๋ ๋์ A๋ ๋ค๋ฅธ ์ผ์ ํ๋ค.
๋๊ธฐ / ๋น๋๊ธฐ
ํจ์ ํธ์ถ ๊ฒฐ๊ณผ์ ํ๋
๊ณผ ์ฒ๋ฆฌ
์ ๋ฌธ์ .
๋๊ธฐ ํธ์ถ์ ํ๋
๊ณผ ์ฒ๋ฆฌ
์ ๋ํ์ฌ '๊ฐํ๊ฒ ๊ฒฐํฉ' ๋์ด ์๊ณ '์์กด์ '์ธ ๋ฐ๋ฉด, ์ด๋ฐ ์ ์ฝ์ด ์๋ ๊ฒ์ด ๋น๋๊ธฐ ํธ์ถ.
๋๊ธฐ/๋น๋๊ธฐ๋ฅผ ์ธ๊ธํ ๋๋ ๋ฐ๋์ ๋ ๊ฐ์ง ๋์ (caller ์ callee) ์์ชฝ์ ๋ชจ๋ ์๋ฏธ.
๋ธ๋กํน / ๋ ผ๋ธ๋กํน (blocking / non-blocking)
์ค๋ ๋/ํ๋ก์ธ์ค๊ฐ ํจ์ ํธ์ถ ์ CPU ์ ์ด๊ถ
์ ์์คํ๋๋์ ๋ฌธ์ .
ํจ์ ํธ์ถ ์ caller ์ ์ค๋ ๋/ํ๋ก์ธ์ค๊ฐ ์ผ์ ์ค์ง ๋๋ฉด -> ๋ธ๋กํน
๊ทธ๋ ์ง ์๊ณ , callee ๊ฐ ๋ฐ๋ก ๋ฐํ๋์ด caller ์ค๋ ๋/ํ๋ก์ธ์ค๊ฐ ์์
์ ์ด์ด๋๊ฐ๋ฉด -> ๋
ผ๋ธ๋กํน
๋ธ๋กํน
์
์ถ๋ ฅ๊ณผ ๋ฐ์ ํ ์ฐ๊ด.
์
์ถ๋ ฅ์ ๋งค์ฐ ์ค๋๊ฑธ๋ฆฌ๋๋ฐ, ์ด ์๊ฐ์ด CPU์์ ์์๋ ์์ฒญ๋ ์์ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ ์๊ฐ.
๋ฐ๋ผ์ ์ ์ถ๋ ฅ ํจ์ ํธ์ถ ์
ํ๋
์ ์ํด ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ค(๋๊ธฐ) ๋ผ๊ณ ํ๋ฉด,์ฆ, CPU ์ ์ด๊ถ์ ์์คํ๋ค๊ฐ ๋์ฐพ๋ ์๊ฐ ๋์ ์ค๋ ๋/ํ๋ก์ธ์ค๋ ๋ธ๋กํน ๋๋ ๊ฒ.
์ด์์ฒด์ ์
์ฅ์์ ๋๊ธฐ ์
์ถ๋ ฅ ํธ์ถ์๋ ๋ฌด์กฐ๊ฑด ๋ธ๋กํน์ผ๋ก ๋์ํ๋ ๊ฒ์ด ํจ์จ์ .
๋จ, ์๋์ ๊ฐ์ ๋๊ธฐ ์ผ๋ฐํจ์ ํธ์ถ์ ๋ธ๋กํน์ผ๋ก ๋์ํ ํ์๋ ์์.
int sum(int a, int b)
{
return a + b;
}
void func()
{
int r = sum(1, 1);
}
๋ฐ๋ผ์ ๋๊ธฐ ํธ์ถ์ด ๋ฌด์กฐ๊ฑด ๋ธ๋กํน์ ์๋์ง๋ง,
๋ธ๋กํน์ด๋ฉด ๋ฐ๋์ ๋๊ธฐ ํธ์ถ์ด๋ผ๊ณ ํ ์ ์๋ค.
๋ ผ๋ธ๋กํน
๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ถ๋ ฅ ํจ์ ํธ์ถ ์
๊ฒฐ๊ณผ ํ๋
์ ์ํด ๊ธฐ๋ค๋ฆฌ์ง ์๊ฒ ๋ค(๋น๋๊ธฐ) ๋ผ๊ณ ํ๋ฉด,
callee ๋ ์ฆ์ ๋ฐํํ๊ณ caller ์ค๋ ๋๋ CPU ์ ์ด๊ถ์ ์ ์งํ ์ฑ ๊ธฐ์กด ์์
์ ๊ณ์ ์งํํจ.
์ด ๋ ์
์ถ๋ ฅ ๊ณผ์ ์ด ๋ค๋ฅธ ์ค๋ ๋(์ฃผ๋ก ์ปค๋)์์ ๋ณํ๋จ์ผ๋ก ํจ์จ์ .
๊ฒฐ๊ณผ ์ฒ๋ฆฌ
๋ฅผ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ
์ฒ๋ฆฌ
ํจ.์ฒ๋ฆฌ
.์ฒ๋ฆฌ
.์ด๋ฐ ์ ํ์ ์ ์ถ๋ ฅ ์์ ์ ๋น๋๊ธฐ ์ ์ถ๋ ฅ (asynchronous I/O) ์ด๋ผ๊ณ ํจ.
๋จ, CPU ์ ์ด๊ถ์ ์ ์ง(๋
ผ๋ธ๋กํน) ํ๋ค๊ณ ํด๋, ๋ฐ์ดํฐ ํ๋
์ ์ํด caller ์ค๋ ๋๊ฐ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๋ฉด,
์ด๋ ๋
ผ๋ธ๋กํน์ด๋๋ผ๋ ๋๊ธฐ ํธ์ถ์.
์ฆ, ๋
ผ๋ธ๋กํน์ด๋ผ๊ณ ๋ชจ๋ ๋น๋๊ธฐ ํธ์ถ์ ์๋.
* ๋น๋๊ธฐ ํธ์ถ์ด๋ฉด ๋
ผ๋ธ๋กํน์ผ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ๋ฏ.
๊ณ ์ฑ๋ฅ ์๋ฒ๋ฅผ ์ํ ๊ธฐ์
[ํ๋ก์ธ์ค
, ์ค๋ ๋
, ์ฝ๋ฃจํด
] + [๋๊ธฐ
, ๋น๋๊ธฐ
, ๋ธ๋กํน
, ๋
ผ๋ธ๋กํน
] = ๊ณ ์ฑ๋ฅ ์๋ฒ
์์ฒ ๊ฐ ~ ์๋ง ๊ฐ์ ์ฌ์ฉ์ฐจ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ๋ ์๋ฒ์ ๋น๋ฐ.
๋ค์ค ํ๋ก์ธ์ค
process-per-connection
๊ฐ๋จํ๊ณ , ์ฃผ์๊ณต๊ฐ๊ณผ ์ข ๋ฃ์ ๋ํด ์๋ก ๋ ๋ฆฝ์ ์ด๊ณ , ๋ค์ค ์ฝ์ด ๋ฆฌ์์ค ์ถฉ๋ถํ ํ์ฉ ๊ฐ๋ฅ.
ํ์ง๋ง, ํ๋ก์ธ์ค๊ฐ ํต์ ์ ๋น์ฉ์ด ๋ค๊ณ , ์์ฑ๊ณผ ์ข ๋ฃ๊ฐ ์์คํ ์๊ฒ ๋ถ๋ด.
๋ค์ค ์ค๋ ๋
thread-per-connection
์์ฑ ์ข ๋ฃ๊ฐ ๊ฐ๋ณ๊ณ , ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํด์ ํต์ ๋น์ฉ์ด ์๋ค.
ํ์ง๋ง, ๊ฒฝ์ ์ํ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋ฐ ๋ณต์ก๋๊ฐ ๋งค์ฐ ์ฆ๊ฐํ๊ณ , ํ๋์ ์ค๋ ๋์ ๋ฌธ์ ๊ฐ ์๊ฒจ ์ข ๋ฃ๋๋ฉด ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ์ ์๋ ์ํ๋ ์์.
์ผ๋ฐ์ ์ผ๋ก๋ ๋ค์ค ์ค๋ ๋๊ฐ ํจ์ฌ ๋ ์ ๋ฆฌํ ๊ฒฝ์ฐ๊ฐ ๋ง์.
ํ์ง๋ง, ๋งค์ฐ ํฐ ๊ท๋ชจ์ ์์ฒญ (C10K ๋ฌธ์ ๋ฑ)์ ๋ํด์๋ ๋ค์ค ์ค๋ ๋๋ก๋ ๋ถ์กฑ. ์ค๋ ๋๊ฐ ๊ฐ๋ณ๊ธด ํด๋ ๊ทธ ์๊ฐ ๋งค์ฐ ๋ง์์ง๋ค๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถ๋ด์ด ๋๊ธฐ ๋๋ฌธ.
์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ
'๋ณํ' ์ฒ๋ฆฌ๋ฅผ ์ํด์ ํ๋ก์ธ์ค/์ค๋ ๋์๋ง ์์กดํด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ (event-driven programming) ๋ ์ฌ์ฉํ ์ ์์.
์ฃผ๋ก GUI ํ๋ก๊ทธ๋๋ฐ, ์๋ฒ ํ๋ก๊ทธ๋๋ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋จ.
์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ ๊ฐ์ง ํ์ ์์
๊ณ์ํด์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ๋ณต(loop)๋ฅผ ํตํด ๊ณ์ ์์ ํ๊ณ ์ฒ๋ฆฌ(handle)ํด์ผํจ.
์ด ๋ฐ๋ณต์ ์ด๋ฒคํธ ๋ฃจํ(event loop) ๋ผ๊ณ ํจ.
while (true)
{
event = getEvent(); // ์ด๋ฒคํธ ์์ ๋๊ธฐ
handler(event); // ์ด๋ฒคํธ ์ฒ๋ฆฌ
}
ํ์๋๋ ๋ ๊ฐ์ง ๋ฌธ์ .
์ด๋ฒคํธ ์์ค
getEvent()
ํ๋๋ก ์ด๋ป๊ฒ ์ฌ๋ฌ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๊ฐ.
epoll
์ด ๋ํ์ .์ด๋ฒคํธ ์ฒ๋ฆฌ
handler
ํจ์๊ฐ ๊ผญ ๊ฐ์ ์ค๋ ๋์์ ์คํ๋์ด์ผ ํ๋๊ฐ.
์
์ถ๋ ฅ ๋ค์คํ์ ๋ฆฌ์กํฐ ํจํด์ ํ์ฉํ ํ๋ ์์ํฌ๋ฅผ ํ์ ํ๊ณ ๋๋ฉด,
ํ๋ก๊ทธ๋๋จธ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์ (handler) ๊ตฌํ์ ์ง์คํ๋ฉด ๋จ.
์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์ ๊ตฌํ ์ ์ ์ ์ฌํญ.
handler ํจ์ ํ๋์ ์ฌ๋ฌ ๊ฐ์ ์ ์ถ๋ ฅ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์.
์๋ฅผ ๋ค์ด, ๋น์ฆ๋์ค์ ํ์ํ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋์ด ๋ณ๋์ ์๋ฒ์ ๋ฐฐ์นํ๋ ๊ตฌ์กฐ์์, ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ handler ํจ์์ ์ฌ๋ฌ ๊ฐ์ ์๊ฒฉ ํ๋ก์์ ํธ์ถ(remote procedure call: RPC)๊ฐ ๋์์ ์ฌ์ฉ๋์ผ ํ ์ ์์.
์ด๋, ์๊ฒฉ ํ๋ก์์ ํธ์ถ์ ๋ธ๋กํน ํธ์ถ ๋๋ ๋น๋๊ธฐ ํธ์ถ์ ์ด์ฉํด ํธ์ถํ๊ฒ ๋๋ฉด,
CPU ์ปดํจํ
๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๊ฑฐ๋ ์ฝ๋์ ๋ณต์ก๋๊ฐ ๋งค์ฐ ์ฆ๊ฐํ๋ ๋ถ์์ฉ์ด ๋ฐ์.
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ํจ์จ์ฑ๊ณผ ๋๊ธฐ(์ฌ๊ธฐ์๋ ๋ธ๋กํน) ํธ์ถ์ ๋จ์์ฑ์ ๊ฒฐํฉํ ์ ์๋ ๊ธฐ์
-> ์ฝ๋ฃจํด
์ฝ๋ฃจํด์ ๋ณธ์ง์ ์ผ๋ก, ํ์ฌ ์ปค๋ ์ค๋ ๋์ ํ ๋น๋ CPU ์๊ฐ์ ์ฌ์ฉ์ ์ํ์์ 2์ฐจ ํ ๋น ํ๋ ๊ฒ.
์ฆ, "์ฌ์ฉ์ ์ํ ์ค๋ ๋"์ด๋ค.
(๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ํ ์ค๋ ๋๋ ์ปค๋ ์ค๋ ๋๋ณด๋ค ๊ฐ๋ณ๊ณ ์ด์์ฒด์ ์ ๊ฐ์
์์ด ์ค์ผ์ค๋งํ ์ ์๋ค.)
์ด๋ฌํ "์ฌ์ฉ์ ์ํ ์ค๋ ๋" ํ๋์๋ค๊ฐ ์คํ ํ๋ฆ์ผ๋ก handler ํจ์ ํ๋๋ฅผ ์ง์ ํ๋ค.
์ฆ, ์ฌ๋ฌ๊ฐ์ handler ํจ์๋ฅผ ๊ฐ๊ฐ ์ฝ๋ฃจํด์ผ๋ก ์คํํ๋ค.
๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋๊ธฐ ๋ฐฉ์์ผ๋ก ๊ตฌํํด ๋ณต์ก์ฑ์ ํผํ๊ณ , CPU ์ปดํจํ ์๊ฐ์ ๋ญ๋นํ์ง ์๋ ๋น๋๊ธฐ ๋ฐฉ์์ ํจ์จ์ฑ์ ์ป์ ์ ์๋ค.
๋ณ์: ๋ฐ์ดํฐ๋ฅผ ์ง์นญํ๋ ๊ฒ.
ํจ์: ์ผ๋ จ์ ๋ช ๋ น์ด๋ฅผ ์ง์นญํ๋ ๊ฒ.
์ผ๊ธ ๊ฐ์ฒด ํจ์ (first-class function): ํน์ ์ธ์ด์์ ์ฝ๋๋ฅผ ์ผ๋ฐ ๋ณ์์ฒ๋ผ ๋ค๋ฃฐ ์ ์์ ๋ ์ด ์ธ์ด์ ํจ์.
์ฝ๋ฐฑ ํจ์: ํจ์๊ฐ ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋ ๋. (์ธ์๋ ๋ฐํ์ด๋ )
ํด๋ก์ : ์ผ๋ถ ๋ฐ์ดํฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฌถ์ด ๋ณ์๋ก ์ทจ๊ธํ ๊ฒ.
def add():
b = 10 # ์ฝ๋ฐฑ์ ์ ์ํ ๊ณณ์ ๋ฐ์ดํฐ.
def add_inner(x): # ์ฝ๋ฐฑ
return x+b
return add_inner
f = add()
print(f(2))
์ปจํ ์ด๋: ํ๋ก๊ทธ๋จ๊ณผ ํ๋ก๊ทธ๋จ์ด ์์กดํ๋ ์คํ ํ๊ฒฝ์ ํจ๊ป ๋ฌถ์ด๋ ๊ฒ.
๊ฐ์ ๋จธ์ : ๊ฐ์ ๋จธ์ ๊ฐ์์์์ ์คํ๋๋ ์ด์์ฒด์ .
๋ณ์
๋ณ์๋ ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๋ณ์นญ.
a = 100
100 ์ด๋ผ๋ ๋ฐ์ดํฐ๊ฐ '์ด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ'์ ์์ ํ ๋ฐ, ๊ทธ ๊ณต๊ฐ์ ๋ณ์นญ์ a๋ผ๊ณ ํ ๊ฒ.
๋ง์ฝ,
b = a
๋ผ๊ณ ํ๋ฉด, 100 ์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ '๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ' ์ ๋ณต์ ํ๊ณ , ๋ฐ๋ก ๊ทธ ๊ณต๊ฐ์ ๋ณ์นญ์ b๋ผ๊ณ ํ๋ ๊ฒ.
ํฌ์ธํฐ
'๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ'์ '์ด๋ค ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ'์ ์ง๋๊ณ ์์ผ๋ฉด์, ๊ทธ ๊ณต๊ฐ์ ๋ณ์นญ์ ๊ฐ๊ณ ์๋ ๋ณ์.
์ฐธ์กฐ
์ด๋ค ๋ณ์๊ฐ ๋ํ๋ด๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ, ๋ณต์ ํ์ง ์๊ณ ๋ ๋ํ๋ผ ์ ์๋ ๋ณ์.
ํฌ์ธํฐ๋ '๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ'์ ์ง์ ์ ์ผ๋ก ๋ํ๋ด์ง๋ง, ์ฐธ์กฐ๋ฅผ ํตํด์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ์ ์ ์ ์์. ๊ทธ ์ฃผ์์ ๋ด๊ฒจ์๋ ๋ฐ์ดํฐ๋ง ๋ํ๋ผ ์ ์์.
ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ ๊ตฌ์กฐ.
๊ฐ์๋ฉ๋ชจ๋ฆฌ
ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ค๋ฅด๋ค.
-> ํ๋ก์ธ์ค๋ '๊ฐ์ ๋ฉ๋ชจ๋ฆฌ'๋ฅผ ์ฌ์ฉํ๋ค.
์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ '์กฐ๊ฐ(chunk)' ๋จ์๋ก ๊ด๋ฆฌ ๋๋ฉฐ, ๊ฐ ์กฐ๊ฐ์ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ ๊ตฌ์กฐ ์ ์์ญ๋ค์ ์กฐ๊ฐ๋ค๊ณผ '์ฌ์(mapping)' ๊ด๊ณ๋ฅผ ์ง๋๊ณ ์์. ์ด mapping ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ ๊ณณ์ด ํ์ด์ง ํ ์ด๋ธ (page table).
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ/์กฐ์ ํ๋ ค๊ณ ํ๋ฉด, ํ์ด์ง ํ ์ด๋ธ์ ํตํด์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณํ๋๋ ๊ณผ์ ์ด ์ ํ๋์ด์ผ ํจ.
ํจ์๋ ๊ฐ์ฅ ๊ธฐ์ด์ ์ด๊ณ ๊ฐ๋จํ ์ฝ๋ ์ฌ์ฌ์ฉ ๋ฐฉ์.
ํจ์ ํธ์ถ์ 'ํธ์ถ ์์ ๋ ๋ค๋ฅธ ํธ์ถ'์ด ์๊ธธ ์ ์๋๋ฐ, ์ด ํจ์ ํธ์ถ ํ๋์ ์ถ์ ํ๊ธฐ ์ํด 'ํ์
์ ์ถ(LIFO)'์ด ๊ฐ๋ฅํ ์คํ(stack) ์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉ.
์ด๋ค ํจ์๊ฐ ์คํ๋ ๋ ์ฌ์ฉ๋๋ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ๋ด์๋๋ ๊ณณ์ '์คํ ํ๋ ์(stack frame)' ์ด๋ผ๊ณ ํจ. ์ด ์คํ ํ๋ ์๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์ด ํ๋ก์ธ์ค์ '์คํ ์์ญ'.
์คํ ์์ญ์์ ์คํ ํ๋ ์๋ค์ ์์์ ์๋๋ก ์๋๋ค.
์คํ ํ๋ ์
์ด๋ค ํจ์๋ฅผ ์คํํ๊ณ ์๋ค๋ ๊ฒ์ ๊ทธ ํจ์๊ฐ CPU ์ ์ด๊ถ์ ๊ฐ์ง๊ณ ์๋ค๋ ๋ง๊ณผ ๊ฐ์.
๊ทธ๋์ ์ด๋ค ํจ์์ ์คํ ์ค์ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, CPU ์ ์ด๊ถ์ด ์ด์ ๋์ด์ผ ํจ.
CPU ์ ์ด๊ถ์ด ์ด์ ๋๊ณ , ์๋ ์คํ ์ค์ด๋ ํจ์๋ก ๋๋์ ์ค๊ธฐ ์ํด์ ๋ ๊ฐ์ง ์ ๋ณด๊ฐ ํ์ํจ.
๋งค๊ฐ๋ณ์
, ๋ฐํ๊ฐ
, ์ง์ญ๋ณ์
๋ค์ ์ง์ ๋ ๋ ์ง์คํฐ์ ์ ์ฅํ๊ฑฐ๋, ๋ ์ง์คํฐ์ ๊ฐ์๊ฐ ๋ชจ์๋ผ๋ฉด ์คํ ์ค์ธ ํจ์์ ์คํ ํ๋ ์์ ์ ์ฅํด๋๋ค.
์ฌ์ง์ด๋ ์คํ ์ค์ธ ํจ์๊ฐ ์ฌ์ฉ ์ค์ด๋ ๋ ์ง์คํฐ ๊ฐ๋ค์ด ๋ค๋ฅธ ํจ์์ ํธ์ถ๋ก ๋ฎ์ด์์์ง์ง ์๋๋ก, ๊ธฐ์กด ์คํ ํจ์์ ๋ ์ง์คํฐ ์ด๊ธฐ๊ฐ
๋ค์ ๊ทธ ํจ์์ ์คํ ํ๋ ์ ์ตํ๋จ (๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์๋ ์ต์๋จ)์ ์ ์ฅํด ๋๋ค.
์ต์ข
์ ์ผ๋ก ํ ํจ์์ ์คํํ๋ ์์ ํ๋จ->์๋จ์ ์์๋ก ์๋์ ๊ฐ์ด ์ ์ฅ๋๋ค.
๋ ์ง์คํฐ ์ด๊ธฐ๊ฐ
| ์ง์ญ ๋ณ์
| ์ถ๊ฐ ๋งค๊ฐ๋ณ์๋ค
| ๋ฐํ ์ฃผ์
์คํ ํ๋ ์์ ์ ์ฅ๋ ์ ๋ณด๋, ํด๋น ํจ์์ ํธ์ถ์ด ์๋ฃ๋๋ฉด ๋ฌดํจํ(invalidation) ๋จ.
๋ฐ๋ผ์ ํจ์ ๋ฐํ ์ดํ์๋ ๊ทธ ์คํ ํ๋ ์์ ์ ์ฅ๋์๋ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋จ.
๋ง์ฝ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํจ์์ ๊ฑฐ์ณ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด?
-> ๋ฉ๋ชจ๋ฆฌ์ ์๋ช
์ฃผ๊ธฐ๊ฐ ์คํ ํ๋ ์์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ ๊ฒ์ด ์๋๋ผ,
ํ๋ก๊ทธ๋๋จธ์ ์ํด ๊ฒฐ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ธ ํ ์์ญ(heap segment) ์ ์ฌ์ฉ.
์ด ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ํด์ ํด ์ฃผ๋ ์์ ํ๋ก๊ทธ๋จ์ด C/C++ ์์๋ malloc ๋ฉ๋ชจ๋ฆฌ ํ ๋น์.
๋งํฌ ๊ณผ์ ์์ ์๋์ผ๋ก ๋งํฌ๋๋ C ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด ์์.
๋๋ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์
์๋ฆฌ์ ์ดํด๋ฅผ ์ํด ๋๋ง์ malloc ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ๊ตฌํํด๋ณด์.
๋ค์์ ๋ ๊ฐ์ง ํจ์๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค.
malloc
: ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ฒญ. ์ฌ์ฉ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์์ฒญํ๋ฉด ํ ์์ญ์์ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐพ์ ๋ฐํํด์ค.free
: ๋ฉ๋ชจ๋ฆฌ ํด์ ์์ฒญ. ์ฌ์ฉ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ ์๋ฃํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฐํํ์ ๋.๊ทธ๋ฆฌ๊ณ ๋ค์์ ๋ ๊ฐ์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์์ ์ฑ๋ฅ์ ๋ํ ์งํ.
๊ตฌํ์ ํ ๋๋ ์๋์ 4๊ฐ์ง ๋ฌธ์ ์ ๋ํ ๋ต์ ์ฐพ์ ๋๊ฐ๋ฉด ๋๋ค.
1๋ฒ : ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ํ ๋น ์ํ ์ถ์
์ฐ๊ฒฐ๋ฆฌ์คํธ(linked list)๋ฅผ ํ์ฉํ๋ค.
๋จ, ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ๋ค๋ ๋ป์ด๋ฏ๋ก,
ํ ์์ญ ์์ฒด๊ฐ ํ๋์ ์ปค๋ค๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๊ฐ ๋ ์ ์๋๋ก ๊ด๋ฆฌํ๋ค. ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๊ฐ ๋
ธ๋๊ฐ ๋๋ค.
๊ฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ํค๋(header) ์ ๋ณด๋ฅผ ๋์ด์,
๋ฅผ ์ ์ฅํด๋๋ฉด, ํ ๋น ์ํ๋ ์ ์ ์๊ณ ํฌ๊ธฐ๋ฅผ ํตํด ๋ค์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ํค๋์๋ ์ ๊ทผํ ์ ์๋ค.
์ด๋ฐ ์์ผ๋ก ํ ์์ญ ์ ์ฒด๋ฅผ ํ๋์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๊ตฌ์กฐํํด ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ๋ค์ ํ ๋น ์ํ๋ฅผ ์ถ์ ํ๋ค.
2๋ฒ : ํ ๋น ์ ๋ต
์ํฉ์ ๋ง๊ฒ ๋น๊ต/์ ํ ํด์ ์ฌ์ฉํด์ผ ํจ. ์ ๋ต์ ์๋ค.
3๋ฒ : ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ ์ฒ๋ฆฌ
ํ ๋น ์, ์์ฒญ์ ์ ํฉํ ๋๋ถ๋ถ์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์์ฒญ ๋ฐ์ ํฌ๊ธฐ๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ ์ฌ์ ๋ถ๋ถ์ด ์๊น. ์์ฌ ๋ถ๋ถ์ ๋ฌด์ํ๋ค๋ฉด ์ด๋ ๋ด๋ถ ๋จํธํ(fragmentation)๊ฐ ๋ฐ์.
๊ทธ๋์ ๋ณดํต ์ฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ผ๋ก ๋ง๋ค์ด์ ํ์ฉํจ.
4๋ฒ : ๋ฐํ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ
free
์์ฒญ์ ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํค๋ ์ ๋ณด๋ฅผ ์์ ํ๊ณ , '๋ณํฉ' ํด์ผ ํจ.
๋ณํฉํ์ง ์์ผ๋ฉด ์์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ๊ณ์ ๋ถ๋ฆฌ๋์ด ๊ทธ๊ฒ๋ณด๋ค ํฐ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ ๋์ํ ์ ์์.
๋จ, ๋ณํฉ ์๊ธฐ๋ฅผ '๋ฐํ ์ฆ์' ๋๋ 'ํ์ ์(์์ฒญ์ ์ ํฉํ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์์ ๋)' ๋ ์ค ํ๋๋ก ์ ํ ๊ฐ๋ฅ. ๋ฐํ ์ฆ์ ๋ณํฉ์ ๊ตฌํ์ด ๋งค์ฐ ๋จ์ํ์ง๋ง, ์ค์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ ๋๋ถ๋ถ ํ์ ์ ๋ณํฉํ ์ ์๋๋ก ์ผ์ข ์ ์ฐ๊ธฐ ์ ๋ต์ ๊ฐ์ง๊ณ ์์.
๋ํ ํ ์์ญ์ ํค๋ ์ ๋ณด๋ก๋ง ๊ด๋ฆฌํ์ฌ ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๊ตฌ์กฐํ ํ๋ฉด, ๋ณํฉ ์ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์์ ์๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ๊ณผ ๋ณํฉํ๊ธฐ๊ฐ ์ด๋ ค์. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ footer ๋ฅผ ๋๊ณ ํค๋์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋ ์ผ๋ก์จ, ์์์ ์ธ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(doubly linked list)๋ก ํ ์์ญ์ ๊ด๋ฆฌํ๋๋ก ํจ.
๐ ์ฌ๊ธฐ๊น์ง ๋ฉ๋ชจ๋ฆฌ ํ ๋น์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ฅผ ๊ตฌํํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๊ตฌํ ์๋ฎฌ๋ ์ด์
.
์ค์ ๋ก๋ ์ต์ ํ ํ ๊ณณ์ด ๋งค์ฐ ๋ง์ผ๋ฉฐ ์ค๋ ๋ ์์ ๋ฌธ์ ๋ ์๋ค๋ ์ฌ์ค์ ์์ผ๋ฉด ์๋๋ค.
x86 CPU๋ ๋ค ๊ฐ์ง์ privilege level์ ์ ๊ณตํจ: 0
, 1
, 2
, 3
(์ซ์๊ฐ ์์ ์๋ก privilege๊ฐ ์ปค์ง)
๋์ฌ์ ๋ชจ์์ผ๋ก ํํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ protect ring ์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ณ , 0๋จ๊ณ๋ฅผ ๋ณดํต ring 0
๋ผ๊ณ ํจ.
์ผ๋ฐ์ ์ผ๋ก ์์คํ
์ CPU 0๋จ๊ณ์ 3๋จ๊ณ ๋ง์ ์ฌ์ฉ. (1, 2 ๋จ๊ณ๋ ์๋ ์ค๋น ํ๋ก๊ทธ๋จ ์คํ ์ ์ฌ์ฉ)
0๋จ๊ณ (ring 0) ๋ ์ปค๋ ๋ชจ๋(kernel mode), 3๋จ๊ณ๋ ์ ์ ๋ชจ๋(user mode) ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ปค๋ ๋ชจ๋๋ CPU๊ฐ ์ด์ ์ฒด์ ์ฝ๋๋ฅผ ์คํ ํ ๋์ ์ํ์ด๋ค.
๋ชจ๋ ์ฃผ์๊ณต๊ฐ์ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ๋ชจ๋ ํ๋์จ์ด์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
์ ์ ๋ชจ๋๋ CPU๊ฐ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ์คํ ํ ๋์ ์ํ์ด๋ค.
ํฌ๊ฒ ์๊ฐํด์ ์ด์ ์ฒด์ ์ด์ธ์ ๋ชจ๋ ์ฝ๋๊ฐ ์ ์ ์ํ์์ ์คํ๋ ๋ค๊ณ ๋ณด์๋ ๋ฌด๋ฐฉํ๋ค.
๊ทธ๋์ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ํ์ผ ์
์ถ๋ ฅ, ๋คํธ์ํฌ ์
์ถ๋ ฅ๊ณผ ๊ฐ์ ์ด์์ฒด์ ์ ์๋น์ค๋ฅผ ์ฌ์ฉํด์ผ ํ ๋
์์คํ
์ฝ(system call) ์ด๋ผ๋ ์๋ ๋ฐฉ์์ ํ์ฉํ๋ค.
์ด์ ์ฒด์ ๊ฐ ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ํด์, ์ด์ ์ฒด์ ์ ์ด๋ค ์๋น์ค๋ฅผ ์์ฒญํ ์ ์๋ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ์ ๊ณตํด ์ฃผ๋ ๊ฒ์ด๋ค.
์ด๋ฐ ์์คํ
์ฝ์ ๋น์ฐํ ์ด์ ์ฒด์ ์ ๋งค์ฐ ๋ฐ์ ํ ์ฐ๊ด์ด ์๊ณ , ์ด์ ์ฒด์ ๋ณ๋ก ๊ทธ ์ธํฐํ์ด์ค๊ฐ ๋ค ๋ค๋ฅด๋ค.
์ด ์ฐจ์ด๋ฅผ ๊ฐ์ถ๊ณ ์ถ์ํํ๊ธฐ ์ํด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(standard library)๊ฐ ์กด์ฌํ๋ค.
์์คํ
์ฝ์ ์ฌ์ฉํ ์ ์๋ ์ฝ๋๋ฅผ ์ด์์ฒด์ ๋ณ๋ก ๋ฏธ๋ฆฌ ์์ฑํด๋์ด์ ์ ๊ณตํ๋ ๊ฒ.
๊ฒฐ๊ตญ ์ ์ฒด ์์คํ
๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ๋๋ค.
์์ฉ ํ๋ก๊ทธ๋จ
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ด์ ์ฒด์
- ํ๋ ์จ์ด
malloc ๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ ์ฌ์ค ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์๋ ์ฝ๋์ด๋ค.
ํ ์์ญ์ ์ฆ๊ฐ
malloc ๊ณผ ๊ฐ์ ์์ฒญ ์ ํ ์์ญ์ ๋จ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๋ฉด, brk
๋ผ๋ ์์คํ
ํธ์ถ์ ํตํด ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํด์ผ ํ๋ค. brk๋ ํ ์์ญ์ ์ต์๋จ์ ์๋ฏธํ๋ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง ๋ณ์์ด๋ฉด์, ํ ์์ญ ์ฆ๊ฐ๋ฅผ ์์ฒญํ๋ ์์คํ
ํธ์ถ์ ์ด๋ฆ์ด๊ธฐ๋ ํ๋ค.
์ค์ ๋ก ์ด๋ ๊ฒ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋๋ผ๋ ๋ฐ๋ก ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ ๊ฒ์ด ์๋, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ก์๋ง ํ ๋น๋๋ค.
๊ทธ๋ ๊ฒ ํ ๋น๋ ๊ฐ์๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก์ธ์ค๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ page fault
๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด ๋๊ฐ ๋์์ผ ์ด์ ์ฒด์ ๋ ํด๋น ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ์ ๊ด๊ณ๋ฅผ ์ค์ ํจ์ผ๋ก์จ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค.
malloc ์ ๋งค์ฐ ๋ฒ์ฉ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ๋ฒ์ผ๋ก์ ๋ชจ๋ ์ํฉ์ ์ฌ์ฉํ ์ ์๋ ๋์ ์์คํ
์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
๋ฒ์ฉ์ฑ์ด ๋งค์ฐ ๋จ์ด์ง์ง๋ง ์ฆ, ํน์ ์ํฉ์ ๋ํด์๋ง ์ฌ์ฉํ ์ ์๊ฒ ๊ตฌํ๋์์ง๋ง ๋์ ์ฑ๋ฅ์ ๋ฐํํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ๋ฒ์ด ์์๊น? -> ๋ฉ๋ชจ๋ฆฌ ํ (memory pool)
๋ฉ๋ชจ๋ฆฌ ํ
ํ ๋ฒ์ ํฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์์ฒญํ ํ, ๊ทธ๊ฒ์ pool๋ก ๊ด๋ฆฌํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ํ๋ ๋ฐฉ์.
1
์ ๋ํ๋ฉด ์๋์ผ๋ก ํด๋น ์๋ฃํ ํฌ๊ธฐ ๋งํผ์ ๋ค์ ์ฃผ์๋ก ์ด๋ํ๋ค. ์ผ๋ถ๋ฌ ์๋ฃํ ํฌ๊ธฐ ๋งํผ์ ๋ํด์ค ํ์๊ฐ ์๋ค.int a; scanf("%d", a);
๋ผ๊ณ ํ๋ฉด ์๋ชป๋ ์ฌ์ฉ. scanf
ํจ์๋ ๋๋ฒ์งธ ์ธ์๋ก ์ฃผ์ ๊ฐ์ ๋ฐ๋๋ค.0
์ผ๋ก ์ด๊ธฐํ ๋์ด์์ง๋ ์์. ์ด๋ฏธ ํ ๋ฒ ์ฌ์ฉ๋๊ณ ๋ฐํ๋ ์ฃผ์์๋ ์ฐ๋ ๊ธฐ๊ฐ์ด ๋จ์ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ด๊ธฐํ ํด์ฃผ์ด์ผ ํจ.int* arr = (int*)malloc(n * sizeof(int))
๋ผ๊ณ ํ ๋น ๋ฐ์์ ๋ ๊ฐ๋ฅํ ์ธ๋ฑ์ฑ์ arr[0]
๋ถํฐ arr[n-1]
๊น์ง์. arr[n]
์ ์ฐ๊ฒ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์.gets
ํจ์๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์, ํด๋น ๋ฒํผ์ ์์ ์ฃผ์๋ถํฐ ์์์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์๋ ์์. ๋ฒํผ๊ฐ ์ง์ญ๋ณ์๋ผ๋ฉด ์คํํ๋ ์์ ์์นํ๊ณ ๊ทธ ๋ฒํผ์ ํฌ๊ธฐ๊ฐ ์คํ ํ๋ ์์ ๋์ด์๋ฉด ๋ฌธ์ ๋ฐ์. ๋ฒํผ๊ฐ ์คํ ํ๋ ์ ๋ด์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํฌ๊ธฐ๋ฅผ ๋์ด ์คํ ํ๋ ์์ ๋ฐํ ์ฃผ์๋ฅผ ๊ฑด๋๋ฆฌ๋๋ก ํ์ฌ ์
์ฑ ์ฝ๋๋ฅผ ์คํ ์ํค๋ ๊ณต๊ฒฉ ๋ฐฉ์๋ ์์.int p = malloc(); return;
ํด๋ฒ๋ฆฌ๋ฉด ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก์ธ์ค ์ข
๋ฃ๊น์ง ํด์ ํ ๋ฐฉ๋ฒ์ด ์์.perf
๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํด ์ด page fault์ ๋์ํ๋ ์์คํ
์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ํจ์ ํธ์ถ ์คํ ์ ๋ณด๋ฅผ ์ถ์ ํด ๋ณผ ์ ์์.์๋
SSD(Solid State Drive)์ ์คํ์ ํ์ธํด๋ณด๋ฉด sequential reading speed ๊ฐ ์ต๋ 7.5GB/s.
์ด๊ฒ๋ ๋งค์ฐ ๋น ๋ฅด์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ ๋ ๋น ๋ฆ -> 60GB/s.
๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ๋์คํฌ ์ฝ๊ธฐ/์ฐ๊ธฐ์ ์ฐจ์ด
๋ฐ์ดํธ vs ๋ธ๋ก
๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์ ์ง์ ๋จ์๋ ๋ฐ์ดํธ. ๊ฐ ๋ฐ์ดํธ ๋ง๋ค ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ถ์ฌ๋์ด ์๊ณ , CPU๋ ์ด ์ฃผ์๋ก ์ง์ ์ ๊ทผ ๊ฐ๋ฅ.
๋์คํฌ์ ๋ธ๋ก(block) ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ. CPU๊ฐ ํน์ ๋ฐ์ดํธ์ ์ง์ ์ ๊ทผ์ด ๋ถ๊ฐํ๊ณ ๊ทธ์ ๋ฐ๋ผ ๋์คํฌ๋ก ์ง์ ํ๋ก๊ทธ๋จ ์คํ์ด ๋ถ๊ฐ.
๊ฐ์๋ฉ๋ชจ๋ฆฌ์ ์ ํ
32๋นํธ ์์คํ
์ ์ต๋ ์ฃผ์ ๋ฒ์๋ 4GB. 1TB ํฌ๊ธฐ์ SSD๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฐ๋๋ผ๋ ํ๋ก์ธ์ค๋ 4GB ์ด์์ ์ฌ์ฉ ๋ถ๊ฐ.
๋จ 64๋นํธ ์์คํ
์ ์ด ์ ํ์ ๋ํด ์์ธ์ด๊ธด ํจ.
SSD ์ฌ์ฉ ์๋ช
๋ฌธ์
SSD๋ ์๋ช
์ด ์กด์ฌ. ๋ง์น ์๋์ฐจ์ ์ฃผํ๊ฑฐ๋ฆฌ์ ๊ฐ์ ์งํ๊ฐ SSD์์๋ TBW(TeraBytes Written).
์ผ๋ฐ์ ์ผ๋ก ํํ ์ฌ์ฉ๋๋ SSD์ TBW๋ ๋๋ต ์๋ฐฑ TB ์์ค.
SSD๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ์ฉํ๋ค๋ฉด CPU๋ ๋๋์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ ์ฐ๊ธฐ์์
์ ์คํํ๊ธฐ ๋๋ฌธ์ ์๋ช
๋ฌธ์ ์๊ธธ ์ ์์.
SSD๋ฅผ ๋์คํฌ์ ๊ฐ์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ๋น๋ฒํ๊ฒ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ผ์ด ๋ง์ง ์์ผ๋ฏ๋ก ์๋ช
๋ฌธ์ ๋ ๊ฑฐ์ ์์.
์ข ํฉ์ ์ผ๋ก ๋ดค์ ๋, ์ ์ฅ์ฅ์น ์ ์กฐ ๊ธฐ์ ์ ํ๊ณ๋ก, ํ๋์จ์ด ์ํํธ์จ์ด ๋ถ๋ฌธ ๋ ๋ค SSD๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ์ฉํ๋ ์ํฉ์ ๊ณ ๋ คํ์ง ์๊ณ ์์.
CPU๋ ๊ฒฐ๊ตญ ์์ญ์ต ๊ฐ์ ์ค์์น(๊ฐํ์ฅ์น)๋ก ์ด๋ฃจ์ด์ง ์ฅ์น.
ํธ๋์ง์คํฐ๊ฐ ๋ฐ๋ก ๊ทธ ์ค์์น ์ญํ .
๋ ผ๋ฆฌ ํ๋ก
์์์ ์ธ๊ธํ ํธ๋์ง์คํฐ๋ฅผ ๊ฐ์ง๊ณ ๋ค์์ ์ธ ๊ฐ์ง ํ๋ก๋ฅผ ๋ง๋ค ์ ์์.
๋ ผ๋ฆฌ๊ณฑ ๊ฒ์ดํธ(AND gate): ๋ ๊ฐ์ ์ค์์น๊ฐ ๋ชจ๋ ์ผ์ ธ์ผ ์ ๋ฅ๊ฐ ํ๋ฆ.
๋ ผ๋ฆฌํฉ ๊ฒ์ดํธ(OR gate): ๋ ์ค์์น ์ค ํ๋๋ผ๋ ์ผ์ ธ์์ผ๋ฉด ์ ๋ฅ๊ฐ ํ๋ฆ.
๋ ผ๋ฆฌ๋ถ์ ๊ฒ์ดํธ(NOT gate): ์ค์์น๊ฐ ์ผ์ ธ์์ผ๋ฉด ์ ๋ฅ๊ฐ ํ๋ฅด์ง ์๊ณ , ๊บผ์ ธ์์ผ๋ฉด ์ ๋ฅ๊ฐ ํ๋ฆ.
๊ทธ๋ฆฌ๊ณ ์ด ์ธ๊ฐ์ง ํ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์ด๋ค ๋ ผ๋ฆฌ ํจ์๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค. -> ๋ ผ๋ฆฌ์ ์์ ์ฑ
์ด ๋ ผ๋ฆฌ์ ์์ ์ฑ์ ํ ๋๋ก 3๊ฐ์ง์ ๊ธฐ๋ณธ ํ๋ก๋ฅผ ์กฐํฉํ์ฌ ํ๋ก๋ฅผ ๋ง๋ค์์ ๋, ํ๋ก๋ ์๋ ๋ ๊ฐ์ง์ ๊ธฐ๋ฅ์ ์ง๋ ์ ์๋ค.
์ฐ์ฐ ๋ฅ๋ ฅ
๊ฒฐ๊ณผ
์ ์๋ฆฌ ์ฌ๋ฆผ์
๋ฅผ ๊ณ์ฐํ ์ ์๋ ํ๋ก ์กฐํฉ์ ๋ง๋ค๋ฉด ๋๋ค.
๊ฒฐ๊ณผ๋ ๋ฐฐํ์ ๋ ผ๋ฆฌํฉ(XOR) ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ฆฌ ์ฌ๋ฆผ์๋ ๋ ผ๋ฆฌ๊ณฑ(AND) ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ ผ๋ฆฌ์ ์์ ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฐ์ฐ์ ์ํ ํ๋ก ๋ํ ์ ์ฌํ ์๋ฆฌ๋ก ๋ง๋ค์ด ๋ผ ์ ์๋ค.
CPU์์ ์ด๋ฐ ์ฐ์ ์ฐ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ ํ๋ก๋ฅผ ๊ฐ์ง ๋ชจ๋์ด ๋ฐ๋ก ALU(Arithmetic Logic Unit) ์ด๋ค.
์ ์ฅ ๋ฅ๋ ฅ
๋๋จน์(feedback) ํ๋ก๋ฅผ ์ด์ฉํด์, ํ๋ก์ ์ด๋ค action์ ๊ฐํด์ฃผ๋ฉด ํด๋น action์ ๋์๋๋ ์ถ๋ ฅ์ด ๊ณ์ ์ ์ง๋๋๋ก ํ ์ ์๋ค.
์ฆ, ํ ๋ฒ action์ ๊ฐํด์ฃผ๋ฉด ๊ทธ action์ด ์ ์ง๋์ง ์๋๋ผ๋ ์ถ๋ ฅ์ด ํ๋ก์ ์ ์ฅ๋ ๊ฒ์ฒ๋ผ ์ ์ง๋๋ค.
S-R Flip Flop (ํน์ latch)
Set-Reset Flip Flop. latch๋ ๊ฑธ์ , ์๋ฌผ์ ๋ผ๋ ๋ป.
(https://www.youtube.com/watch?v=Hi7rK0hZnfc -> 3๋ถ 55์ด๋ถํฐ ์ฑ
์ ์์์ ๋์ผ)
Set ํ๋ก์ action์ ๊ฐํด์ฃผ๋ฉด 1
์ถ๋ ฅ์ด ์ ์ง๋๋ค.
๊ทธ๋ฆฌ๊ณ Reset ํ๋ก์ action์ ๊ฐํด์ฃผ๋ฉด, 0
์ถ๋ ฅ์ด ์ ์ง๋๋ค.
action์ ๊ฐํ๋ค๋ ๊ฒ์ ์
๋ ฅ์ผ๋ก 0
๋๋ 1
์ ๋ฃ๋ ๋ค๋ ๋ป์ด๋ค.
์ด๋ Active-Low ์ธ์ง Active-High ์ธ์ง์ ๋ฐ๋ผ ๋ค๋ฅธ๋ฐ, ์ฌ๊ธฐ์์ active๋ action์ด ๊ฐํด์ก์ ๋์ ์ํ.
0
์ ํด๋นํ๋ค๋ ๋ป. ์ฆ no-action์ 1, ์ ๋ฅ๊ฐ ํ๋ฅด๋ ์ํ์ด๋ค.1
์ ํด๋นํ๋ค๋ ๋ป. ์ฆ no-action์ 0, ์ ๋ฅ๊ฐ ํ๋ฅด์ง ์๋ ์ํ์ด๋ค.์ฑ
์ ์์๋ Active-Low ์ธ S-R Flip Flop์ด๋ค.
Active-High ์ธ S-R Flip Flop ์ ๋ฐฐํ์ ๋
ผ๋ฆฌํฉ(XOR) ๊ฒ์ดํธ๋ก ๊ตฌ์ฑ๋๊ณ ,
Active-Low ์ธ S-R Flip Flop ์ ๋ถ์ ๋
ผ๋ฆฌ๊ณฑ(NAND) ๊ฒ์ดํธ๋ก ๊ตฌ์ฑ๋๋ค.
์ด์จ๋ ์ด๋ฌํ ์๋ฆฌ๋ก ํ๋ก์ ์ ๋ณด๋ฅผ '์ ์ฅ'ํด๋ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํ๋ก ๊ตฌ์ฑ ์ฌ๋ฌ๊ฐ๋ฅผ ์กฐํฉํด์ ๋ ์ง์คํฐ๋ฅผ ๋ง๋ค ์ ์๊ณ ,
๊ฑฐ๊ธฐ์ 8๋นํธ์ 1๋ฐ์ดํธ๋ผ๋ ๋จ์๋ฅผ ๋ถ์ฌ ๊ฐ ๋จ์์ ์ฃผ์๋ฅผ ์ง์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด ํ๋ก์ ์ ์ฅ๋ ์ ๋ณด๋ ์ ๋ฅ๊ฐ ๋๊ธฐ๋ฉด ์ฌ๋ผ์ง๋ค.
์ ์์ด ๋๊ธด ํ S-R ๊ฐ ํ๋ก๊ฐ non-Activeํ ์ํ๋ก ๋์์ค๋ ์์ ์์์ ์ถ๋ ฅ์ 0
๋๋ 1
๋ก ํ์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. (invalid)
ํ๋์จ์ด์ ์ํํธ์จ์ด์ ์ ์
์ด๋ฌํ ๋
ผ๋ฆฌ ์ฐ์ฐ์ ํ๋์จ์ด์ ๊ธฐ๋ฅ์ด๋ค. ์ฆ, ํ๋์จ์ด์ ๊ธฐ๋ฅ์ ๊ณ ์ ๋์ด ์๋ค.
๋ณํ ์ ์๋ ๊ฒ์ ์ํํธ์จ์ด. '์ด๋ค ๊ฒ์ ์ฐ์ฐ'ํ ๊ฒ์ธ๊ฐ๋ฅผ ์ํํธ์จ์ด๊ฐ ์ ํ๋ฉด ๋๋ค.
์ฆ, CPU๋ '์ฐ์ฐ ๋ฅ๋ ฅ'์ ์ ๊ณตํ๊ณ , ํ๋ก๊ทธ๋๋จธ๊ฐ 'ํผ์ฐ์ฐ์'๋ฅผ ์ ๊ณตํ๋ฉด ๋๋ค.
์ด ๋์ ์ธํฐํ์ด์ค๋ '๋ช
๋ น์ด ์งํฉ'์ด ๋ด๋นํ๋ค.
๋ช
๋ น์ด ์งํฉ(instruction set)์ CPU๊ฐ ์คํํ ์ ์๋ ๋ช
๋ น์ด(opcode)์ ๋ช
๋ น์ด์ ํ์ํ ํผ์ฐ์ฐ์(operand)๋ฅผ ๋ฌถ์ ๊ฒ. ์๋ก ๋ค๋ฅธ ์ข
๋ฅ์ CPU๋ ์๋ก ๋ค๋ฅธ ๋ช
๋ น์ด ์งํฉ์ ๊ฐ์ง๋ค.
์๋ฅผ ๋ค์ด ๋ค์์ 16๋นํธ ์ง๋ฆฌ ๊ธฐ๊ณ ๋ช ๋ น์ด๊ฐ ์๋ค๊ณ ํ๋ฉด,
15 14 13 12 | 11 10 09 | 08 07 06 | 05 04 03 | 02 01 00
0 0 0 1 | 1 1 0 | 0 1 0 | 0 0 0 | 1 1 0
ADD | R6 | R2 | | R6
์ฒ์ 4๋นํธ๊ฐ ๋ช
๋ น์ด ์งํฉ์ ์ํ๋ ์์ญ์ด๋ค.
์ฆ, ์ด ์์์์๋ ๋ช
๋ น์ด ์งํฉ์ด 2^4=16 ๊ฐ์ ๊ธฐ๊ณ ๋ช
๋ น๋ฅผ ํฌํจํ๊ณ ์์ ๊ฒ์ด๋ค.
๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ปดํ์ผ ๋๋ฉด, ์ด๋ ๊ฒ ํด๋น CPU๊ฐ ๊ฐ์ง๋ ๋ช ๋ น์ด ์งํฉ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ธฐ๊ณ ๋ช ๋ น์ด๊ฐ ๋๋ ๊ฒ์ด๋ค.
CPU: central processing unit
ํ๋ก์ ์ฐ์ฐ ๋ฅ๋ ฅ, ์ ์ฅ ๋ฅ๋ ฅ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ํ๋ก์ ์ด๋ค ์ฐ์ฐ์ ์ํํด์ผ ํ๋์ง ์๋ ค์ค ์ ์๋ ๋ช
๋ น์ด ์งํฉ.
ํ์ง๋ง ๊ฐ ํ๋ก๊ฐ ํจ๊ป ์์
ํ ์ ์๊ฒ ์กฐ์ /๋๊ธฐํ ํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ด์ผ ์ ์์ ์ผ๋ก ๋์ ํ ์ ์๋ค.
์ด๊ฒ์ด ๋ฐ๋ก CPU์ clock signal ์ด๋ค.
ํด๋ญ ์ ํธ๊ฐ ์ ์์ ๋ณ๊ฒฝํ ๋ ๋ง๋ค ์ ์ฒด ํ๋ก์ ๊ฐ ๋ ์ง์คํฐ, ์ฆ ์ ์ฒด ํ๋ก ์ํ๊ฐ ๊ฐฑ์ ๋๋ค.
์ด๋ ๊ฒ ์ ์ฒด ํ๋ก๋ฅผ ๋๊ธฐํ ํ ํ์ ์์
์ ์คํํ๊ธฐ๋ฅผ ๋ฐ๋ณตํ๋ค.
ํด๋ญ ์ฃผํ์(clock rate)๋ ์ด ํด๋ญ ์ ํธ๊ฐ 1์ด์ ๋ช ๋ฒ ๋ฐ์ํ๋์ง๋ฅผ ์๋ฏธํ๋ค.
ํด๋ญ ์ฃผํ์๊ฐ ๋์ ์๋ก CPU๊ฐ 1์ด์ ๋ ์์
์ ์ํํ ์ ์๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ํด์,
๋ฅผ ํ ๋ฐ ๊ฐ์ถ ์ฅ๋น๋ฅผ ์ค์ ์ฒ๋ฆฌ ์ฅ์น: CPU ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ค์ ์ปดํจํฐ์ CPU ์ฌ์ฉ๋์ ์๊ฐ๋ณด๋ค ๋์ง ์๋ค.
์ด์ ์ฒด์ ๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์ค๋ง ํ๊ธฐ ์ํด ๊ฐ ํ๋ก์ธ์ค์ ์ฐ์ ์์๋ฅผ ๋งค๊ธฐ๊ณ ๋๊ธฐ์ด์ ํตํด ๊ด๋ฆฌํ๋๋ฐ, ์ด ๋๊ธฐ์ด์ด ๋น์ด์์ ๋, ์ฆ CPU๋ฅผ ์ฌ์ฉํ ํ๋ก์ธ์ค๊ฐ ์์ ๋๋ฅผ ์ ํด ์ํ๋ผ๊ณ ํ๋ค.
์ค๊ณ์ ํธ์๋ฅผ ์ํด ์ด '์ ํด ์ํ๋ฅผ ์ํํ๋' ํ๋ก์ธ์ค๊ฐ ํ๋ ์กด์ฌํ๋ค. ์ด๋ฅผ ์ ํด ์์
์ด๋ผ๊ณ ํ์. ์ด ์ ํด ์์
์ ์ธ์ ๋ ์ค๋น์ํ๋ก, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์๋ก ๋๊ธฐ์ด์ ํญ์ ์กด์ฌํ๋ค.
์ฆ, ์ค์ผ์ค๋ฌ๋ ๋๊ธฐ์ด์ ์ค์ผ์ค๋งํ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์์ ๋ ์ด ์ ํด ํ๋ก์ธ์ค๋ฅผ ์ค์ผ์คํ๊ฒ ๋๋ค.
halt
๊ฒฐ๊ตญ ์ด ์ ํด ์์
์ halt
๋ผ๋ ๊ธฐ๊ณ ๋ช
๋ น์ด๋ฅผ ๋ฃจํ์์์ ๊ณ์ ์คํํ๋ ์์
๊ณผ ๊ฐ๋ค.
halt
๋ CPU๋ฅผ ์ ์ ์ํ๋ก ์ ํํด์ฃผ๋ ๊ธฐ๊ณ ๋ช
๋ น์ด๋ก, ํน๊ถ ๋ช
๋ น์ด์ด๊ธฐ ๋๋ฌธ์ ์ปค๋ ์ํ์์๋ง ์คํ ๊ฐ๋ฅํ๋ค.
sleep ๊ณผ ๊ฐ์ด ํด๋น ํ๋ก์ธ์ค๋ง์ ์ผ์์ค์ง(suspend) ํ๋ ๋ช
๋ น์ด์๋ ๋ค๋ฅด๋ค. halt
๋ ๋ ์ด์ CPU๊ฐ ์คํํ ์ค๋น ์๋ฃ๋ ํ๋ก์ธ์ค๊ฐ ์์ ๋ ์คํ๋๋ค.
์ค์ ๋ก ์ปดํจํฐ ์
์ฅ์์ ๊ฐ์ฅ ๋ง์ด ์คํํ๋ ๋ช
๋ น์ด๋ halt
๋ช
๋ น์ด์ผ ๊ฒ์ด๋ค.
์ธํฐ๋ฝํธ
์์ ๊ฐ์ด halt
๊ฐ ๋ฃจํ ์์์ ๊ณ์ ์คํ๋ ๋, ์ด๋ป๊ฒ ๋น ์ ธ๋์ฌ ์ ์์๊น.
์ปดํจํฐ์์ ์ผ์ ์๊ฐ๋ง๋ค ํ์ด๋จธ ์ธํฐ๋ฝํธ(timer interrupt)๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ๋น ์ ธ๋์ฌ ์ ์๋ค. ๋ฃจํ์์ ๋น ์ ธ๋์ฌ ๊ธฐํ๋ฅผ ์ง์์ ์ผ๋ก ์ฃผ๋ ๊ฒ์ด๋ค.
ํ์ด๋จธ ์ธํฐ๋ฝํธ๋ฅผ CPU๊ฐ ์ธ์ํ๊ณ , CPU๋ ์ด์์ฒด์ ๋ด๋ถ์ ๋ฑ๋ก๋ ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ํจ์๋ฅผ ์คํํ๋ค. ์ด ํจ์๋ ์ง๊ธ ์ค๋น ์๋ฃ๋ ํ๋ก์ธ์ค๊ฐ ์๋์ง ํ์ธํด์ ์๋ค๋ฉด ์ค๋น ์๋ฃ๋ ํ๋ก์ธ์ค๋ฅผ ์คํํ๊ณ , ์๋๋ผ๋ฉด ์ ํด ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์คํํ๋ค.
2์ง๋ฒ์ ์ฌ์ฉํ๋ค.
CPU๋ ํธ๋์ง์คํฐ, ์ฆ ์ผ๊ณ ๋๋ ์ค์์น๋ก ๊ตฌ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ.
unsigned integer
0 ~ 255
.signed integer
1 ~ 7
, -1 ~ -7
, 0
, -0
๋ก ๋๋๋ ์.1 ~ 7
, -1 ~ -8
, 0
)0***** ์์
1***** ์์
<์ฉ์ด>
๋ณด์(่ฃๆธ)๋ ๋ณด์ถฉ์ ํด์ฃผ๋ ์๋ฅผ ์๋ฏธํ๋ค.
์ด๋ฅผํ ๋ฉด 1์ ๋ํ 10์ ๋ณด์๋ 9, 4์ ๋ํ 15์ ๋ณด์๋ 11์ ๊ฐ๋ ์ด๋ค. 1์ ๋ํ 2์ ๋ณด์๋ 1์ด๋ค.1์ ๋ณด์๋ ์์ด๋ก one
s'
complement ์ด๋ค. ์ฌ๋ฌ๊ฐ์ 1์ ๋ํ ๋ณด์๋ผ๋ ์๋ฏธ.
2์ ๋ณด์๋ 2์ ๊ฑฐ๋ญ ์ ๊ณฑ์ ๋ํ ๋ณด์๋ผ๋ ์๋ฏธ.
sign-magnitude
๋ถํธ ๋นํธ๋ง ๋ถ์ด๊ณ ๋๋จธ์ง๋ ์์์ ๋์ผํ ๋นํธ๋ก ํํํ๋ ๊ฒ.
์๋ฅผ ๋ค๋ฉด,
0010
์ด 2
์ด๊ณ ,
1010
์ด -2
์ธ ๊ฒ.
ํ์ง๋ง 0์ ๋ํด -0
์ด ์๊ธฐ๋ ๋ฌธ์ . (0000
, 1000
)
1์ ๋ณด์ (ones' complement)
์์ ํํ์์ ๋ชจ๋ ๋นํธ๋ฅผ ๋ฐ์ ์ํค๋ ๊ฒ.
์ฆ ๋นํธ์ ๊ฐ์ ๋งํผ ์ฑ์์ง 1์ ๋ํ ๋ณด์. (11111111
์ ๋ํ ๋ณด์)
์๋ฅผ ๋ค๋ฉด,
0010
์ด 2
์ด๊ณ ,
1101
์ด -2
์ด๋ค.
ํ์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก 0์ ๋ํด -0
์ด ์๊ธฐ๋ ๋ฌธ์ . (0000
, 1111
)
2์ ๋ณด์ (two's complement)
๋ถํธ ๋นํธ๋ง ๋ถ์ด๊ฑฐ๋ 1์ ๋ณด์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ์ด ์๋ค.
-0
+ 1
= 1
์ด์ด์ผ ํ์ง๋ง1111
+ 0001
= 0000
, ์ฆ 0
์ด ๋๋ค.๊ฒฐ๊ตญ, ์์์ ์์์ ๊ด๊ณ๋ผ๋ ๊ฒ์
๋ฅผ ๋ง์กฑํ๋ ๊ด๊ณ๋ผ๊ณ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์,
์ด๋ฅผ ๋ง์กฑํ๋ฉด์๋ 0
์ ํํํ๋ ๋ฐฉ๋ฒ์ 0000
ํ๋์ธ ํํ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ ๊ฒ.
๋ฐฉ๋ฒ์ ์์์ ์์๋ฅผ ๋ํ์ ๋ ๋ฑ๋ง๊ฒ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋๋ก ํ๋ฉด ๋๋ค.
๋นํธ๊ฐ 4๊ฐ๋ผ๊ณ ํ๋ฉด 0001 + 1111 = (1)0000
๊ฐ "๋ฑ๋ง๊ฒ ์ค๋ฒํ๋ก์ฐ"๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด๊ณ , ๊ฒฐ๊ณผ๋ 0์ด๋ค.
000
(0
)001
(1
)+ 111
(-1
) = (1)000 = 0010
(2
) + 110
(-2
) = (1)000 = 0011
(3
) + 101
(-3
) = (1)000 = 0100
(-4
)000
๊ณผ 100
์ ์๊ธฐ ์์ ์ ์ ์ธํ๊ณ ๋ ๋ฑ๋ง๋ ์ค๋ฒํ๋ก์ฐ (1)000 ๋ฅผ ๋ง๋ค ์๋๊ฐ ์๋ค.)์ด๋ ๊ฒ ์๋ฆฌ ์ฌ๋ฆผ์๋ง ๋ฌด์ํ๋ฉด ๊ฐ์ฐ๊ธฐ๊ฐ ๋ถํธ์ ์ ํ ์ ๊ฒฝ ์ฐ์ง์๊ณ ๊ณ์ฐ์ ์ํํ ์ ์๋ค.
2์ ๋ณด์๋ฅผ ๊ตฌํ๋ ์ง์ ์ ์ธ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค. (4๊ฐ์ ๋นํธ๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ ๊ฐ์ ํ๋ค.)
{x
+ x์๋ํ2์๋ณด์
} = {10000
} ์ ๋ง์กฑํ๋ฉด ๋๋ค.
๊ทธ๋ฐ๋ฐ,
{(x
+ x์๋ํ1์๋ณด์
) + 1
} = {(1111
) + 1
}
{x
+ (x์๋ํ1์๋ณด์
+ 1
)} = {10000
} ์ด๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก 2์ ๋ณด์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์, 1์ ๋ณด์๋ฅผ ๊ตฌํ๊ณ ๊ทธ ๊ฒฐ๊ณผ์ 1
์ ๋ํ๋ฉด ๋๋ค.
(1์ ๋ณด์๋ x์ ๋ชจ๋ ๋นํธ๋ฅผ ๋ฐ์ ์ํจ ๊ฒฐ๊ณผ์ ๋์ผํ๋ค.)
ํ๋ ์ปดํจํฐ๊ฐ 2์ ๋ณด์ ํํ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋,
์ด๊ฒ์ด ์ฌ๋์๊ฒ ์ง๊ด์ ์ด์ง ์์ ์๋ ์์ด๋ "ํ๋ก ์ค๊ณ๋ฅผ ๋จ์ํ"ํ ์ ์๊ฒํ๊ธฐ ๋๋ฌธ.
2
(0010
)์ -2
(1110
)๋ฅผ ๋ํ ๋ ๊ฐ์ฐ๊ธฐ๋ ์ด๋ค์ด ์์์ธ์ง ์์์ธ์ง ์ ํ ์ ๊ฒฝ์ฐ์ง ์๋๋ค.
๊ทผ๋ณธ์ ์ผ๋ก 0010
๊ณผ 1110
์ด๋ผ๋ ํํ/์ํ/์ซ์๋์ด ์ด ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๋์ง ์กฐ์ฐจ ์ดํดํ์ง ๋ชปํ๋ค. ๊ทธ์ ๋ ๋นํธ์ ๋ฐฐํ์ ๋
ผ๋ฆฌํฉ(XOR) ์ฐ์ฐ์ด ๋ง์
์ ๊ฒฐ๊ณผ์ด๊ณ , ๋
ผ๋ฆฌ๊ณฑ(AND)์ด ์๋ฆฌ ์ฌ๋ฆผ์๋ผ๋ ๊ฒ๋ง ์๊ณ ์ํํ ๋ฟ์ด๋ค.
์ด๋ ์ง๊ทนํ ๋จ์ํ ์ฐ์ฐ์์
๋ง์ ๊ณ์ํด์ ์ํํ๋ ํ๋์จ์ด์ ๋์์ด๋ค.
ํด์ํ๊ณ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ "์ํํธ์จ์ด"์ ์์ญ์ด๋ค.
if
๋ฌธ์ ๋ง๋ฌ์ ๋ํ์ดํ๋ผ์ธ (pipeline)
์์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ์์๊ฐ ์๋ ์ฌ๋ฌ ๋จ๊ณ๋ก ๋๋ ๋ค์,
์ ํตํด ์ ์ฒด์ ์ธ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋์ด๋ ๊ฒ. ๋จ, ์์ ๋จ์ ๋น ์ฒ๋ฆฌ์๊ฐ์ ๋์ผํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ฐจ ๊ณต์ฅ์์ ์๋์ฐจ ํ ๋๊ฐ ์์ฑ๋๋ ๋ฐ์ 80๋ถ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ํ์. ์์ฐ ๊ณผ์ ์ ๋จ ํ๋์ ํ์ด ๋งก์์ ์ฒ๋ฆฌํ๋ค๊ณ ํ๋ฉด ์ฌ์ ํ 80๋ถ์ 1๋๊ฐ ์์ฐ๋์ง๋ง, ์์ฐ ๊ณผ์ ์ 4๋จ๊ณ๋ก ๋๋์ด ๊ฐ ๋จ๊ณ์์ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋จ๊ณ๋ก ์ฌ์ง์๊ณ ๋๊ธฐ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก 20๋ถ์ 1๋๊ฐ ์์ฐ๋ ์ ์์ผ๋ฏ๋ก 80๋ถ์ 4๋๋ฅผ ์์ฐํด๋ผ ์ ์๋ค. ํ์ง๋ง ์๋์ฐจ 'ํ ๋'๊ฐ ์์ฑ๋๋ ๋ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ฌ์ ํ 80๋ถ์ด๋ค.
CPU๊ฐ ์ฌ์ฉํ๋ ํ์ดํ๋ผ์ธ
CPU ๋ํ ํ์ดํ๋ผ์ธ์ ์ด์ฉํด์ ๊ธฐ๊ณ ๋ช ๋ น์ด์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋์ธ๋ค.
ํ๋์ ๊ธฐ๊ณ ๋ช ๋ น์ด ์ฒ๋ฆฌ๋ฅผ ์ํด์ ๋ค์์ 4๋จ๊ณ๊ฐ ์กด์ฌํ๋ค.
๊ฐ ๋จ๊ณ๋ ๋ณ๋์ ํ๋์จ์ด๋ก ์ฒ๋ฆฌ๋๋ค.
if
๊ฐ ํ์ดํ๋ผ์ธ์ ๋ง๋๋ฉด
if
๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ๋ฌ๊ฐ '์กฐ๊ฑด๋ถ ์ ํ ๋ช
๋ น์ด'๋ก ๋ณํํ๋ค.
์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ์ ํํ๊ณ , ๊ฑฐ์ง์ด๋ผ๋ฉด ์์ฐจ์ ์ผ๋ก ์คํ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ด '์กฐ๊ฑด๋ถ ์ ํ ๋ช ๋ น์ด'๊ฐ '์คํ' ๋์ด์ผ ์ ํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ์ ์๊ณ , ํ์ดํ๋ผ์ธ์ ์ด๋ค ๋ช ๋ น์ด๋ฅผ ๋ฃ์์ง๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ ์กฐ๊ฑด๋ถ ์ ํ ๋ช ๋ น์ด๊ฐ ์คํ๋ ๋ ๊น์ง ํ์ดํ๋ผ์ธ์ ๋ช ๋ น์ด๋ฅผ ๋ฃ์ง ์๋๋ค๋ฉด ํ๋ก์ธ์์ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๋ ๊ผด์ด ๋๋ค.
๊ทธ๋์ ์กฐ๊ฑด๋ถ ์ ํ ๋ช ๋ น์ด์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์๊ธฐ ์ , ํ์ดํ๋ผ์ธ์ ์ด๋ค ๋ช ๋ น์ด๋ฅผ ๋ฃ์ด์ฃผ์ด์ผ ํ ์ง๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด CPU๋ ๋ถ๊ธฐ ์์ธก (branch prediction) ์ ํ๋ค. ์ด ์์ธก์ ํตํด ๋ถ๊ธฐ ๊ฒฐ๊ณผ ๋์ถ ์ ํ์ดํ๋ผ์ธ์ ์์ ๋ช ๋ น์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ฃ์ด๋๊ณ , ์์์ด ๋ง์๋ค๋ฉด ๊ทธ๋๋ก ์คํ์, ํ๋ ธ๋ค๋ฉด ์๋ชป๋ ๋ถ๊ธฐ ๋ช ๋ น์ด๋ฅผ ๋ชจ๋ ๋ฌดํจํ ํ๋ค. ๊ฒฐ๊ตญ ๋ถ๊ธฐ ์์ธก์ ์คํจํ๋ฉด ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ ๊ฒ.
ํ๋์ CPU ๋ถ๊ธฐ ์์ธก์ ๊ต์ฅํ ๋ฐ๋ฌ๋์ด ์๊ธด ํ๋, ๋์ ์ฑ๋ฅ์ ์๊ตฌํ๋ ์ฝ๋์ if๋ฌธ์ด ์๋ค๋ฉด CPU๊ฐ ๋ถ๊ธฐ ์์ธก์ ์ฑ๊ณตํ ํ๋ฅ ์ด ๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ํ์๊ฐ ์๋ค. C++์ likely/unlikely
๋งคํฌ๋ก๋ ์ด๋ฐ ์ด์ ์์ ์กด์ฌ ํ๋ฉฐ, ์ปดํ์ผ๋ฌ์ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ ๋ถ๊ธฐ๋ฅผ ์๋ ค์ค๋ค.
CPU์ ๊ตฌํ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ผ๋ก CPU๋ฅผ ๋ ์ ํ์ฉํ๋ ์ฝ๋๋ฅผ ์งค ์ ์๋ค.
CPU ์ฝ์ด ์์ ์ค๋ ๋ ์ ์ฌ์ด์๋ ์ด๋ค ํ์ฐ ๊ด๊ณ๋ ์๋ค.
ํ๋์จ์ด๋ ์ง๊ทนํ ๋จ์ํ ์ฐ์ฐ์์
๋ง์ ๊ณ์ํด์ ์ํํ ๋ฟ์ด๋ค.
ํด์ํ๊ณ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ๊ฒ์ "์ํํธ์จ์ด"์ ์์ญ์ด๋ค.
๋จ์ผ ์ฝ์ด๋ ๋ค์ค ์ฝ์ด๋ ํ๋ก๊ทธ๋จ์ ํ์์ ๋ฐ๋ผ ์ค๋ ๋๋ฅผ ์ผ๋ง๋ ์ง ๋ง์ด ๋ง๋ค์ด์ ์ฌ์ฉํ ์ ์๋ค.
๋ค๋ง,
์ค๋ ๋์ ์๊ฐ ๋๋ฌด ๋ง์์ง ๊ฒฝ์ฐ ์ค๋ ๋ ๊ฐ ์ ํํ๋ ๋ถ๋ด์ด ์ฆ๊ฐํ๋ ๊ฒ์ ์ ์ํด์ผ ํ๋ค.
์ฝ์ด๋น ์ค๋ ๋์ ๊ฐ์๋ ๋จ์ํ ์์นํ ํ๊ธฐ๊ฐ ์ด๋ ต๊ณ ์ค์ ๋ก ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ์ฌ ์ํฉ์ ๋ฐ๋ผ ์ง์์ ์ผ๋ก ํ ์คํธํด์ผ ํ๋ค.
CPU๊ฐ ํ๋ ์ผ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ช
๋ น์ด๋ฅผ ์ฝ์ด ์คํํ๋ ๊ฒ ๋ฟ.
๊ทธ๋ ๋ค๋ฉด CPU์ '๋ฅ๋ ฅ ๋ฒ์'๋ ๊ฒฐ๊ตญ '์ด๋ค ๋ช
๋ น์ด๋ฅผ ์คํํ ์ ์๋์ง'์ ๊ฐ๋ค๊ณ ๋ณผ ์ ์์.
์ด๋ฅผ ๋ช
๋ น์ด ์งํฉ(instruction set)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ช ๋ น์ด ์งํฉ์ ๋ํด ๊ธฐ์ตํด์ผํ ์ฌ์ค.
๊ฐ์ฅ ์ฒ์์ผ๋ก ๋ฑ์ฅํ CISC(Complex Instruction Set Computer)๋ถํฐ ์ดํด๋ณด์.
(x86 ๊ตฌ์กฐ๋ ์ด CISC์ ๊ธฐ์ด๋ฅผ ๋๊ณ ์๋ค)
CISC
"๋ณต์ก ๋ช ๋ น์ด ์งํฉ", ์ฆ CISC์ ํ์์ด ํ์ฐ์ ์ด์๋ ์ด์ .
๋๋ถ์ด, ๋ง์ดํฌ๋ก์ฝ๋(microcode) ๋ผ๋ ์ํํธ์จ์ด๋ฅผ CPU ์ค๊ณ์ ๋์ ํ๋ค.
์ด ์๊ธฐ CPU ๋ช
๋ น์ด ์งํฉ์ ๋ชจ๋ 'hardwired' ๋์ด ์์๋ค. IF, ID, EX ๋ฑ ๊ฐ ๋จ๊ณ๊ฐ ํน์ ์กฐํฉ ํ๋ก๋ก ์ง์ ์ ์ด๋๋ ๊ฒ.
์ด๋ ๋ช
๋ น์ด ์คํ์๋ ๋งค์ฐ ํจ์จ์ ์ด๋ ์ ์ฐ์ฑ์ด ๋งค์ฐ ๋จ์ด์ ธ ๋ช
๋ น์ด ์์ ์๋ ๋์ํ๊ธฐ ํ๋ค์์.
๊ทธ๋์, ๋ช
๋ น์ด ์งํฉ์ ๊ณตํต๋๋ ์ฐ์ฐ์ ์ ์ํด๋ ์์ ํ๋ก๊ทธ๋จ์ ์ ์ํด์ ์ด๋ฅผ CPU์ ์ ์ฅํด๋ ์ผ๋ก์จ ๋ชจ๋ ๊ธฐ๊ณ ๋ช
๋ น์ด์ ๋ํด ์ ์ฉ ํ๋ก ์ค๊ณ๋ฅผ ํ์ง ์๋๋ก ํจ.
๋ณต์กํ ํ๋์จ์ด ๋ณ๊ฒฝ ๋์ , ๋น๊ต์ ์ฌ์ด ์ํํธ์จ์ด ๋ณ๊ฒฝ์ ํตํด ๋ช
๋ น์ด ์งํฉ์ ๋ณ๊ฒฝ์ ๋์ํ๋๋ก ํ ๊ฒ.
ํ์ง๋ง ์ด๋ฌํ ๋ง์ดํฌ๋ก์ฝ๋๋,
-> ์๋ก์ด ์ค๊ณ์ ๋ํ ํ์๊ฐ ๋๋๋์์.
CISC ๋ ํ์ ๋ ์์์ ์๋์ ์ ์ํ ๊ฒฐ๊ณผ๋ก ํ์ํ ๊ฒ.
์๊ฐ์ด ์ง๋๋ฉด์ ๋ฉ๋ชจ๋ฆฌ์ ์ปดํ์ผ๋ฌ ๊ธฐ์ ์ด ๋ฐ์ ํ๊ณ , ๋ณต์ก ๋ช
๋ น์ด์ ๋ด๋ถ์ ๋ณต์ก์ฑ(๋ช
๋ น์ด๊ฐ ์ค์ ๋ก ์ํํ๋ ์์
์ ๋ณต์ก์ฑ)์ ๋นํจ์จ ๊ทธ๋ฆฌ๊ณ ๋ง์ดํฌ๋ก์ฝ๋์ ๋นํจ์จ์ด ์ ์ฐจ ๋ถ๊ฐ๋จ.
RISC
"์ถ์ ๋ช ๋ น์ด ์งํฉ"์ ํ์. ๊ทธ๊ฒ์ด ๊ฐ์ง๋ ํน์ฑ
์๋ฅผ ๋ค์ด ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ A, B์ ์ ์ฅ๋ ๋ ์ซ์๋ฅผ ๊ณฑํ๋ ์์ ์ ํด์ผ ํ๋ค๊ณ ํ๋ฉด,
๋ณต์ก ๋ช ๋ น์ด ์งํฉ์
MULT A B
ํ๋๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ถํฐ ์ฐ์ฐ๊น์ง ๋ชจ๋ ์ํํ ์ ์๋ค.
๋ฐ๋ฉด, ์ถ์ ๋ช ๋ น์ด ์งํฉ์
LOAD RA, A
LOAD RB, B
PROD RA, RB
STORE A, RA
์ด๋ฐ ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๊ณผ ์ฐ์ฐ์ ๋จ๊ณ๋ฅผ ๊ฐ๋จํ ๋ช ๋ น์ด๋ค์ ์ฌ์ฉํ์ฌ ๋จ๊ณ๋ณ๋ก ์์ฑํด์ฃผ์ด์ผ ํ๋ค.
๋ณต์ก ๋ช
๋ น์ด ์งํฉ์ ๋ช
๋ น์ด ์ฌ์ด์ ๋น๊ต์ ์ฐจ์ด๊ฐ ์ปค์ ์คํ ์๊ฐ์ด ๊ณ ๋ฅด์ง ์๋ค. -> ํ์ดํ๋ผ์ธ ๋ฐฉ์ ํ์ฉ ์ด๋ ค์.
ํ์ง๋ง ์ถ์ ๋ช
๋ น์ด ์งํฉ์ฒ๋ผ ๊ฐ๋จํ ๋ช
๋ น์ด ์ฌ๋ฌ๊ฐ๋ฅผ ์ฌ์ฉํด์ ์์
์ ํ์ด์ฐ๋ฉด, ๊ฐ ๋ช
๋ น์ด๊ฐ ๋งค์ฐ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ์คํ ์๊ฐ์ด ๋ชจ๋ ๊ฑฐ์ ๋์ผํด์ง ์ ์๋ค. -> ํ์ดํ๋ผ์ธ ๊ธฐ์ ์ ๋์
ํ๊ธฐ ์์ฃผ ์ข์.
CISC ์ง์์์ ๋จ์ ์ ๊ฐ์ .
๋ ์ง์์ ์๋ก ์ฅ์ ์ ์ทจํ๊ณ ์ฝ์ ์ ๋ณด์ํ๋ฉด์ ๋์ ์์ด ๋ฐ์ ์ค.
CISC๋ ์ ์ RISC ๋ช
๋ น์ด์ ๊ฐ๊น์ ์ง๊ณ ์๊ณ , ์ผ๋ถ ๊ณ ์ฑ๋ฅ RISC๋ ๋ง์ดํฌ๋ก๋ช
๋ น์ด๋ฅผ ์ฑํํ๊ณ ์์.
๋ค๋ง ์์ง๋ ๋ถ๋ช
ํ ์ฐจ์ด๊ฐ ์กด์ฌํ๋๋ฐ,
์ง๊ธ๊น์ง๋ ๊ธฐ์ ์ ๊ด์ . ์์ ์ ๊ด์ ์์์ ๋ ์ง์์ ๋๊ฒฐ ๋ํ ์กด์ฌ.
context
๋ ์ง์คํฐ๋ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฆ. ๋์ ์ ์กฐ ๋น์ฉ์ด ๋น์ธ์ ์ฉ๋์ ํ๊ณ๊ฐ ์์.
ํ๋ก๊ทธ๋จ ์คํ ์ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ CPU๊ฐ ์ฌ์ฉํ ๋๋ง ๋ ์ง์คํฐ์ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ด.
ํ๋ก๊ทธ๋จ ์คํ ์, ํน์ ์์ ์์ ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ผ๋ฐ์ ์ผ๋ก '์ํฉ ์ ๋ณด'(context) ๋ผ๊ณ ํจ.
์๋๋ ํ๋ก๊ทธ๋จ ์คํ์ ์ํด ์ฌ์ฉ๋๋ ๋ํ์ ์ธ ๋ ์ง์คํฐ๋ค -> ์ฆ context
์ด๋ฌํ context ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ ์ผ์ ์ ์งํ๊ณ ์ฌ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํจ.
CPU๋ ๋ค์๊ณผ ๊ฐ์ 4๊ฐ์ง ์ํฉ์์ ๋ถ๊ฐํผํ๊ฒ '์์ฐจ์ ์ธ ํ๋ฆ' ์์ ๋ฒ์ด๋๊ฒ ๋๊ณ , ์ด ๋ context์ ์ ์ฅ๊ณผ ๋ณต์์ด ํ์ํจ.
ํจ์ ์คํ
์์คํ
์ฝ
์ธํฐ๋ฝํธ ์ฒ๋ฆฌ
์ค๋ ๋ ์ ํ
์ ์ฅ๊ณผ ๋ณต์
์ 4๊ฐ์ง ์ํฉ์ ๊ตฌํ์ CPU context์ ์ ์ฅ/๋ณต์์ด ํ์์ ์ด๊ณ ์ด๋ ์คํ๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์์ฑ๋๋ค.
์ค์ฒฉ ๊ตฌ์กฐ์๋ ์คํ (stack)์ด ๊ฐ์ฅ ์ ํฉํ๋ค.
โ (A๋ฅผ ์คํํ๋ ๊ณผ์ ์์ B๋ฅผ ์คํํด์ผ ํ๋ ์ํฉ)
์คํ์ ์ผ์ข
์ ๋งค์ปค๋์ฆ์ผ ๋ฟ์ด๋ฏ๋ก, ์ด๋ฅผ ์ํํธ์จ์ด๋ก ๊ตฌํํ๋ ํ๋์จ์ด๋ก ๊ตฌํํ๋ ์๊ด ์์.
๊ทธ๋ ๋ค๋ฉด ๊ฐ ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ context๋ฅผ ์ ์ฅ/๋ณต์ ํ๊ณ ์์๊น.
ํจ์ ์คํ
์ ๋ฆฌํ๋ฉด,
์์คํ
์ฝ
์ ๋ฆฌํ๋ฉด,
์ธํฐ๋ฝํธ ์ฒ๋ฆฌ
์ ๋ฆฌํ๋ฉด, (์ปค๋ ์คํ ์ฌ์ฉ ์)
์ค๋ ๋ ์ ํ
task_struct
๊ฐ ์กด์ฌํ๊ณ , ๊ทธ ์์ thread_struct
๊ฐ ํด๋น ์ค๋ ๋์ CPU context๋ฅผ ์ ์ฅํ๋ ์ญํ .์ ๋ฆฌํ๋ฉด,
task_struct -> thread_struct
์ context๋ฅผ ์ ์ฅํ๊ณ ,task_struct -> thread_struct
์์ ์ฝ์ด CPU์ ๋ณต์ํ๊ณ ,CPU ~ ๋ฉ๋ชจ๋ฆฌ
ํฐ ๋
ธ์ด๋ง ๊ตฌ์กฐ์์, CPU๊ฐ ์คํํ๋ ๊ธฐ๊ณ ๋ช
๋ น์ด์ ๊ทธ ๋ช
๋ น์ด๊ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด์์ด์ผ ํ๋ค.
๋ค์ ๋งํด, CPU๋ ๋น๋ฒํ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด ๋ช
๋ น์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๊ณ , ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋กํด์ผ ํ๋ค.
๋ฌธ์ ๋ ์๋.
CPU์ ์ฐ์ฐ์๋๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ ์๋๊ฐ ํจ์ฌ ๋๋ฆฌ๋ค. ์ด๋ฌ๋ฉด CPU์ ๋น ๋ฅธ ์ฐ์ฐ์ ์ถฉ๋ถํ ํ์ฉํ ์ ์๋ค.
ํด๊ฒฐ์ CPU๊ฐ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ณ ์ฐ์ง ์๋๋ก ํ๋ ๊ฒ. ์ค๊ฐ์ ์บ์ ๊ณ์ธต์ ๋๋ค.
x86 ์ํคํ ์ฒ์์๋ L1, L2, L3 ์ ์บ์ ๊ณ์ธต์ด ์๋ค.
์ด๋ ๊ฒ ์บ์ ๊ณ์ธต์ ๋๋ฉด ๋ฐ์ดํฐ ์กฐํ ์ฑ๋ฅ์ด ๊ฐ์ ๋์ง๋ง, ๋ฐ์ดํฐ ๊ธฐ๋ก ์์๋ ๊ฐฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
์บ์์ ๋ฐ์ดํฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ inconsistent(๋ถ์ผ์น)ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ ๋ฐฉ์์ ๋๊ธฐ์ ์ค๊ณ์ ๋น๋๊ธฐ์ ์ค๊ณ๊ฐ ์๋ค.
write-through
: ์บ์๋ฅผ ๊ฐฑ์ ํ ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ. ๋ถํ์ํ ๋๊ธฐ์๊ฐ ๋ฐ์.write-back
: ์ผ๋จ ์บ์๋ง ๊ฐฑ์ ํ๊ณ , ์ฉ๋ ๋ถ์กฑ์ผ๋ก ์บ์๊ฐ ํด์ ๋ ๋๊ฐ ๋๋ฉด ๊ทธ ์บ์์ ๋ฐ์ํ๋ ์์ ์ฌํญ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐฑ์ .๋ค์ค ์ฝ์ด์ ๊ฒฝ์ฐ, ์บ์-๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๊ฐฑ์ ๋ฟ๋ง ์๋๋ผ ๊ฐ ํ๋ก์ธ์ ์บ์๋ค ๊ฐ์ ์ผ๊ด์ฑ๋ ์ ์ง๋์ด์ผ ํ๋ค.
์ต์ CPU์๋ ๊ณ ์ ์ ์ธ MESI protocol ๊ฐ์ ๊ฒ์ผ๋ก ๋ค์ค ์ฝ์ด์ ์บ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ค. ๋ฌผ๋ก ๊ท์น ์ ์ฉ์ ์ํด์๋ ์ฑ๋ฅ์ ๋๊ฐ๊ฐ ๋ฐ๋ฅธ๋ค.
๋ฉ๋ชจ๋ฆฌ ~ ๋์คํฌ
๋ฉ๋ชจ๋ฆฌ์ ๋์คํฌ ๊ฐ์ ์๋ ์ฐจ์ด๋ ์กด์ฌํ๋ค. ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๋๋ ๋์คํฌ ํ์ ์๋๋ณด๋ค 10๋ง๋ฐฐ ๊ฐ๋ ๋น ๋ฅด๋ค.
๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์์ฒด๋ฅผ ๋์คํฌ์ ์บ์๋ก ์ฌ์ฉํ๋ค.
(๋ฐ๋ก ๊ณ์ธต์ ์ถ๊ฐํ์ง ์๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฉ๋์ด ์บ์๋ก ์์ฉํ๊ธฐ์ ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ)
์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋ฅ ์ 100%์ ๋๋ฌํ์ง ์๊ธฐ ๋๋ฌธ์, ์ฌ์ ๊ณต๊ฐ์ ๋์คํฌ๋ฅผ ์ํ ์บ์๋ก ํ์ฉํ๋ค. ์ด๊ฒ์ด ๋ฆฌ๋ ์ค์์ 'ํ์ด์ง ์บ์'์ ๊ธฐ๋ณธ ์๋ฆฌ.
์ฌ๊ธฐ์๋ ๋น์ฐํ '๊ฐฑ์ ๋ฌธ์ ' ์ฆ inconsistency ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ์ํด ์ฌ๋ฌ ์
์ถ๋ ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ sync
, flush
๊ฐ์ ํจ์๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ inconsistency๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๊ฒฉ์ด ์ ๋ ดํด์ง๋ฉด์, ์๋ฒ์์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋์คํฌ๋ฅผ ๋์ฒดํ๋ ํ๋ฆ์ด ์๋ค.
(AWS ์์ 2TB ์ง๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ instance๋ฅผ ์ ๊ณต)
ํ์ง๋ง ์ด๋ "์ฉ๋ ๋๋ฌธ์ ๋์คํฌ์ ์์กดํด์ผ ํ๋ ์ํฉ"์ ํด๊ฒฐํ ๊ฒ์ด๊ณ , ์์์ฑ์ ๋ํ ์์กด์ ๋จ์์๊ธฐ ๋๋ฌธ์ ์์ ํ ๋์ฒด๋ ๋ถ๊ฐ๋ฅํ๋ค.
๊ฐ์๋ฉ๋ชจ๋ฆฌ์์ swap-in/out ์ ๋์คํฌ๋ฅผ ์ผ์ข ์ '์ฐฝ๊ณ '์ฒ๋ผ ํ์ฉํ๋ ๋ฐฉ๋ฒ.
๊ฒฐ๊ตญ CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ด ์ ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๋์คํฌ ~ ๋ถ์ฐ ํ์ผ ์์คํ
๋ถ์ฐ ํ์ผ ์์คํ
(distributed file system)
๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ฅ์น์ ๋๋์ด ์ ์ฅํ๋ ๊ฒ.
์๊ฒฉ์ผ๋ก ์ ์ฅ๋๋ ๊ฒฝ์ฐ์, ์๊ฒฉ ๋ถ์ฐ ํ์ผ ์์คํ
์์ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ ๋์คํฌ๊ฐ ์ ์ฅํจ.
์ด๋ ๋ก์ปฌ ๋์คํฌ๋ฅผ '์๊ฒฉ ๋ถ์ฐ ํ์ผ ์์คํ
์ ์บ์'๋ก ๋ณผ ์ ์์.
๋๋ถ์ด, ์๊ฒฉ ๋ถ์ฐ ํ์ผ ์์คํ
์ ๋ฐ์ดํฐ๋ฅผ data stream ์ ํํ๋ก ๋ก์ปฌ ์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋์ด์ฌ ์๋ ์์. (apache kafka)
์ด๋๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ '์๊ฒฉ ๋ถ์ฐ ํ์ผ ์์คํ
์ ์บ์'๋ก ๊ฐ์ฃผ๋จ.
๊ฒฐ๋ก : ์ปดํจํฐ์ ์ ์ฅ ์ฒด๊ณ์ ๊ฐ ๊ณ์ธต์ด ๋ค์ ๊ณ์ธต์ ๋ํ ์บ์ ์ญํ ์ ํ๋ค.
๋จ, ๊ฐ ๊ณ์ธต์ ์ ์ฅ ์ฉ๋์ ๋ค์ ๊ณ์ธต์ ์ ์ฅ ์ฉ๋๋ณด๋ค ์์์ผ ํ๋ค.
(๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ ๊ณ์ธต์ผ๋ก ๋ค์ ๊ณ์ธต์ ๋์ฒดํ๋ฉด ๋๊ธฐ ๋๋ฌธ)
์ด๋ฌํ ๊ฒฐ๋ก ์ ํ ๋๋ก, ์ปดํจํฐ ์ ์ฒด ์ ์ฅ ์ฒด๊ณ๊ฐ ์ต๋์ ์ฑ๋ฅ์ ๋ฐํํ๊ธฐ ์ํด์ ์บ์ ์นํ์ ์ธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์.
์ด๋ค ํ๋ก๊ทธ๋จ์ด ์บ์ ์นํ์ ์ด๋ผ๋ ๊ฒ์, ๊ทธ ํ๋ก๊ทธ๋จ์ ์บ์์ ์ ์ค๋ฅ ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
locality (์ง์ญ์ฑ)
( locality of reference / principle of locality )
ํ๋ก๊ทธ๋จ์ด "๋งค์ฐ ๊ท์น์ ์ผ๋ก" ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๊ฒฝํฅ์ฑ์ด ์๋ค๋ ๊ฒ.
temporal locality
: ํน์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ์ ์ฌ๋ฌ๋ฒ ์ฐธ์กฐํ๋ ๊ฒฝํฅ. (์๊ฐ์ ์ง์ญ์ฑ)spatial locality
: ์ฐธ์กฐํ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝํฅ. (๊ณต๊ฐ์ ์ง์ญ์ฑ)์ด๋ฌํ ๊ฒฝํฅ์ฑ์ ์บ์ ์นํ์ ์ด๋ค. ์๋ํ๋ฉด,
temporal locality
spatial locality
์ฆ, ์ปดํจํฐ ํ๋ก๊ทธ๋จ ์์ฒด๋ ์ด๋ ์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์บ์ ์นํ์ ์ด๋ค.
๊ทธ๋์ ์ด๋ฐ ์ง์ญ์ฑ์ด ๊ทน๋ํ๋ ์ ์๋๋ก ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด ๊ณง ์บ์ ์นํ์ ์ธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํ ๋๋ก, ์บ์ ์นํ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์์น ๋ช ๊ฐ์ง.
๋ฉ๋ชจ๋ฆฌ ํ ์ฌ์ฉ.
spatial locality
๊ฐ ์ฐ์ํ๋ค.struct ๊ตฌ์กฐ์ฒด ์ต์ ํ.
spatial locality
๋ฅผ ๋์ผ ์ ์๋ค.๋ฐ์ดํฐ ๊ตฌ์กฐ
์ฝ๋ ํ์ ํจํด
์ด ์์น์ ์ ์ฉํ ๋ ์ค์ํ ์ ์,
์บ์ ์ ์ค๋ฅ ๋ก ์ธํ ๋ณ๋ชฉ์ด ์์ ๋๋ง ์ด๋ฐ ์ต์ ํ๋ฅผ ์งํํ๋ผ๋ ๊ฒ.
ํ๋ก๊ทธ๋จ์ด ๊ฐ์ง๋ spatial locality
์ ๋ฐ๋ผ,
์ ๊ทผํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ์ธ์ ํ ๋ฐ์ดํฐ๊น์ง '๋ฌถ์'์ผ๋ก ์บ์์ ์ ์ฅํ๋ ๊ฒ์ด ์บ์ ์นํ์ ์ด๋ค. ์ด '๋ฌถ์'์ ์บ์ ๋ผ์ธ(cache line) ์ด๋ผ๊ณ ํ๋ค.
์บ์ ๋ผ์ธ์ ํฌ๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก 64๋ฐ์ดํธ์ด๋ฉฐ, ์บ์๊ฐ ์ ์คํ์ง ๋ชปํ ๊ฒฝ์ฐ ๊ทธ ๋ฐ์ดํฐ๊ฐ ์ํ ์บ์ ๋ผ์ธ์ด ์บ์์ ์ ์ฅ๋๋ค.
ํ์ง๋ง ์บ์ ๋ผ์ธ ๋จ์์ ์ํธ์์ฉ์ ๋ค์ค ์ค๋ ๋์์ ์ฑ๋ฅ์ ๋ฐฉํดํ๋ ์์ธ์ด ๋๊ธฐ๋ ํ๋ค.
์ผ๋จ ์บ์ ๋ผ์ธ๊ณผ ๋ฌด๊ดํ๊ฒ,
๋ค์ค ์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ค์ค ์ค๋ ๋๊ฐ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค๋ฉด, ์ฝ์ด ๋ณ๋ก ์บ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์บ์ ์ผ๊ด์ฑ์ ์ํด ํ ์ชฝ์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ค๋ฅธ ํ ์ชฝ์ ์บ์๋ฅผ ๋ฌดํจํ(invalidation)ํด์ผ ํ๋ค.
์ด๋ ๊ฒฐ๊ตญ ์๋ก๊ฐ ์๋ก์ ์บ์๋ฅผ ๋์์์ด ๋ฌดํจํ ํ๋ ํ์์ผ๋ก ์ด์ด์ง๊ณ , ์ด๋ฌํ ํ์์ ์ผ์ปฌ์ด "cache line bouncing" ๋๋ "cache ping-pong" ์ด๋ผ๊ณ ํ๋ค. ์ด ํ์์ด ๋ฐ์ํ๋ฉด ์บ์ ๋ณธ์ฐ์ ๊ธฐ๋ฅ์ ํ์ฉํ์ง ๋ชปํ๊ณ ์ ์ฒด ํ๋ฆ์ด ๋ฐฉํด๋๋ฉด์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋๋ค.
ํนํ, ๋ค์ค ์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ค์ค ์ค๋ ๋๊ฐ, ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ผ "์๋ก ๋ค๋ฅด์ง๋ง ๊ฐ์ ์บ์ ๋ผ์ธ์ ์๋ ๋ฐ์ดํฐ"์ ๊ฐ๊ฐ ์ฐ๊ธฐ๋ฅผ ํ๋ ค๊ณ ํ๋๋ผ๋ cache line bouncing ํ์์ด ๋ฐ์ํ๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ์๋๋ผ๋ ์บ์ ๋ผ์ธ์ ๊ณต์ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋๋ค. ์๋ํ๋ฉด ์บ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ์
์ฅ์์ ์บ์ ์์ ๋ค๋ฅธ ์ฝ์ด์ ๊ณต์ ํ๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์๊ณ , (ํด๋น ์ฝ์ด๊ฐ ์ฌ์ฉํ์ง ์๋ ๋ฐ์ดํฐ๋ผ๊ณ ํ๋๋ผ๋) ๊ทธ ๋ฐ์ดํฐ์ ์์ ์ด ๋ฐ์ํ๋ค๋ฉด ๋๊ธฐํ ํด์ฃผ๋ ๊ฒ์ด ์์ ํ๊ธฐ ๋๋ฌธ. ์ด๋ "false sharing"์ด๋ผ๊ณ ํ๊ณ , ์ด ๋ํ cache line bouncing ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๋ค.
ํด๊ฒฐ๋ฒ์ false sharing ํ๊ณ ์๋ ๋ฐ์ดํฐ๋ค์ด ๊ฐ์ ์บ์ ๋ผ์ธ(64Bytes)์ ์ํ์ง ์๋๋ก ๋ฐ์ดํฐ์ padding์ ์ฃผ๋ ๊ฒ. ๊ตฌ์กฐ์ฒด๋ฅผ ์๋ก ๋ค๋ฉด ๋ฉค๋ฒ ์์๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์ค๊ฐ์ ๋ฐฐ์ด์ ๋ผ์๋ฃ๋ ์.
๊ฒฐ๊ตญ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ๋ณ๋ชฉ์ด ๋ฐ์ํ์ ๋,
์๊ฐํด ๋ณด์์ผ ํ ๊ฒ์ด ์ด cache line bouncing ํ์.
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ์ํฉ(1๋ฒ)์ ์บ์ ์ผ๊ด์ฑ์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ช ํด๋ณด์ด๋ ๋ฐ๋ฉด, ์บ์ ๋ผ์ธ์ ๊ณต์ ํ๋ ์ํฉ(2๋ฒ)์ ์์ํ๊ธฐ ํ๋ค ์ ์๋ค. ๊ทธ๋์ ์กฐ์ฌํด์ผ ํ๋ค.
์ด๋ค CPU ์ค๊ณ์์๋ ์ฑ๋ฅ ํฅ์์ ์ํด, ๋ช
๋ น์ด๊ฐ ํญ์ ์์๋๋ก ์คํ๋์ง ์๊ธฐ๋ ํ๋ค.
์ด๋ฅผ "๋น์์ฐจ์ ๋ช
๋ น์ด ์คํ: OoOE(Out of Order Execution)" ์ด๋ผ๊ณ ํ๋ค.
ํฌ๊ฒ ์ธ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ,
CPU ์ค๊ณ๋ ํ์ ํ์ง ์๊ธฐ ๋๋ฌธ์, ๋น์ฐํ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ ํด๋น ์ค๋ ๋ ๋ด๋ถ์์๋ ์ด๋ฐ ๋น์์ฐจ์ ์คํ์ด ๋ณด์ด์ง ์๋๋ค. ํ์ง๋ง ์์ ์ด์ธ์ ๋ ๋ค๋ฅธ ์ค๋ ๋(์ฝ์ด)๊ฐ ์์ ๊ณผ ๊ณต์ ํ๊ณ ์๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋๋, ์ด ๋น์์ฐจ์ ์คํ ๊ณผ์ ์ด ๋๋ฌ๋ ์ ์๋ค.
๋ฌผ๋ก , lock ์ ํ๋ํ์ฌ ๋๊ธฐํ๋ฅผ ํ๋ฉด ๋ฌธ์ ์๋ค. ๋ค๋ง "lock-free programming"์ ์๋ํ ๋๊ฐ ๋ฌธ์ ๊ฐ ๋๋ค.
lock-free programming ์ด๋ ๋ค์ค ์ค๋ ๋์ ๊ณต์ ๋ฆฌ์์ค ์ฌ์ฉ ์ ์ค์ ๋ก๋ lock ์์ด๋ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ธด ํ๊ธฐ ๋๋ฌธ์ ํน์ ์๋ฆฌ(e.g. ์์์ฑ ์์
)๋ฅผ ํ์ฉํด์ lock ์ฌ์ฉ์ ํํผํ๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ lock ์ด ์๋ ์ํฉ์์ OoOE ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฅ๋ฒฝ, ์ฆ memory barrier ์ด๋ค.
memory barrier ๋ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๊ณ ๋ช
๋ น์ด๋ฅผ ์๋ฏธํ๋ ๊ฒ์ผ๋ก, 4๊ฐ์ง๊ฐ ์๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ์์
์๋ LOAD ์ STORE ๊ฐ ์๋๋ฐ, ๊ฐ memory barrier ์ด๋ฆ์ ๋ช
์๋ ๋ช
๋ น์ด์ ์์๋ฅผ ํด์น์ง ๋ง๋ผ๊ณ ๋ช
์ํด๋๋ ๊ธฐ๊ณ ๋ช
๋ น์ด์ด๋ค.
์ข ๋ ์ฝ๊ฒ ๋งํ๋ฉด ****????
๋ผ๋ ํํ์ memory barrier ๊ฐ ์์ ๋, ์ด memory barrier๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ ์กด์ฌํ๋ ****
๋ช
๋ น์ด๋ค๊ณผ ๋ค์ ์กด์ฌํ๋ ????
๋ช
๋ น์ด๋ค์ด ์ด memory barrier๋ฅผ ๋์ด์ ์๋ก ์ฌ์ ๋ ฌ ๋์ง ์๋๋ก ๋ช
์ํด ๋๋ ๊ฒ์ด๋ค.
LOADLOAD
STORESTORE
LOADSTORE
STORELOAD
์๋ฅผ ๋ค์ด 3๋ฒ LOADSTORE
๋ช
๋ น์ด์ ์ฌ์ฉ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
bool flag; // ์ค๋ ๋ ๊ฐ ๊ณต์ ๋๋ ์ ์ญ ๋ณ์
void some_thread()
{
int important;
if (flag)
{
LOADSTORE_FENCE();
important = 100;
}
}
์ด๋ ๊ฒ ํ๋ฉด, flag ๊ฐ ๋ฐ๋์ true ๊ฐ ๋ ์์ ์ดํ์๋ง important ์ 100 ์ด STORE ๋๋๋ก ๋ณด์ฅํ ์ ์๋ค. (memory barrier ์๋ค๋ฉด ๋น์์ฐจ์ ์คํ์ผ๋ก ์ธํด ๋จผ์ STORE ๋ ์๋ ์๋ค๋ ๋ป.)
์ด๋ฌํ memory barrier ๋ค์ LOAD์ STORE ๋ช
๋ น์ด๋ฅผ ํน์ ํด ์์๋ฅผ ๋ณด์ฅํ๊ณ ์์ด์, ๊ฐ memory barrier๋ฅผ '์กฐํฉ'ํด ์ฌ์ฉํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. (e.g. LOAD ๋ช
๋ น์ด ๋ค์ ์๋ LOAD ์ STORE ๋ช
๋ น์ด์ ๋น์์ฐจ์ ์คํ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ LOADLOAD
์ LOADSTORE
๋ฅผ ๋์์ ์ฌ์ฉํด์ผ ํจ)
-> ์ด๋ฅผ ํด์ํ๊ธฐ ์ํด "acquire-release semantics" ๋ฅผ ์ฌ์ฉ.
acquire-release semantics
๊ณต์์ ์ผ๋ก ์กด์ฌํ๋ ๊ฐ๋
์ ์๋.
memory barrier์ ์กฐํฉ.
CPU ๋ณ๋ก ๋ฐ์ ๊ฐ๋ฅํ ์ฌ์ ๋ ฌ์ ์ข ๋ฅ๊ฐ ์ฒ์ฐจ๋ง๋ณ์ด๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ ์ธ์ด ์์ค์์ ์ ๊ณตํ๋ acquire-release semantics ์ธํฐํ์ด์ค๊ฐ ์กด์ฌ. (e.g. C++์ atomic ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณต)
์์ ์ธ๊ธํ๋ฏ์ด, ๊ฒฐ๊ตญ ์ด๋ฌํ memory barrier ๋
"lock ์์ด" "๋ฆฌ์์ค๋ฅผ ๊ณต์ "ํ๋ "๋ค์ค ์ค๋ ๋" ํ๊ฒฝ์์ ํ์ํ ๊ธฐ์ .
๊ทธ๋ ๋ค๋ฉด ๋์ฒด ์ lock ์์ด ๋ฉํฐ ์ค๋ ๋ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ํ๋๊ฐ?
lock์ ์์ฃผ ์ข์ ๊ณต์ ๋ฆฌ์์ค ๊ด๋ฆฌ ๋๊ตฌ. mutual exclusion ํน์ spin lock ์ด ์์. ๋ค๋ง lock์ ์ฌ์ฉํ๋ฉด lock์ ์ป์ง ๋ชปํ/์ป๊ณ ์ ํ๋ ์ค๋ ๋๊ฐ ๋ธ๋กํน ๋จ. lock-free ๋ ๋ฐ๋ก ์ด ๋ธ๋กํน ์์ด ์ค๋ ๋๊ฐ ํญ์ ์ด๋ค ์ผ์ ํ๋๋ก ํ๋ ๊ฒ์ ๊ฐ์น๋ฅผ ๋ . ์ฑ๋ฅ ํฅ์์ด ๋ชฉ์ ์ด ์๋. ์ฌ์ง์ด ๊ตฌํ๋ ๋งค์ฐ ๊น๋ค๋ก์.
์ด์จ๋ ๊ธฐ์ตํ ๊ฒ.
์บ์ ๋ง๋ฌด๋ฆฌ
ํฐ๋
ธ์ด๋ง ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ์
์ฅ์์, ์ด๋ก ์ ์ผ๋ก ์บ์๋ ๋ถํ์ํ ๊ฒ์ด๋ค.
ํ์ง๋ง CPU ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅธ ์ต์ ์ปดํจํฐ ์ฅ์น์์ ์บ์๋ ์ฑ๋ฅ ํฅ์์ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํ๋ค.
์ธ๊ฐ์ด ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ปดํจํฐ๊ฐ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ๊ธฐ๋ฅ์ ๊ฐ์ถฐ์ผ ํ๋ค.
์ฅ์น(device)
์
์ถ๋ ฅ ์ฅ์น(device)๋ ๋ ์ง์คํฐ๋ก ๊ตฌ์ฑ๋์ด ์์ด, CPU๊ฐ ์ด ๋ ์ง์คํฐ๋ฅผ ์ฐธ์กฐํด ์
์ถ๋ ฅ ์์
์ ์ฒ๋ฆฌํ๋ค.
์ฆ, CPU์ ์
์ฅ์์ ์ฅ์น๋ ๋ค์๊ณผ ๊ฐ์ ์ข
๋ฅ์ ์ ์์ค ๊ณ์ธต ๋ ์ง์คํฐ๋ฅผ ํ๋ฐ ๋ฌถ์ด๋์ ๊ฒ์ ๋ถ๊ณผํ๋ค.
CPU๋ ์ฅ์น์ ์ด๋ป๊ฒ ์ ๊ทผํ๋: how
๊ทธ๋ฆฌ๊ณ ์ด ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฆ ์๋๋ผ ๊ธฐ๊ณ ๋ช
๋ น์ด์ด๋ค.
๊ทธ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
CPU๋ ์ฅ์น์ ์ธ์ ์ ๊ทผํ๋: when
๊ฒฐ๋ก ์ "์๋ค".
(๊ฒฐ๊ณผ ์ฒ๋ฆฌ ์ ์ธ)๋์คํฌ ์
์ถ๋ ฅ๊ณผ CPU์ ํ๋(๋ค๋ฅธ ์ค๋ ๋ ์คํ, ์ปค๋ ์์
, ์ ํด ์ํ)๋ ๋ณํ ๊ฐ๋ฅํ๋ค.
์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊น?
ํ๋ก๊ทธ๋๋จธ์๊ฒ ์์ฌํ๋ ๊ฒ
๋น๋๊ธฐ, ๋ ๋ฆฝ, ๋ฌด์์กด์ฑ, ๋ถ๋ฆฌ(decoupling) ๊ฐ ์์คํ ์ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๊น์ด ๋ฐฉ๋ฒ์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด์ ์์ ์ ์ถ๋ ฅ์ ๋จ์ง "๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌ(copy)"์ผ ๋ฟ์ด๋ค.
๋ ๊ฐ์ง๋ฅผ ํฉ์ณ ํํ I/O ๋ผ๊ณ ํํํ๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋ก์ธ์ค๊ฐ ๋์คํฌ์์ ํ์ผ์ ์ฝ๋(input) ๊ณผ์ ์ ์ด๋ป๊ฒ ์ค๋ช
ํ ์ ์์๊น.
๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ถ์ฅ์น(๋์คํฌ)์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ค๋ ๊ฒ.
ํ๋ก์ธ์ค์์ read ๊ณ์ด์ ์์คํ
์ฝ์ ํธ์ถ
-> ์ค๋ ๋ ๋ธ๋กํน(์
์ถ๋ ฅ ๋ธ๋กํน ๋๊ธฐ์ด์ ์ถ๊ฐ)
& ์์คํ
์ฝ์์ ๋์คํฌ์ ๋ช
๋ นํ์ฌ ๋์คํฌ์ ์
์ถ๋ ฅ ์์
์คํ(DMA ์๋์ ํฌํจํ๋ค๊ณ ํ์)
-> ์
์ถ๋ ฅ ์์
์ด ์งํ๋๋ ๋์ ๋ค๋ฅธ ์ค๋น๋ ์ค๋ ๋ ์ค์ผ์ค๋ง
-> ์
์ถ๋ ฅ ์์
์๋ฃ(๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ๋ณต์ฌ ์๋ฃ)๋๋ฉด ๋์คํฌ๊ฐ ์ธํฐ๋ฝํธ๋ฅผ ๋ฐ์์ํด
-> ์ค๋ ๋๋ฅผ ์
์ถ๋ ฅ ๋ธ๋กํน ๋๊ธฐ์ด์์ ์ค๋น ์๋ฃ ๋๊ธฐ์ด๋ก ์ด๋.
-> ์ดํ์ ์ด์์ฒด์ ์ ์ค์ผ์ค๋ง์ ๋ฐ๋ผ ์ค๋ ๋๊ฐ ์คํ๋๋ฉด ์
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ๋ค์ ์คํํ๋ฆ์ ์ฌ๊ฐ.
๊ธฐ์ตํด๋๋งํ ๊ฒ ๋ช ๊ฐ์ง.
ํ๋ก๊ทธ๋๋จธ ์ ์ฅ์์ ๋ชจ๋ ์ ์ถ๋ ฅ ์ฅ์น๋ ํ์ผ(file)๋ก ์ถ์ํ ๋์ด์๋ค.
ํ์ผ์ ์ด๋ฉด(open) ์ปค๋์ ํ์ผ๋ณ๋ก ์ ์ผํ ์ซ์ ํ๋๋ฅผ ๋ฐํํด์ฃผ๋๋ฐ, ์ด๊ฒ์ด ๋ฐ๋ก ํ์ผ ์๋ณ์(file descriptor)์ด๋ค.
ํ๋ก๊ทธ๋จ์ ์ด ์ซ์๋ง ์๊ณ ์์ผ๋ฉด ํ์ผ์ ๊ดํ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ ํ์ ์์ด ์ํ๋ ํ์ผ ์์
์ ์ํํ ์ ์๋ค.
char buff[LEN];
fd = open(file_name);
read(fd, buff);
์ ์ถ๋ ฅ ๋ค์คํ (multiplexing)
๋ฌธ์ ํด๊ฒฐ์ ์์์ ๋ธ๋กํน์ ํด์ํ๋ ๊ฒ์ผ๋ก๋ถํฐ.
๋ธ๋กํน์ด ๋๋ค๋ ๊ฒ์, ํ์ผ์ด ์ฝ์ ์ค๋น๊ฐ ๋์ง ์์ ์ํ์์ ์ฝ๊ธฐ๋ฅผ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋๊ธฐํ๋ผ๋ ๊ฒ.
์ด๋ ํ์ผ์ด ํ์ฌ ์ฝ์ ์ค๋น๊ฐ ๋์๋์ง ๋ฏธ๋ฆฌ ์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ.
๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ ์ปค๋์ด ํ์ผ์ด ์ฝ์ ์ค๋น๊ฐ ๋์์ ๋ ์์ฉํ๋ก๊ทธ๋จ์๊ฒ 'ํต์ง'ํ๊ฒ ํ์.
์ด์์ด๋ฉด ์ฌ๋ฌ ํ์ผ๋ค ์ค์์ ์ฝ์ ์ค๋น๊ฐ ๋ ํ์ผ๋ค์ ํ ๋ฒ์ ์๋ ค์ฃผ๋ ๊ฒ. -> ์
์ถ๋ ฅ ๋ค์คํ
๋ฆฌ๋
์ค ์ธ๊ณ์์ ์ด ์
์ถ๋ ฅ ๋ค์คํ ๊ธฐ์ ์ ๊ตฌํํ 3๊ฐ์ง์ ํจ์: select
, poll
, epoll
3๊ฐ์ง ๋ชจ๋ '๋๊ธฐ' ์
์ถ๋ ฅ ๋ค์คํ ๊ธฐ์ . ๊ฐ์ํด์ผ ํ๋ ํ์ผ๋ค ์ค์์ ์ฝ๊ธฐ ๊ฐ๋ฅ ํน์ ์ฐ๊ธฐ ๊ฐ๋ฅ ๊ฐ์ ๊ด์ฌ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ค๋ ๋๊ฐ ๋ธ๋กํน.
select
๋ ๊ฐ์ํ ์ ์๋ ํ์ผ์ ๊ฐ์๋ ํ์ ์ ์ด๊ณ ๊ด์ฌ ์ด๋ฒคํธ ๋ฐ์ ์ ๋ธ๋กํน์์ ํด์ ๋ง ๋ ๋ฟ ์ด๋ค ํ์ผ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์์. ๊ฒฐ๊ตญ ์ค๋ ๋ ์ฌ๊ฐ ์ ํ์ผ์ ์ ๋ถ ๋ค์ ํ์ธํด ๋ณด์์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ํ๋ ํ์ผ์ ๊ฐ์๊ฐ ๋์ด๋ ์๋ก ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋จ.poll
์ ๊ฐ์ ๊ฐ๋ฅํ ํ์ผ์ ๊ฐ์ ์ ํ๋ง ํด๊ฒฐ.epoll
์ ์ด๋ค ํ์ผ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ๋ชฐ๋๋ ๋ฌธ์ ๊น์ง ํด๊ฒฐ. epoll์ ์
์ถ๋ ฅ ๋ค์คํ ๊ตฌํ์ ์ํด์ ์ปค๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋๋ฐ, ์ด ์์ '์ค๋น ์๋ฃ๋ ํ์ผ ์์ ์ ๋ชฉ๋ก'์ด ์กด์ฌํจ. ์ค์ ๋ก ๋ฆฌ๋
์ค์์ epoll์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ ๋์์ฑ์ ๋๋ช
์ฌ.ํ์ผ์ ์ฝ๊ณ ์ฐ๋ ์์
์ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด๋ค.
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ๋นํด, ํ์ผ์ ์ํด์ ํ๋ก๊ทธ๋๋จธ์ ์ด์์ฒด์ ๋ ๋ค ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ ์์
์ด ํจ์ฌ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค.
์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ์ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋,
๊ทธ๋ ๋ค๋ฉด ํ๋ก๊ทธ๋๋จธ ์ ์ฅ์์ ๋ง์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ํ์ผ์ ์ฝ๊ณ ์ธ ์๋ ์์๊น?
mmap
ํ์ผ์ "๊ฐ๋ ์ ์ผ๋ก" ์ฐ์๋ ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฅ๋์ด ์๋ค๊ณ ์๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์, ๊ทธ ๊ฐ๋ ์ ์ผ๋ก ์ฐ์๋ ๋์คํฌ ๊ณต๊ฐ์ ๊ฐ๋ ์ ์ผ๋ก ์ฐ์๋ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ์ฌ์ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก๋ ์ด์์ฒด์ ๊ฐ ๋ค์์ ๋์ ๋์คํฌ์ ์ฝ๊ณ ์จ์ค.
์ ํต์ ์ธ read/write ํจ์์ ๋นํด mmap์
๊ฒฐ๊ตญ ์ค์ ์ํฉ์์ ๋ฐ๋์ ํ ์คํธ ํด๋ณด๊ณ ์ด๋ ๊ฒ์ด ์ข์์ง ํ๋จํด์ผ ํ๋ค.
๋์ ๋งํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ํ ์ด mmap์ ์ฌ์ฉํด์ ํ๋ก๊ทธ๋จ์๊ฒ ์ ๊ณต๋๋ค.
์ปดํจํฐ ์์คํ
์ ์ฌ๋ฌ ๊ฐ์ง ์ฃผ์ ์์
์์ ๋ฐ์ํ๋ ์ง์ฐ ์๊ฐ. (2012๋
๊ธฐ์ค)
์์คํ
์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ค๊ณํ๊ณ ์ฑ๋ฅ์ ํ๊ฐํ๋ ๋ฐ ์ค์ํ ์ฐธ๊ณ ์๋ฃ.
๋ณผ๋งํ ์ง์ .
20๋ฐฐ
, L1 ์บ์๋ณด๋ค 200๋ฐฐ
๋ ๋๋ฆฌ๋ค.4๋ฐฐ
๋๋ฆฌ๋ค.20๋ฐฐ
, ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค 80๋ฐฐ
๋๋ฆฌ๋ค.์ฌ๋ฐ๋ ์ง์ .
(L1 ์บ์์ ์ ๊ทผ ์ง์ฐ์ด 1์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋,)
3๋ถ
20๋ถ
1๋
5600๋
.์ ์ถ๋ ฅ ๋ง๋ฌด๋ฆฌ
์ญ์ฌ ์ฐ๋ฆฌ ๊ฐ์ ์๋์ด์ผ~~