๐Ÿ“•[์ฑ…] ์ปดํ“จํ„ฐ ๋ฐ‘๋ฐ”๋‹ฅ์˜ ๋น„๋ฐ€

์ด๊ฐ•์šฑยท2024๋…„ 4์›” 8์ผ
1

๐Ÿ“•์ฑ…

๋ชฉ๋ก ๋ณด๊ธฐ
4/4

1.1 ์—ฌ๋Ÿฌ๋ถ„์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋ฐœ๋ช…ํ•œ๋‹ค๋ฉด?

CPU๋Š” ๊ฐœํ(on-off)๋งŒ ์ดํ•ดํ•˜๋Š” ๋งค์šฐ ์›์‹œ์ ์ธ ๊ธฐ๊ณ„.

  • ์ €์ˆ˜์ค€ ์–ธ์–ด: ์ฒœ๊ณต์นด๋“œ -> ์–ด์…ˆ๋ธ”๋ฆฌ์–ด

  • ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด: ๋ช…๋ น์˜ ๊ทœ์น™๊ณผ ํŒจํ„ด์„ statement(๋ฌธ)์œผ๋กœ -> ์ค‘์ฒฉ๋œ statement๋ฅผ syntax(๊ตฌ๋ฌธ)์œผ๋กœ -> syntax๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก syntax tree(๊ตฌ๋ฌธํŠธ๋ฆฌ)๋กœ ์ค€๋น„ -> compiler๊ฐ€ ๋ฆฌํ”„๋…ธ๋“œ๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ๊ธฐ๊ณ„๋ช…๋ น์–ด๋กœ ๋ฒˆ์—ญ

  • ํ•ด์„ํ˜• ์–ธ์–ด: CPU ํ˜•์‹ ๋ณ„๋กœ ๋‹ค๋ฅธ ๊ธฐ๊ณ„์–ด๋ฅผ ์“ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ. ๋งˆ์น˜ ์˜์–ด๊ฐ€ ๊ตญ์ œ ํ†ต์šฉ์–ด๋กœ ์‚ฌ์šฉ๋˜๋“ฏ์ด CPU ํ˜•์‹๊ณผ ๋ฌด๊ด€ํ•œ ํ‘œ์ค€ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ , CPU์˜ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด ์‹คํ–‰ ๊ณผ์ •์„ ๋ชจ๋ฐฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋”ฐ๋กœ ์ค€๋น„ํ•ด์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ. '๋ชจ๋ฐฉ'ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ ๊ฒƒ์€, ํ‘œ์ค€ ๋ช…๋ น์–ด๋กœ๋งŒ ์‹คํ–‰ํ•ด๋„ ๊ฐ CPU์˜ ํŠน์„ฑ์— ๋งž๋Š” ๊ธฐ๊ณ„๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋งฅ๋ฝ์„ ์˜๋ฏธํ•œ ๊ฒƒ. ์ด๋Ÿฌํ•œ CPU ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ€์ƒ๋จธ์‹ (virtual machie) ํ˜น์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(interpreter) ๋ผ๊ณ  ๋ถ€๋ฆ„.

1.2 ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ณ ์ˆ˜์ค€ ์–ธ์–ด๋ฅผ ์ €์ˆ˜์ค€ ์–ธ์–ด๋กœ ๋ฒˆ์—ญํ•˜๋Š” "ํ”„๋กœ๊ทธ๋žจ"์˜ ์ผ์ข….
์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‹คํ–‰ ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ์†Œ์Šค์ฝ”๋“œ์—์„œ ์–ดํœ˜ ๋ถ„์„(lexical analysis)์„ ํ†ตํ•ด ํ† ํฐ(token)์„ ์ถ”์ถœํ•œ๋‹ค.
    int a = 1;
    int b = 2;
    
    while (a < b)
    {
    	b = b - 1;
    }
	โฌ‡๏ธ
    T_Keyword		int
    T_Identifier 	a
    T_Assign		=
    ...
    (๊ฐ ํ–‰์ด ํ•˜๋‚˜์˜ ํ† ํฐ์„ ์˜๋ฏธ)
  1. ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ๊ตฌ๋ฌธ ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ํ† ํฐ์„ ํ•ด์„(parsing)ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜(syntax error)๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, while ๊ตฌ๋ฌธ์œผ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด while ํ‚ค์›Œ๋“œ์˜ ํ† ํฐ์„ ์ฐพ์œผ๋ฉด ๋‹ค์Œ ํ† ํฐ์€ ( ์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ „์ œ ํ•˜์— ํ•ด์„์„ ์ง„ํ–‰.
  2. ํ•ด์„ํ•ด๋‚ธ ๊ตฌ์กฐ๋ฅผ ํ† ๋Œ€๋กœ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ๊ตฌ๋ฌธ ๋ถ„์„์ด๋ผ๊ณ  ํ•œ๋‹ค.
  3. ์ƒ์„ฑ๋œ ๊ตฌ๋ฌธํŠธ๋ฆฌ์— ์ด์ƒ์ด ์—†๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์˜๋ฏธ๋ถ„์„(semantic analysis)์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •์ˆ˜์™€ ๋ฌธ์ž์—ด์„ ๋”ํ•  ์ˆ˜ ์—†๊ณ  ๋น„๊ต ์ขŒ์šฐ์— ์žˆ๋Š” ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅด๋ฉด ์•ˆ๋œ๋‹ค.
  4. ๊ตฌ๋ฌธํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์ค‘๊ฐ„์ฝ”๋“œ(IR Code)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด -> ๊ธฐ๊ณ„ ๋ช…๋ น์–ด ์˜ ์ˆœ์„œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    (Intermediate Representation Code)

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ๋ณต์žกํ•œ ๊ณผ์ •.

์ดํ›„์—๋Š”, ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์†Œ์ŠคํŒŒ์ผ์— ์žˆ๋“ฏ ๊ธฐ๊ณ„๋ช…๋ น์–ด๋Š” ๋Œ€์ƒํŒŒ์ผ(object file)์— ์ €์žฅ๋˜๋Š”๋ฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋Œ€์ƒํŒŒ์ผ์„ ๋ฌถ๊ธฐ ์œ„ํ•ด ๋งํฌ(link) ๋ผ๋Š” ์ž‘์—…์ด ํ•„์š”.

1.3 ๋ง์ปค์˜ ๋งํ•  ์ˆ˜ ์—†๋Š” ๋น„๋ฐ€

๋ง์ปค๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•œ ๋Œ€์ƒ ํŒŒ์ผ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ์ข….
์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋Œ€์ƒ ํŒŒ์ผ์„ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ํ–‰์œ„๋Š” ์ฃผ๋กœ '์™ธ๋ถ€ ์ฝ”๋“œ'๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ ์œ„ํ•จ.
์™ธ๋ถ€ ์ฝ”๋“œ๋Š” '์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ' ํ˜น์€ '๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ'๋กœ ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Œ.

๋งํฌ ๊ณผ์ •์€ ์‹ฌ๋ฒŒ ํ•ด์„(symbol resolution) / ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ / ์žฌ๋ฐฐ์น˜(relocation) ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ.

  1. ์‹ฌ๋ฒŒ ํ•ด์„(symbol resolution)
    1. ์ปดํŒŒ์ผ ๋œ ๊ฐ ๋Œ€์ƒํŒŒ์ผ์€ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๊ฐ€ ์ €์žฅ๋˜๋Š” ์ฝ”๋“œ ์˜์—ญ๊ณผ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ.
    2. ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋“ค์ด ์‹ค์ œ๋กœ ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š์Œ.
    3. ์ด๋Š” ๋ง์ปค๊ฐ€ ์‹ฌ๋ฒŒ ํ•ด์„ ๊ณผ์ •์„ ํ†ตํ•ด ํ™•์ธ.
  • ์‹ฌ๋ฒŒ(symbol): ์ „์—ญ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์˜๋ฏธ.
  • ์‹ฌ๋ฒŒ์„ ์ˆ˜์š”์™€ ๊ณต๊ธ‰์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ณต๊ธ‰ - ๋‚ด๊ฐ€ ์ •์˜ํ•œ ์‹ฌ๋ฒŒ, ์ฆ‰ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ฌ๋ฒŒ
    • ์ˆ˜์š” - ๋‚ด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์™ธ๋ถ€ ์‹ฌ๋ฒŒ
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋ง์ปค๋ฅผ ์œ„ํ•ด ๊ฐ ๋Œ€์ƒ ํŒŒ์ผ์— ์‹ฌ๋ฒŒ๋“ค์˜ ์ˆ˜์š”์™€ ๊ณต๊ธ‰์„ ๊ธฐ๋กํ•ด ๋‘๋Š”๋ฐ ๊ทธ๊ฒƒ์ด ์‹ฌ๋ฒŒ ํ…Œ์ด๋ธ”(symbol table).
  • ๊ฒฐ๊ตญ, ์‹ฌ๋ฒŒ ํ•ด์„์ด๋ž€ ๊ฐ ๋Œ€์ƒ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์™ธ๋ถ€ ์‹ฌ๋ฒŒ์— ๋Œ€ํ•ด ์‹ฌ๋ฒŒ ํ…Œ์ด๋ธ”์—์„œ ์œ ์ผํ•œ ์ •์˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ž‘์—….
  • ๊ณต๊ธ‰์ด ์ˆ˜์š”๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ์ˆ˜์š”๊ฐ€ ๊ณต๊ธ‰์„ ์ดˆ๊ณผํ•˜๋ฉด ์˜ค๋ฅ˜.
  1. ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ
    ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‘˜ ๋‹ค ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ ๋˜์–ด ์žˆ๋‹ค.
  • ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (static library) - .lib (win) / .a (linux)
    • ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋œ ๋‚ด์šฉ์ด ์‹คํ–‰ ํŒŒ์ผ์— ํ†ต์งธ๋กœ ๋ณต์ œ๋จ (์ •์  ๋งํฌ - static linking)
    • ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ๋งค๋ฒˆ ์ปดํŒŒ์ผ ํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด์„œ ์†๋„ ๋น ๋ฆ„
    • ๋‹จ, ํ†ต์งธ๋กœ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์™€ ๋””์Šคํฌ ๋‚ญ๋น„
  • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (dynamic library) - dll (win) / lib*.so (linux)
    • ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋œ ๋‚ด์šฉ ์ค‘, ํ•„์ˆ˜ ์ •๋ณด๋งŒ ์‹คํ–‰ ํŒŒ์ผ์— ์ €์žฅ๋จ
      (์ฐธ์กฐ๋œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„, ์‹ฌ๋ฒŒ ํ…Œ์ด๋ธ”, ์žฌ๋ฐฐ์น˜ ์ •๋ณด ๋“ฑ)
    • ๋™์  ๋งํฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜.
      • ์‹คํ–‰ ํŒŒ์ผ์„ ์ ์žฌ(load)ํ•  ๋•Œ
        • ๋™์  ๋ง์ปค(dynamic linker)๋ผ๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ๋จ.
      • ์‹คํ–‰ ํŒŒ์ผ์ด ์‹คํ–‰(runtime)๋  ๋•Œ
        • ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹คํ–‰ ํŒŒ์ผ ๋‚ด๋ถ€์— ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š์Œ.
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ฝ”๋“œ์— ํŠน์ • API๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๋™์ ์œผ๋กœ ์ ์žฌ.
    • ๋งํฌ๋Š” ๊ฒฐ๊ตญ ์‹คํ–‰ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธด ํ•˜์ง€๋งŒ, ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ ํŠน์„ฑ ์ƒ ์‹คํ–‰ํŒŒ์ผ์ด '์ƒ์„ฑ'๋˜๋Š” ์‹œ์ ์— '๋™์  ๋งํฌ'๊ฐ€ ์ด๋ฃจ์–ด ์ง„๋‹ค๊ณ  ๋ณด๊ธฐ๋Š” ์–ด๋ ค์šธ ๋“ฏ.
  • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ/๋‹จ์ 
    ์žฅ์ 
    • ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ
    • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ ์ˆ˜์ • ์‹œ, ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•˜๋ฉด ๋จ. (์‹คํ–‰ ํŒŒ์ผ์—๋Š” ํ•„์ˆ˜ ์ •๋ณด๋งŒ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ)
    • ํ”Œ๋Ÿฌ๊ทธ์ธ(plug-in)์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜.
    • ์„ฑ๋Šฅ์„ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์˜ ํŠน์ • ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
    ๋‹จ์ 
    • ์ ์žฌ/์‹คํ–‰ ์‹œ๊ฐ„์— ๋งํฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ๋–จ์–ด์ง
    • ํ•ด๋‹น ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ๋Œ€ ์ฃผ์†Œ๋กœ ์ฐธ์กฐ ๋ถˆ๊ฐ€
    • ์ข…์†๋œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์ œ๊ณตx ํ˜น์€ ๋ฒ„์ „ ํ˜ธํ™˜x) ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋ถˆ๊ฐ€.
  1. ์žฌ๋ฐฐ์น˜(relocation)
    ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์— ํฌํ•จ.
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๊ณ„ ๋ช…๋ น์–ด์—๋Š” ์ฃผ์†Œ๊ฐ’๋งŒ์ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์™ธ๋ถ€ ์‹ฌ๋ฒŒ์ฒ˜๋Ÿผ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ฃผ์†Œ๊ฐ’์„ ํ™•์ •ํ•  ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” .relo.text์™€ .relo.data์— ๊ธฐ๋กํ•ด ๋‘๊ณ  ํ•ด๋‹น ์‹ฌ๋ฒŒ์— ์ž„์˜์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ถ€์—ฌ.
  • ์žฌ๋ฐฐ์น˜: ๊ฐ ๋Œ€์ƒํŒŒ์ผ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๋ง์ปค๊ฐ€ ์ด ๊ธฐ๋ก์„ ์ฐธ๊ณ ํ•ด์„œ ์‹ฌ๋ฒŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •.

1.4 ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ์ถ”์ƒํ™”๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

์ถ”์ƒํ™”๋Š” ํ‘œํ˜„๋ ฅ์„ ํ–ฅ์ƒํ•ด ์˜์‚ฌ์†Œํ†ต์˜ ํšจ์œจ์„ ๋†’์ด๊ณ , ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ฐ์ถฐ ๋‚ด์šฉ์„ ๋ณดํ˜ธํ•˜๊ฒŒ ํ•ด์คŒ.

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์ถ”์ƒํ™”
    ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ์„ค๊ณ„์—์„œ๋Š” API๋ผ๋Š” ์ถ”์ƒํ™”๊ฐ€ ์กด์žฌ.
    ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์ถ”์ƒํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์ž์‹ ๋งŒ์˜ mechanism ์„ ์ œ๊ณต. (e.g. OOP์˜ ๋‹คํ˜•์„ฑ)

  • ์‹œ์Šคํ…œ ์„ค๊ณ„์™€ ์ถ”์ƒํ™”
    CPU - ๋ช…๋ น์–ด ์ง‘ํ•ฉ
    ๊ธฐ๊ณ„ ๋ช…๋ น์–ด - ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
    ์ž…์ถœ๋ ฅ - ํŒŒ์ผ
    ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ - ํ”„๋กœ์„ธ์Šค
    ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์™€ ํŒŒ์ผ - ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ
    ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ์†Œ์ผ“
    ํ”„๋กœ์„ธ์Šค์™€ ํ”„๋กœ์„ธ์Šค์— ์ข…์†์ ์ธ ์‹คํ–‰ ํ™˜๊ฒฝ - ์ปจํ…Œ์ด๋„ˆ
    CPU, ์šด์˜ ์ฒด์ œ, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ - ๊ฐ€์ƒ ๋จธ์‹ 

์ถ”์ƒํ™” ๊ณ„์ธต์€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„  ์ €์ˆ˜์ค€ ๊ณ„์ธต์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

2.1 ์šด์˜ ์ฒด์ œ, ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ์˜ ๊ทผ๋ณธ ์ดํ•ดํ•˜๊ธฐ

์šด์˜์ฒด์ œ

  • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•ด์„œ๋Š”,

    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํŒŒ์ผ์„ ์ ์žฌํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฐพ๊ณ 
    • CPU ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ํ•จ์ˆ˜์˜ entry point๋ฅผ ์ฐพ์•„ PC ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•จ.
  • ๋”๋ถˆ์–ด, ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋™์‹œ์— ์‹คํ–‰ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ context ์ •๋ณด๋ฅผ ๋‹ด์„ ๊ตฌ์กฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด๋ฅผ ํ”„๋กœ์„ธ์Šค(process)๋ผ๊ณ  ํ•จ.

์ด๋ฅผ ์‚ฌ๋žŒ์ด ํ•ญ์ƒ ์ˆ˜๋™์œผ๋กœ ํ•˜๊ธฐ์—๋Š” ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ,

  • ํ”„๋กœ๊ทธ๋žจ์„ ์ž๋™์œผ๋กœ ์ ์žฌํ•˜๊ณ  ์‹คํ–‰ ์ค€๋น„๋ฅผ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์™€
  • ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋™์‹œ์— ์‹คํ–‰(ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ) ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ

๋“ฑ์„ ๋ชจ์•„๋‘” ํ”„๋กœ๊ทธ๋žจ์ด '์šด์˜ ์ฒด์ œ'(operating system).
์šด์˜ ์ฒด์ œ์•ผ ๋ง๋กœ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ์ด๋ผ๋Š” ๋‹จ์–ด์— ๊ฐ€์žฅ ์ ํ•ฉ.

ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ

  1. ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ๋•๋ถ„์— ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด๋ฅผ ๋…์ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ด ๋™์ž‘ํ•˜๋Š”๋ฐ, ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ.

    • ์ฝ”๋“œ ์˜์—ญ(code segment) - ๊ธฐ๊ณ„๋ช…๋ น์–ด
    • ๋ฐ์ดํ„ฐ ์˜์—ญ(data segment) - ๋ฐ์ดํ„ฐ ์˜์—ญ
    • ํž™ ์˜์—ญ(heap segment) - malloc ์‚ฌ์šฉ๋ถ„
    • ์Šคํƒ ์˜์—ญ(stack segment) - ํ•จ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ์Šคํƒ
  2. ํ”„๋กœ์„ธ์Šค์˜ ๋‹จ์ ์€ ์ง„์ž… ํ•จ์ˆ˜(entry function)๊ฐ€ main ํ•˜๋‚˜๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์–ด ๊ธฐ๊ณ„๋ช…๋ น์–ด๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ CPU์—์„œ ๋ฐ–์— ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ.

    ์—ฌ๋Ÿฌ ๊ฐœ์˜ CPU๊ฐ€ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค์˜ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ.

    • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ฐ€์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ.
      ๊ฐ ์‹คํ–‰ ํ๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” entry point๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ CPU PC ๋ ˆ์ง€์Šคํ„ฐ์— ๋‚˜๋ˆ„์–ด ์ง€์ •ํ•˜๋ฉด ๋จ.
      ๊ทธ ์‹คํ–‰ ํ๋ฆ„ ํ•˜๋‚˜๋ฅผ ์Šค๋ ˆ๋“œ(thread)๋ผ๊ณ  ํ•จ.

    • CPU๊ฐ€ ํ•œ ๊ฐœ(๋‹จ์ผ ์ฝ”์–ด)๋ผ๋„ ์‹คํ–‰ํ๋ฆ„์„ ๊ต์ฒดํ•˜๋ฉด์„œ ๋งˆ์น˜ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ. ์Šค๋ ˆ๋“œ๋Š” ์šด์˜ ์ฒด์ œ ๊ณ„์ธต์—์„œ ๊ตฌํ˜„๋˜๊ณ  ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜์™€๋Š” ๋ฌด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ.

    • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•œ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Œ.
      ๋‹จ, ๊ณต์œ  ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒํ˜ธ ๋ฐฐ์ œ(mutual exclustion)์™€ ๋™๊ธฐํ™”(synchronization)์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•ด์•ผ ํ•จ.

  3. ๊ฐ ์Šค๋ ˆ๋“œ -> ์‹คํ–‰ ํ๋ฆ„ -> ์ง„์ž… ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ž์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํ•„์š”ํ•จ.
    ์ฆ‰ ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ์Šคํƒ ํ”„๋ ˆ์ž„๋„ ์—ฌ๋Ÿฌ๊ฐœ ํ•„์š”. ์ด๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ž‘์šฉ.

    • ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์€, ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€์ ์—์„œ ๋ณผ ๋•Œ long task ์™€ short task ๊ฐ€ ์žˆ์Œ

      • long task: ํ”„๋กœ์„ธ์Šค์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ์™€ ๊ฑฐ์˜ ํ•จ๊ป˜ํ•˜๋Š” ์ž‘์—…. (e.g. Word ํ”„๋กœ์„ธ์Šค์˜ ๋””์Šคํฌ ๊ธฐ๋ก ์Šค๋ ˆ๋“œ)
      • short task: ์š”์ฒญ์ด ์žˆ์„ ๋•Œ ๋งˆ๋‹ค ์งง๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…. ์ž‘์—… ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ๊ณ  ์ž‘์—… ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง๋‹ค.
    • long task์˜ ๊ฒฝ์šฐ ์ „์šฉ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ์ถฉ๋ถ„ํžˆ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
      short task๋Š” ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ์„œ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ์ข…๋ฃŒ ์ž‘์—…, ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์Šคํƒ ์˜์—ญ ํฌ๊ธฐ, ์Šค๋ ˆ๋“œ ๊ฐ„ ์ „ํ™˜ ๋ถ€๋‹ด ๋“ฑ์˜ ๋ถ€๋‹ด์ด ๋งค์šฐ ์ปค์ง.

    • ๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ ์ „๋žต์ด ์กด์žฌ.

      • thread-per-request : long task์—์„œ ๋งค์šฐ ์ž˜ ๋™์ž‘
      • thread pool: 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) ๋ผ๋Š” ๊ณต์‹.

      ํ•˜์ง€๋งŒ ์ ˆ๋Œ€ ๊ณต์‹์€ ์—†๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ.

2.2 ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ณต์œ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค ๋ฆฌ์†Œ์Šค

ํ”„๋กœ์„ธ์Šค ๋ฆฌ์†Œ์Šค๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ๊ณต์œ ๋œ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฆฌ์†Œ์Šค๋Š” ๋ฌด์—‡์ด ์žˆ์„๊นŒ?

  • ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฆฌ์†Œ์Šค (thread-private resource)

    ์Šค๋ ˆ๋“œ๋Š” ์‚ฌ์‹ค 'ํ•จ์ˆ˜ ์‹คํ–‰' ์ด๋‹ค.
    CPU๋Š” ์ง„์ž… ํ•จ์ˆ˜์—์„œ ์‹คํ–‰์„ ์‹œ์ž‘ํ•ด์„œ ํ•˜๋‚˜์˜ ์‹คํ–‰ ํ๋ฆ„์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์ด ๋‹ค๋ฆ„ ์•„๋‹Œ ์Šค๋ ˆ๋“œ.

    ๊ฒฐ๊ตญ ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฆฌ์†Œ์Šค๋Š” ํ•จ์ˆ˜ ์‹คํ–‰์— ํ•„์š”ํ•œ
    ์Šคํƒ ์˜์—ญ, ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ, ์Šคํƒ ํฌ์ธํ„ฐ, ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด
    ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์Šค๋ ˆ๋“œ ์ƒํ™ฉ ์ •๋ณด (thread context) ๋ผ๊ณ  ํ•œ๋‹ค.

์ด ์ „์šฉ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” ๋ชจ๋‘ ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ ๋˜๋Š” ๋ฆฌ์†Œ์Šค.
์ฆ‰, ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ '์Šคํƒ ์˜์—ญ'์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์˜์—ญ์„ ๋ชจ๋‘ ๊ณต์œ ํ•œ๋‹ค. (๊ฐœ๋…์ ์œผ๋กœ๋Š” ๊ทธ๋ ‡๋‹ค)
์•„๋ž˜๋Š” ๋ชจ๋‘ ๊ณต์œ  ๋ฆฌ์†Œ์Šค.

  • ์ฝ”๋“œ ์˜์—ญ
    ์ปดํŒŒ์ผ ํ›„ ์ƒ์„ฑ๋œ ๊ธฐ๊ณ„๋ช…๋ น์–ด๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ.
    ์ฝ”๋“œ ์˜์—ญ์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.
    ๋”ฐ๋ผ์„œ ์–ด๋–ค ํ•จ์ˆ˜๋“ ์ง€ ๋ชจ๋‘ ์Šค๋ ˆ๋“œ์— ์ ์žฌํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ฝ”๋“œ ์˜์—ญ์€ read-only ์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋ฌธ์ œ(thread safety issue)๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ์ดํ„ฐ ์˜์—ญ
    ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ.
    ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.
    ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์Šค๋ ˆ๋“œ๊ฐ„ ๊ณต์œ ๋œ๋‹ค.
  • ํž™ ์˜์—ญ
    ๋Ÿฐํƒ€์ž„์— ์š”์ฒญ๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š” ์˜์—ญ.
    ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํฌ์ธํ„ฐ๋งŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์ด๋‹ค.
  • ์Šคํƒ ์˜์—ญ
    ์Šค๋ ˆ๋“œ์˜ ๊ฐ ์Šคํƒ ์˜์—ญ์ด ์ž์‹ ์˜ ์ „์šฉ ๊ณต๊ฐ„์ด๊ธด ํ•˜์ง€๋งŒ, ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ๊ณต๊ฐ„์€ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๊ฒฉ๋ฆฌ/๋ณดํ˜ธ ๋˜์–ด์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šค๋ ˆ๋“œ๋Š” ์ด๋Ÿฐ ์ž‘๋™ ๋ฐฉ์‹์ด ์—†๋‹ค.
    ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์—์„œ ํฌ์ธํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ง์ ‘ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.
    ์ฆ‰, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์†ํ•˜๋Š” ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ๊ฐ„ ์Šคํƒ ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  • ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํŒŒ์ผ
    • ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•  ๋•Œ / ์‹คํ–‰ ์ค‘์ผ ๋•Œ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ €์žฅ๋œ๋‹ค.
      ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์ด ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„์€ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.
    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์—ด๋ฆฐ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ €์žฅ๋œ๋‹ค.
      ๊ทธ ๊ณต๊ฐ„๋„ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ํŠน์ˆ˜ํ•œ ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค. ์Šค๋ ˆ๋“œ ์ „์šฉ ์ €์žฅ์†Œ (thread local storage).

  • ์ด ์˜์—ญ์— ์ €์žฅ๋œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—์„œ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
  • ์Šค๋ ˆ๋“œ ๋ณ„๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ณ€์ˆ˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ณต์œ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.
__thread int a = 1; // ์Šค๋ ˆ๋“œ ์ „์šฉ ์ €์žฅ์†Œ

๊ทธ๋ž˜์„œ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋…์ ์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3 ์Šค๋ ˆ๋“œ ์•ˆ์ „ ์ฝ”๋“œ๋Š” ๋„๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ?

์Šค๋ ˆ๋“œ ์•ˆ์ „ (thread safe) ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ์—์„œ ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜์™€ ํ˜ธ์ถœ ์ˆœ์„œ์— ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ์ฝ”๋“œ.

์–ด๋–ป๊ฒŒ ํ•ด์•ผ '์Šค๋ ˆ๋“œ ์•ˆ์ „'ํ•œ๊ฐ€?

์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์˜ ์‚ฌ์šฉ์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฆฌ์†Œ์Šค์™€ ์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋ฅผ 'ํŒŒ์•…'ํ•œ ํ›„,

  • ์ „์šฉ ๋ฆฌ์†Œ์Šค๋Š” ๊ทธ ์ž์ฒด๋กœ ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ณ 
  • ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋Š” ์ƒํ™ฉ์— ๋งž๊ฒŒ ํ•ด๊ฒฐ์ฑ…์„ '์ฒ˜๋ฐฉ'ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ์•…

ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ '์ •์˜'๋ณด๋‹ค๋Š” '์‚ฌ์šฉ'์„ ํ†ตํ•ด ์ „์šฉ ๋ฆฌ์†Œ์Šค์ธ์ง€ ๊ณต์œ  ๋ฆฌ์†Œ์Šค์ธ์ง€ ํŒŒ์•…ํ•œ๋‹ค.

  • ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฆฌ์†Œ์Šค

    • ํ•จ์ˆ˜์˜ ์ง€์—ญ ๋ณ€์ˆ˜, ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ ์˜์—ญ, ์Šค๋ ˆ๋“œ ์ „์šฉ ์ €์žฅ์†Œ

    • ๋‹จ, ํ•จ์ˆ˜ ์ง€์—ญ ๋ณ€์ˆ˜๋ผ๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ์ „์šฉ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.

      • ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›๊ฑฐ๋‚˜, ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ์ •์  ์ง€์—ญ ๋ณ€์ˆ˜(static local variable)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ฐ์ดํ„ฐ ์˜์—ญ์ด๋‚˜ ํž™ ์˜์—ญ์— ์†ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ์ƒํ™ฉ์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ๊ณต์œ  ๋ฆฌ์†Œ์Šค๊ฐ€ ๋œ๋‹ค.
  • ์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฆฌ์†Œ์Šค

    • ์Šค๋ ˆ๋“œ ์ „์šฉ ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ๊ฒƒ. (์ฝ”๋“œ ์˜์—ญ, ๋ฐ์ดํ„ฐ ์˜์—ญ, ํž™ ์˜์—ญ)
    • ์ฝ”๋“œ ์˜์—ญ์€ ์ฝ๊ธฐ ์ „์šฉ์ด๋ฏ€๋กœ, ์Šค๋ ˆ๋“œ ๊ณต์œ  ๋ฆฌ์†Œ์Šค๋Š” ํž™ ์˜์—ญ๊ณผ ๋ฐ์ดํ„ฐ ์˜์—ญ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜๋ฐฉ

๊ฐ€์žฅ ๋จผ์ €, ์Šค๋ ˆ๋“œ ๊ฐ„์— ์–ด๋–ค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ ๋ คํ•ด๋ณด๊ณ ,
๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์›์น™.

๊ณต์œ  ๋ฆฌ์†Œ์Šค๋ฅผ ์–ด์ฉ” ์ˆ˜ ์—†์ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด,

  1. ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์Šค๋ ˆ๋“œ ์ „์šฉ ์ €์žฅ์†Œ ํ˜น์€ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์„ ์–ธํ•œ๋‹ค.
  2. ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์›์ž์„ฑ ์—ฐ์‚ฐ (atomic operation)์„ ํ™œ์šฉํ•ด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ˆœ์„œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•œ๋‹ค.
  3. ๊ทธ๊ฒƒ ๋งˆ์ € ์–ด๋ ต๋‹ค๋ฉด, ๋™๊ธฐํ™” ์‹œ ์ƒํ˜ธ ๋ฐฐ์ œ (mutual exclustion in synchronization)์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋ฎคํ…์Šค(mutex), ์Šคํ•€๋ฝ(spin lock), ์„ธ๋งˆํฌ์–ด(semaphore) ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.

2.4 ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ฝ”๋ฃจํ‹ด์„ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•ด์•ผํ• ๊นŒ?

์ฝ”๋ฃจํ‹ด(coroutine)์ด๋ž€

์ฝ”๋ฃจํ‹ด์€ ์‚ฌ์šฉ์ž ์ƒํƒœ(user mode) ์Šค๋ ˆ๋“œ.
์ž์‹ ์˜ ์ด์ „ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€, ๋‹ค์‹œ ์‹คํ–‰๋  ๋•Œ ์ด์ „์— ์ผ์‹œ ์ค‘์ง€๋˜์—ˆ๋˜ ์ง€์ (์—ฐ๊ฒฐ ์‹œ์ž‘ ์ง€์ )์—์„œ ๊ณ„์† ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜.

์ฆ‰, ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•.

์ฝ”๋ฃจํ‹ด์˜ ์—ญ์‚ฌ

์ปค๋„ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†๋˜ ์‹œ์ ˆ, ๋™์‹œ์„ฑ์„ ๊ฐ€์ง€๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์•ˆ๋œ ๊ฝค ์˜ค๋ž˜๋œ ๊ธฐ์ˆ .

์ฝ”๋ฃจํ‹ด์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•

์Šค๋ ˆ๋“œ์˜ ๊ตฌํ˜„๊ณผ ๋ณธ์งˆ์ ์œผ๋กœ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

์ผ์‹œ ์ค‘์ง€ ๋ ๋•Œ์˜ ์ƒํƒœ ์ •๋ณด์—๋Š” ๋‘ ๊ฐ€์ง€

  1. CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด
  2. ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ์ƒํƒœ ์ •๋ณด

์ผ๋ฐ˜ ํ•จ์ˆ˜์˜ ์ƒํƒœ ์ •๋ณด๋Š” ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„ ์ค‘ '์Šคํƒ ์˜์—ญ' ์•ˆ ํ•ด๋‹น ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅ๋˜๊ณ ,
์ฝ”๋ฃจํ‹ด์˜ ์ƒํƒœ ์ •๋ณด๋Š” 'ํž™ ์˜์—ญ' ์•ˆ ํ•ด๋‹น ์ฝ”๋ฃจํ‹ด์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅํ•œ๋‹ค.

์ฝ”๋ฃจํ‹ด์˜ ์žฅ์ 

  • ์ฝ”๋ฃจํ‹ด ๊ฐ„ ์ „ํ™˜/์Šค์ผ€์ค„๋ง์€ ์ „์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ƒํƒœ์—์„œ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ์šด์˜ ์ฒด์ œ์˜ ๊ฐœ์ž…์ด ๋ถˆํ•„์š”.
  • ์ฝ”๋ฃจํ‹ด ๊ฐ„ ์ „ํ™˜ ์‹œ ์ €์žฅ, ๋ณต๊ตฌ ๋˜๋Š” ์ •๋ณด ๋˜ํ•œ ์ปค๋„ ์Šค๋ ˆ๋“œ ๋ณด๋‹ค ๊ฐ€๋ณ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ .
  • ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ (-> 2.8์ ˆ)

2.5 ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ฒ ์ €ํ•˜๊ฒŒ ์ดํ•ดํ•œ๋‹ค

์ฝœ๋ฐฑ ํ•จ์ˆ˜ (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);

์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜

๋™๊ธฐ ์ฝœ๋ฐฑ

  • ๋ธ”๋กœํ‚น ์ฝœ๋ฐฑ (blocking callback)
  • ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•œ ํ•จ์ˆ˜๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆผ.
  • ํ•˜๋‚˜์˜ ์‹คํ–‰ํ๋ฆ„์—์„œ ์ฝœ๋ฐฑ ์ „๋‹ฌ, ์ฝœ๋ฐฑ ์‹คํ–‰์ด ๋ชจ๋‘ ์ˆ˜ํ–‰๋จ.

๋น„๋™๊ธฐ ์ฝœ๋ฐฑ

  • ์ง€์—ฐ ์ฝœ๋ฐฑ (deferred callback)
  • ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•œ ํ•จ์ˆ˜(์ฃผ ํ”„๋กœ๊ทธ๋žจ)์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ.
  • ์ฆ‰, ์ฝœ๋ฐฑ์ด ๋‹ค๋ฅธ ์‹คํ–‰ ํ๋ฆ„(๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค/์‹œ์Šคํ…œ)์—์„œ ์‹คํ–‰๋จ. -> ๋‹ค์ค‘ ์ฝ”์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ์ž˜ ํ™œ์šฉ.

๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์„ ํ†ตํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‚ฌ๊ณ ๋ฐฉ์‹

ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ๊ธฐ๋ณธ์€,

  1. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํš๋“(request) ํ•œ๋‹ค.
  2. ํš๋“ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌ(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์ ˆ์—์„œ ๊ณ„์†)

2.6 ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ๋ฅผ ์ฒ ์ €ํ•˜๊ฒŒ ์ดํ•ดํ•œ๋‹ค

๋™๊ธฐ

  • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์ˆ˜์‹ ์ž์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ ค์„œ ๊ฒฐ๊ณผ๋ฅผ ํš๋“ํ•˜๊ณ , ๊ทธ ์ดํ›„์— ํš๋“ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•จ.
  • ๊ฐ™์€ ํ˜ธ์ถœ์ž์™€ ์ˆ˜์‹ ์ž๊ฐ€ ๊ฐ™์€ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€์™€๋Š” ๋ฌด๊ด€.
    (e.g. ์‹œ์Šคํ…œ ์ฝœ: ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋œ ํ›„ ์ปค๋„ ๋ชจ๋“œ ์ง„์ž… ์‹œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ ์ผ ์ˆ˜ ์žˆ์Œ.)
  • ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง„ ์•Š์Œ (?)

* ์ „ํ™” ํ†ตํ™” - A๊ฐ€ ๋งํ•˜๋ฉด B๊ฐ€ ๋“ฃ๊ณ , B๊ฐ€ ๋‹ค ๋“ค์œผ๋ฉด A๊ฐ€ ๋‹ค์‹œ ๋งํ•œ๋‹ค.

๋น„๋™๊ธฐ

  • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์ˆ˜์‹ ์ž๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ํš๋“ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋‹ค์Œ ์ž‘์—…์„ ์ด์–ด๊ฐ.
  • ์ˆ˜์‹ ์ž์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€
    • ํ˜ธ์ถœ์ž๊ฐ€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์„ ๋•Œ -> ์ˆ˜์‹ ์ž์—๊ฒŒ ์ฝœ๋ฐฑ ์ „๋‹ฌํ•ด ์ˆ˜์‹ ์ž๊ฐ€ ์ฝœ๋ฐฑ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌ
    • ํ˜ธ์ถœ์ž๊ฐ€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์•Œ์•„์•ผ ํ•  ๋•Œ -> ์ˆ˜์‹ ์ž๊ฐ€ ํ˜ธ์ถœ์ž์—๊ฒŒ ํ†ต์ง€. ํ†ต์ง€๋ฅผ ๋ฐ›์€ ํ˜ธ์ถœ์ž๊ฐ€ ์ฒ˜๋ฆฌ
  • ํ˜ธ์ถœ์ž์˜ ์œ ํœด ์‹œ๊ฐ„์ด ์ค„์–ด๋“ค์–ด ํšจ์œจ์ .
  • ํ˜ธ์ถœ์ž์™€ ์ˆ˜์‹ ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ .
  • ์ฃผ๋กœ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ˜•ํƒœ๋กœ ์‹คํ–‰.
    (๋””์Šคํฌ์˜ ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๊ธฐ, ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ๋“ฑ)

* ์ด๋ฉ”์ผ - A๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ B๋Š” ๋‹ค๋ฅธ ์ผ์„ ํ•˜๊ณ , B๊ฐ€ ํšŒ์‹ ํ•˜๋Š” ๋™์•ˆ A๋Š” ๋‹ค๋ฅธ ์ผ์„ ํ•œ๋‹ค.

2.7 ์•„ ๋งž๋‹ค! ๋ธ”๋กœํ‚น๊ณผ ๋…ผ๋ธ”๋กœํ‚น๋„ ์žˆ๋‹ค

๋™๊ธฐ / ๋น„๋™๊ธฐ

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ์˜ ํš๋“๊ณผ ์ฒ˜๋ฆฌ์˜ ๋ฌธ์ œ.
๋™๊ธฐ ํ˜ธ์ถœ์€ ํš๋“๊ณผ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•˜์—ฌ '๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ' ๋˜์–ด ์žˆ๊ณ  '์˜์กด์ '์ธ ๋ฐ˜๋ฉด, ์ด๋Ÿฐ ์ œ์•ฝ์ด ์—†๋Š” ๊ฒƒ์ด ๋น„๋™๊ธฐ ํ˜ธ์ถœ.
๋™๊ธฐ/๋น„๋™๊ธฐ๋ฅผ ์–ธ๊ธ‰ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๋‘ ๊ฐ€์ง€ ๋Œ€์ƒ (caller ์™€ callee) ์–‘์ชฝ์„ ๋ชจ๋‘ ์˜๋ฏธ.

๋ธ”๋กœํ‚น / ๋…ผ๋ธ”๋กœํ‚น (blocking / non-blocking)

์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ CPU ์ œ์–ด๊ถŒ์„ ์ƒ์‹คํ•˜๋Š๋ƒ์˜ ๋ฌธ์ œ.

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ caller ์˜ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์‹œ ์ค‘์ง€ ๋˜๋ฉด -> ๋ธ”๋กœํ‚น
๊ทธ๋ ‡์ง€ ์•ˆ๊ณ , callee ๊ฐ€ ๋ฐ”๋กœ ๋ฐ˜ํ™˜๋˜์–ด caller ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž‘์—…์„ ์ด์–ด๋‚˜๊ฐ€๋ฉด -> ๋…ผ๋ธ”๋กœํ‚น

๋ธ”๋กœํ‚น

์ž…์ถœ๋ ฅ๊ณผ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€.
์ž…์ถœ๋ ฅ์€ ๋งค์šฐ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š”๋ฐ, ์ด ์‹œ๊ฐ„์ด CPU์‹œ์ ์—์„œ๋Š” ์—„์ฒญ๋‚œ ์–‘์˜ ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„.

๋”ฐ๋ผ์„œ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ

  • ๊ฒฐ๊ณผ ํš๋“์„ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๊ฒ ๋‹ค(๋™๊ธฐ) ๋ผ๊ณ  ํ•˜๋ฉด,
  • caller ์Šค๋ ˆ๋“œ๋ฅผ ์ผ์‹œ์ •์ง€ ์‹œํ‚ค๊ณ  CPU์˜ ์ œ์–ด๊ถŒ์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ๋„˜๊ฒจ CPU ์œ ํœด์‹œ๊ฐ„์„ ์ค„์ž„.

์ฆ‰, CPU ์ œ์–ด๊ถŒ์„ ์ƒ์‹คํ–ˆ๋‹ค๊ฐ€ ๋˜์ฐพ๋Š” ์‹œ๊ฐ„ ๋™์•ˆ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๋Š” ๋ธ”๋กœํ‚น ๋˜๋Š” ๊ฒƒ.

์šด์˜์ฒด์ œ ์ž…์žฅ์—์„œ ๋™๊ธฐ ์ž…์ถœ๋ ฅ ํ˜ธ์ถœ์—๋Š” ๋ฌด์กฐ๊ฑด ๋ธ”๋กœํ‚น์œผ๋กœ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ .
๋‹จ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋™๊ธฐ ์ผ๋ฐ˜ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋ธ”๋กœํ‚น์œผ๋กœ ๋Œ€์‘ํ•  ํ•„์š”๋Š” ์—†์Œ.

int sum(int a, int b)
{
	return a + b;
}

void func()
{
	int r = sum(1, 1);
}

๋”ฐ๋ผ์„œ ๋™๊ธฐ ํ˜ธ์ถœ์ด ๋ฌด์กฐ๊ฑด ๋ธ”๋กœํ‚น์€ ์•„๋‹ˆ์ง€๋งŒ,
๋ธ”๋กœํ‚น์ด๋ฉด ๋ฐ˜๋“œ์‹œ ๋™๊ธฐ ํ˜ธ์ถœ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋…ผ๋ธ”๋กœํ‚น

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ

  • ๊ฒฐ๊ณผ ํš๋“์„ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ฒ ๋‹ค(๋น„๋™๊ธฐ) ๋ผ๊ณ  ํ•˜๋ฉด,

  • callee ๋Š” ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๊ณ  caller ์Šค๋ ˆ๋“œ๋Š” CPU ์ œ์–ด๊ถŒ์„ ์œ ์ง€ํ•œ ์ฑ„ ๊ธฐ์กด ์ž‘์—…์„ ๊ณ„์† ์ง„ํ–‰ํ•จ.
    ์ด ๋•Œ ์ž…์ถœ๋ ฅ ๊ณผ์ •์ด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ(์ฃผ๋กœ ์ปค๋„)์—์„œ ๋ณ‘ํ–‰๋จ์œผ๋กœ ํšจ์œจ์ .

  • ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ

    • ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ œ๊ณต๋˜๋Š”, '๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜'๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์™”๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  caller ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•จ.
    • ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์™”๋Š”์ง€๋ฅผ ์•Œ๋ฆผ ์ž‘๋™๋ฐฉ์‹์„ ํ†ตํ•ด caller ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ. ์ „๋‹ฌ ๋ฐ›์€ caller ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌ.
    • ์ž…์ถœ๋ ฅ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„˜๊น€. callee ์Šค๋ ˆ๋“œ๊ฐ€ ์ฒ˜๋ฆฌ.

์ด๋Ÿฐ ์œ ํ˜•์˜ ์ž…์ถœ๋ ฅ ์ž‘์—…์„ ๋น„๋™๊ธฐ ์ž…์ถœ๋ ฅ (asynchronous I/O) ์ด๋ผ๊ณ  ํ•จ.

๋‹จ, CPU ์ œ์–ด๊ถŒ์„ ์œ ์ง€(๋…ผ๋ธ”๋กœํ‚น) ํ–ˆ๋‹ค๊ณ  ํ•ด๋„, ๋ฐ์ดํ„ฐ ํš๋“์„ ์œ„ํ•ด caller ์Šค๋ ˆ๋“œ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๋ฉด,
์ด๋Š” ๋…ผ๋ธ”๋กœํ‚น์ด๋”๋ผ๋„ ๋™๊ธฐ ํ˜ธ์ถœ์ž„.

์ฆ‰, ๋…ผ๋ธ”๋กœํ‚น์ด๋ผ๊ณ  ๋ชจ๋‘ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์€ ์•„๋‹˜.
* ๋น„๋™๊ธฐ ํ˜ธ์ถœ์ด๋ฉด ๋…ผ๋ธ”๋กœํ‚น์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์„ ๋“ฏ.

๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ 

[ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ, ์ฝ”๋ฃจํ‹ด] + [๋™๊ธฐ, ๋น„๋™๊ธฐ, ๋ธ”๋กœํ‚น, ๋…ผ๋ธ”๋กœํ‚น] = ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„

2.8 ๋†’์€ ๋™์‹œ์„ฑ๊ณผ ๊ณ ์„ฑ๋Šฅ์„ ๊ฐ–์ถ˜ ์„œ๋ฒ„ ๊ตฌํ˜„

์ˆ˜์ฒœ ๊ฐœ ~ ์ˆ˜๋งŒ ๊ฐœ์˜ ์‚ฌ์šฉ์ฐจ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„์˜ ๋น„๋ฐ€.

๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค

process-per-connection

๊ฐ„๋‹จํ•˜๊ณ , ์ฃผ์†Œ๊ณต๊ฐ„๊ณผ ์ข…๋ฃŒ์— ๋Œ€ํ•ด ์„œ๋กœ ๋…๋ฆฝ์ ์ด๊ณ , ๋‹ค์ค‘ ์ฝ”์–ด ๋ฆฌ์†Œ์Šค ์ถฉ๋ถ„ํžˆ ํ™œ์šฉ ๊ฐ€๋Šฅ.

ํ•˜์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹ ์— ๋น„์šฉ์ด ๋“ค๊ณ , ์ƒ์„ฑ๊ณผ ์ข…๋ฃŒ๊ฐ€ ์‹œ์Šคํ…œ์—๊ฒŒ ๋ถ€๋‹ด.

๋‹ค์ค‘ ์Šค๋ ˆ๋“œ

thread-per-connection

์ƒ์„ฑ ์ข…๋ฃŒ๊ฐ€ ๊ฐ€๋ณ๊ณ , ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•ด์„œ ํ†ต์‹  ๋น„์šฉ์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ, ๊ฒฝ์Ÿ ์ƒํƒœ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ์ฆ๊ฐ€ํ•˜๊ณ , ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ ์ข…๋ฃŒ๋˜๋ฉด ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜๋„ ์žˆ์Œ.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ์œ ๋ฆฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ.
ํ•˜์ง€๋งŒ, ๋งค์šฐ ํฐ ๊ทœ๋ชจ์˜ ์š”์ฒญ (C10K ๋ฌธ์ œ ๋“ฑ)์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋กœ๋„ ๋ถ€์กฑ. ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ€๋ณ๊ธด ํ•ด๋„ ๊ทธ ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์•„์ง„๋‹ค๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถ€๋‹ด์ด ๋˜๊ธฐ ๋•Œ๋ฌธ.

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

'๋ณ‘ํ–‰' ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ์—๋งŒ ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (event-driven programming) ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
์ฃผ๋กœ GUI ํ”„๋กœ๊ทธ๋ž˜๋ฐ, ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋จ.

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‘ ๊ฐ€์ง€ ํ•„์ˆ˜ ์š”์†Œ

  1. ์ด๋ฒคํŠธ (event) - ๋ง๊ทธ๋Œ€๋กœ ์ด๋ฒคํŠธ. ์„œ๋ฒ„์˜ ๊ด€์ ์—์„œ๋Š” ์ฃผ๋กœ ์ž…์ถœ๋ ฅ. (๋ฐ์ดํ„ฐ ์ˆ˜์‹  ์—ฌ๋ถ€, ํŒŒ์ผ์˜ read/write ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๋“ฑ)
  2. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ (event handler) - ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜.

๊ณ„์†ํ•ด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜๋ณต(loop)๋ฅผ ํ†ตํ•ด ๊ณ„์† ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌ(handle)ํ•ด์•ผํ•จ.
์ด ๋ฐ˜๋ณต์„ ์ด๋ฒคํŠธ ๋ฃจํ”„(event loop) ๋ผ๊ณ  ํ•จ.

while (true)
{
	event = getEvent();	// ์ด๋ฒคํŠธ ์ˆ˜์‹  ๋Œ€๊ธฐ
    
    handler(event);		// ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
}

ํŒŒ์ƒ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ.

  1. ์ด๋ฒคํŠธ ์†Œ์Šค
    getEvent() ํ•˜๋‚˜๋กœ ์–ด๋–ป๊ฒŒ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€.

    • ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™” (I/O multiplexing)
      • ๋ชจ๋“  ์ž…์ถœ๋ ฅ์€ 'file'. ๋ชจ๋“  ์ž…์ถœ๋ ฅ ์ž‘์—…์€ file descriptor๋ฅผ ํ†ตํ•ด. ์†Œ์ผ“๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.
      • ๋‹ค์ˆ˜์˜ ์†Œ์ผ“์— ๋Œ€ํ•ด์„œ, file descriptor ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋“ฃ๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค/์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋“ฃ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ .
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†Œ์ผ“ ์ฆ‰ file descriptor ๋ฅผ ๋Œ€์‹  ๋“ฃ๊ณ  ์žˆ๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์‹ ๋˜๋ฉด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด ์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™”.
      • ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ '์—”์ง„' ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ.
      • ๋ฆฌ๋ˆ…์Šค ์„ธ๊ณ„์—์„œ๋Š” epoll ์ด ๋Œ€ํ‘œ์ .
  2. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
    handler ํ•จ์ˆ˜๊ฐ€ ๊ผญ ๊ฐ™์€ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€.

    • ๋ฆฌ์•กํ„ฐ ํŒจํ„ด (reactor pattern)
      • ๋งŒ์•ฝ handler ํ•จ์ˆ˜์˜ ๋™์ž‘์ด ์ž…์ถœ๋ ฅ์ด ์—†๋Š” ๋งค์šฐ ์งง์€ ์ž‘์—…์ด๋ผ๋ฉด, ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•ด๋„ ๋ฌด๋ฐฉํ•จ.
      • ํ•˜์ง€๋งŒ handler ํ•จ์ˆ˜์˜ ๋™์ž‘์— ์‹œ๊ฐ„์ด ๋งŽ์ด ๋“ ๋‹ค๋ฉด, ๋ฐ˜์‘์„ฑ์„ ์œ„ํ•ด ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉ.
      • ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋˜๋Š” ์Šค๋ ˆ๋“œ ํ•˜๋‚˜์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋ฅผ ๋‘์–ด์„œ,
        ์ด๋ฒคํŠธ ์ˆ˜์‹  ์‹œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ์Šค๋ ˆ๋“œ์—์„œ ๊ฐ„๋‹จํ•œ ์ฒ˜๋ฆฌ ํ›„ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์— ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๋ถ„๋ฐฐ.
      • ์Šค๋ ˆ๋“œ ํ’€ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
      • ์ด๋Ÿฐ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์„ ๋ฆฌ์•กํ„ฐ ํŒจํ„ด (reactor pattern)์ด๋ผ๊ณ  ํ•จ.
      • ๋งŒ์•ฝ ์ฒ˜๋ฆฌ ๊ณผ์ •์— ๋ธ”๋กœํ‚น ์ž…์ถœ๋ ฅ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์ž‘์—…์€ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌํ•ด์•ผํ•จ.

์ž…์ถœ๋ ฅ ๋‹ค์ค‘ํ™”์™€ ๋ฆฌ์•กํ„ฐ ํŒจํ„ด์„ ํ™œ์šฉํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•์ •ํ•˜๊ณ  ๋‚˜๋ฉด,
ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ (handler) ๊ตฌํ˜„์— ์ง‘์ค‘ํ•˜๋ฉด ๋จ.

์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ๊ตฌํ˜„ ์‹œ ์œ ์˜ ์‚ฌํ•ญ.

handler ํ•จ์ˆ˜ ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž…์ถœ๋ ฅ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋น„์ฆˆ๋‹ˆ์Šค์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋ณ„๋„์˜ ์„œ๋ฒ„์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ตฌ์กฐ์—์„œ, ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ handler ํ•จ์ˆ˜์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(remote procedure call: RPC)๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉ๋˜์•ผ ํ•  ์ˆ˜ ์žˆ์Œ.

์ด๋•Œ, ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์„ ๋ธ”๋กœํ‚น ํ˜ธ์ถœ ๋˜๋Š” ๋น„๋™๊ธฐ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด,
CPU ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ์˜ ๋ณต์žก๋„๊ฐ€ ๋งค์šฐ ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€์ž‘์šฉ์ด ๋ฐœ์ƒ.

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํšจ์œจ์„ฑ๊ณผ ๋™๊ธฐ(์—ฌ๊ธฐ์„œ๋Š” ๋ธ”๋กœํ‚น) ํ˜ธ์ถœ์˜ ๋‹จ์ˆœ์„ฑ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ 
-> ์ฝ”๋ฃจํ‹ด

์ฝ”๋ฃจํ‹ด์€ ๋ณธ์งˆ์ ์œผ๋กœ, ํ˜„์žฌ ์ปค๋„ ์Šค๋ ˆ๋“œ์— ํ• ๋‹น๋œ CPU ์‹œ๊ฐ„์„ ์‚ฌ์šฉ์ž ์ƒํƒœ์—์„œ 2์ฐจ ํ• ๋‹น ํ•˜๋Š” ๊ฒƒ.
์ฆ‰, "์‚ฌ์šฉ์ž ์ƒํƒœ ์Šค๋ ˆ๋“œ"์ด๋‹ค.
(๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ƒํƒœ ์Šค๋ ˆ๋“œ๋Š” ์ปค๋„ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ์šด์˜์ฒด์ œ์˜ ๊ฐœ์ž… ์—†์ด ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋‹ค.)

์ด๋Ÿฌํ•œ "์‚ฌ์šฉ์ž ์ƒํƒœ ์Šค๋ ˆ๋“œ" ํ•˜๋‚˜์—๋‹ค๊ฐ€ ์‹คํ–‰ ํ๋ฆ„์œผ๋กœ handler ํ•จ์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.
์ฆ‰, ์—ฌ๋Ÿฌ๊ฐœ์˜ handler ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ ์ฝ”๋ฃจํ‹ด์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. handler ์— RPC ์š”์ฒญ๋“ค์„ ๋‹จ์ˆœํ•˜๊ฒŒ ๋™๊ธฐ๋กœ ์ž‘์„ฑํ•˜๋˜,
  2. RPC ํ˜ธ์ถœํ•จ์ˆ˜๋ฅผ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜์—ฌ ๊ฐ ํ˜ธ์ถœ์— '์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ์ '์„ ๋งŒ๋“ค์–ด ๋‘ ์œผ๋กœ์จ RPC ํ†ต์‹ ์ด ์‹œ์ž‘๋˜๊ณ  ๋ฐ”๋กœ CPU ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  3. ์ด๋ ‡๊ฒŒ ๋ฐ˜ํ™˜๋œ ์ œ์–ด๊ถŒ์€ ๋‹ค๋ฅธ ์ค€๋น„๋œ ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณต์žก์„ฑ์€ ํ”ผํ•˜๊ณ , CPU ์ปดํ“จํŒ… ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์˜ ํšจ์œจ์„ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

2.9 ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ ์—ฌํ–‰: ๋ฐ์ดํ„ฐ, ์ฝ”๋“œ, ์ฝœ๋ฐฑ, ํด๋กœ์ €์—์„œ ์ปจํ…Œ์ด๋„ˆ, ๊ฐ€์ƒ ๋จธ์‹ ๊นŒ์ง€

  • ๋ณ€์ˆ˜: ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์นญํ•˜๋Š” ๊ฒƒ.

  • ํ•จ์ˆ˜: ์ผ๋ จ์˜ ๋ช…๋ น์–ด๋ฅผ ์ง€์นญํ•˜๋Š” ๊ฒƒ.

  • ์ผ๊ธ‰ ๊ฐ์ฒด ํ•จ์ˆ˜ (first-class function): ํŠน์ • ์–ธ์–ด์—์„œ ์ฝ”๋“œ๋ฅผ ์ผ๋ฐ˜ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์„ ๋•Œ ์ด ์–ธ์–ด์˜ ํ•จ์ˆ˜.

  • ์ฝœ๋ฐฑ ํ•จ์ˆ˜: ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋  ๋•Œ. (์ธ์ž๋“  ๋ฐ˜ํ™˜์ด๋“ )

  • ํด๋กœ์ €: ์ผ๋ถ€ ๋ฐ์ดํ„ฐ์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฌถ์–ด ๋ณ€์ˆ˜๋กœ ์ทจ๊ธ‰ํ•œ ๊ฒƒ.

    • ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ณณ๊ณผ ํ˜ธ์ถœํ•˜๋Š” ๊ณณ์ด ์„œ๋กœ ๋‹ค๋ฆ„.
    • ํ˜ธ์ถœ ํ•  ๋•Œ, ์ •์˜ํ•œ ๊ณณ์—์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ.
    def add():
    	b = 10	# ์ฝœ๋ฐฑ์„ ์ •์˜ํ•œ ๊ณณ์˜ ๋ฐ์ดํ„ฐ.
      
      def add_inner(x):	# ์ฝœ๋ฐฑ
      	return x+b
      
      return add_inner
      
    f = add()
    print(f(2))
  • ์ปจํ…Œ์ด๋„ˆ: ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ”„๋กœ๊ทธ๋žจ์ด ์˜์กดํ•˜๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํ•จ๊ป˜ ๋ฌถ์–ด๋‘” ๊ฒƒ.

    • ์šด์˜์ฒด์ œ๋ฅผ ๊ฐ€์ƒํ™”.
    • ์šด์˜ ์ฒด์ œ ๊ณ„์ธต ์ˆ˜์ค€์—์„œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ƒํ™”.
    • ์ปจํ…Œ์ด๋„ˆ์— ํฌํ•จ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ๋ฅผ ๋…์ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ฒŒ ํ•จ.
  • ๊ฐ€์ƒ ๋จธ์‹ : ๊ฐ€์ƒ ๋จธ์‹  ๊ฐ์‹œ์ž์—์„œ ์‹คํ–‰๋˜๋Š” ์šด์˜์ฒด์ œ.

    • ๊ฐ€์ƒ ๋จธ์‹  ๊ฐ์‹œ์ž(ํ•˜์ดํผ๋ฐ”์ด์ €): ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”์ƒํ™” ํ•ด์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด
    • ๊ฐ€์ƒ ๋จธ์‹ (์šด์˜์ฒด์ œ)์€ ์ž์‹ ์ด ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋…์ ํ•œ๋‹ค๊ณ  ๊ฐ„์ฃผํ•จ.

3.1 ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ณธ์งˆ, ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ

๋ณ€์ˆ˜

๋ณ€์ˆ˜๋Š” ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ๋ณ„์นญ.

a = 100

100 ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ '์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„'์— ์žˆ์„ ํ…๋ฐ, ๊ทธ ๊ณต๊ฐ„์˜ ๋ณ„์นญ์„ a๋ผ๊ณ  ํ•œ ๊ฒƒ.

๋งŒ์•ฝ,

b = a

๋ผ๊ณ  ํ•˜๋ฉด, 100 ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ '๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„' ์— ๋ณต์ œํ•˜๊ณ , ๋ฐ”๋กœ ๊ทธ ๊ณต๊ฐ„์˜ ๋ณ„์นญ์„ b๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ.

ํฌ์ธํ„ฐ

'๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’'์„ '์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ณต๊ฐ„'์— ์ง€๋‹ˆ๊ณ  ์žˆ์œผ๋ฉด์„œ, ๊ทธ ๊ณต๊ฐ„์˜ ๋ณ„์นญ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜.

์ฐธ์กฐ

์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ, ๋ณต์ œํ•˜์ง€ ์•Š๊ณ ๋„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜.
ํฌ์ธํ„ฐ๋Š” '๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’'์„ ์ง์ ‘์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ, ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†์Œ. ๊ทธ ์ฃผ์†Œ์— ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ.

3.2 ํ”„๋กœ์„ธ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์—์„œ ์–ด๋–ค ๋ชจ์Šต์„ ํ•˜๊ณ  ์žˆ์„๊นŒ?

ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ตฌ์กฐ.

  • ์ฝ”๋“œ ์˜์—ญ - ์‹คํ–‰ ํŒŒ์ผ ์ดˆ๊ธฐํ™” ์‹œ์— ๋ช…๋ น์–ด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ
  • ๋ฐ์ดํ„ฐ ์˜์—ญ - ์‹คํ–‰ ํŒŒ์ผ ์ดˆ๊ธฐํ™” ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ
  • ํž™ ์˜์—ญ - ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„
  • ์Šคํƒ ์˜์—ญ - ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์‚ฌ์šฉ๋˜๋Š” ๊ณต๊ฐ„

๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์™€ ๋‹ค๋ฅด๋‹ค.
-> ํ”„๋กœ์„ธ์Šค๋Š” '๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ'๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” '์กฐ๊ฐ(chunk)' ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ ๋˜๋ฉฐ, ๊ฐ ์กฐ๊ฐ์€ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๊ตฌ์กฐ ์† ์˜์—ญ๋“ค์˜ ์กฐ๊ฐ๋“ค๊ณผ '์‚ฌ์ƒ(mapping)' ๊ด€๊ณ„๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์Œ. ์ด mapping ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” (page table).

๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ/์กฐ์ž‘ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด์„œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ณผ์ •์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•จ.

3.3 ์Šคํƒ ์˜์—ญ: ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ ๊นŒ?

ํ•จ์ˆ˜๋Š” ๊ฐ€์žฅ ๊ธฐ์ดˆ์ ์ด๊ณ  ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ ๋ฐฉ์‹.
ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ 'ํ˜ธ์ถœ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ํ˜ธ์ถœ'์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ™œ๋™์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด 'ํ›„์ž…์„ ์ถœ(LIFO)'์ด ๊ฐ€๋Šฅํ•œ ์Šคํƒ(stack) ์ด๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉ.

์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋‹ด์•„๋‘๋Š” ๊ณณ์„ '์Šคํƒ ํ”„๋ ˆ์ž„(stack frame)' ์ด๋ผ๊ณ  ํ•จ. ์ด ์Šคํƒ ํ”„๋ ˆ์ž„๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๊ณณ์ด ํ”„๋กœ์„ธ์Šค์˜ '์Šคํƒ ์˜์—ญ'.

์Šคํƒ ์˜์—ญ์—์„œ ์Šคํƒ ํ”„๋ ˆ์ž„๋“ค์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ž๋ž€๋‹ค.

์Šคํƒ ํ”„๋ ˆ์ž„

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ํ•จ์ˆ˜๊ฐ€ CPU ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๋ง๊ณผ ๊ฐ™์Œ.
๊ทธ๋ž˜์„œ ์–ด๋–ค ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ค‘์— ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, CPU ์ œ์–ด๊ถŒ์ด ์ด์ „๋˜์–ด์•ผ ํ•จ.
CPU ์ œ์–ด๊ถŒ์ด ์ด์ „๋˜๊ณ , ์›๋ž˜ ์‹คํ–‰ ์ค‘์ด๋˜ ํ•จ์ˆ˜๋กœ ๋˜๋Œ์•„ ์˜ค๊ธฐ ์œ„ํ•ด์„œ ๋‘ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•จ.

  1. ๋ฐ˜ํ™˜(return): ์–ด๋””์—์„œ ์™”๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด
    • ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ์‹œ, ๊ธฐ์กด์— ์‹คํ–‰๋˜๊ณ  ์žˆ๋˜ ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•œ ์œ„์น˜๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค. ๊ทธ๋ž˜์•ผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ๋๋‚˜๊ณ  ์›๋ž˜ ๋ช…๋ น์–ด๋กœ ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.
      ์‹คํ–‰ ์ค‘์ด๋˜ ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ๊ฐ€์žฅ ๋์— ์ €์žฅํ•ด๋‘”๋‹ค. (์Šคํƒ์˜ ์ตœ์ƒ๋‹จ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ๋Š” ์ตœํ•˜๋‹จ)
  2. ์ ํ”„(jump): ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด
    • ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ• ๋•Œ, ๊ทธ ํ•จ์ˆ˜ ๋ช…๋ น์–ด๊ฐ€(๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋ช…๋ น์–ด์˜ ์‹œ์ž‘์ด) ์–ด๋””์— ์žˆ๋Š”์ง€ ๋Œ€ํ•œ ์ •๋ณด.
      ํ˜ธ์ถœ ์‹œ call ๋ช…๋ น์–ด์˜ ์ธ์ž๋กœ, ๊ธฐ์กด ์‹คํ–‰ ์ค‘์ด๋˜ ํ•จ์ˆ˜ ๋ช…๋ น์–ด์— ์ด๋ฏธ ์ž‘์„ฑ๋˜์–ด์žˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๊ฐ’, ์ง€์—ญ๋ณ€์ˆ˜ ๋“ค์€ ์ง€์ •๋œ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ชจ์ž๋ผ๋ฉด ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅํ•ด๋‘”๋‹ค.
์‹ฌ์ง€์–ด๋Š” ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด๋˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค์ด ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง€์ง€ ์•Š๋„๋ก, ๊ธฐ์กด ์‹คํ–‰ ํ•จ์ˆ˜์˜ ๋ ˆ์ง€์Šคํ„ฐ ์ดˆ๊ธฐ๊ฐ’๋“ค์€ ๊ทธ ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„ ์ตœํ•˜๋‹จ (๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ๋Š” ์ตœ์ƒ๋‹จ)์— ์ €์žฅํ•ด ๋‘”๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ํ•œ ํ•จ์ˆ˜์˜ ์Šคํƒํ”„๋ ˆ์ž„์€ ํ•˜๋‹จ->์ƒ๋‹จ์˜ ์ˆœ์„œ๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ €์žฅ๋œ๋‹ค.
๋ ˆ์ง€์Šคํ„ฐ ์ดˆ๊ธฐ๊ฐ’ | ์ง€์—ญ ๋ณ€์ˆ˜ | ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค | ๋ฐ˜ํ™˜ ์ฃผ์†Œ

3.4 ํž™ ์˜์—ญ: ๋ฉ”๋ชจ๋ฆฌ์˜ ๋™์  ํ• ๋‹น์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ ๊นŒ?

์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅ๋œ ์ •๋ณด๋Š”, ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฌดํšจํ™”(invalidation) ๋จ.
๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์ดํ›„์—๋Š” ๊ทธ ์Šคํƒ ํ”„๋ ˆ์ž„์— ์ €์žฅ๋˜์—ˆ๋˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ.

๋งŒ์•ฝ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜์— ๊ฑฐ์ณ์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
-> ๋ฉ”๋ชจ๋ฆฌ์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„์— ๋”ฐ๋ผ ๊ฒฐ์ •๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,
ํ”„๋กœ๊ทธ๋ž˜๋จธ์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ธ ํž™ ์˜์—ญ(heap segment) ์„ ์‚ฌ์šฉ.

์ด ํž™ ์˜์—ญ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•ด ์ฃผ๋Š” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์ด C/C++ ์—์„œ๋Š” malloc ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž.
๋งํฌ ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ๋งํฌ๋˜๋Š” C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ์Œ.

๋‚˜๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž

์›๋ฆฌ์˜ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๋‚˜๋งŒ์˜ malloc ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

  1. malloc: ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์š”์ฒญ. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์š”์ฒญํ•˜๋ฉด ํž™ ์˜์—ญ์—์„œ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•ด์คŒ.
  2. free: ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์š”์ฒญ. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ์™„๋ฃŒํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋ฐ˜ํ™˜ํ–ˆ์„ ๋•Œ.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž์˜ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ง€ํ‘œ.

  1. ์†๋„: ์š”์ฒญ๋œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ํž™ ์˜์—ญ์—์„œ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”์ง€
  2. ํ™œ์šฉ๋„: ์ •ํ•ด์ง„ ํž™ ์˜์—ญ์˜ ํ•œ๋„ ๋‚ด์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์š”์ฒญ์„ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€

๊ตฌํ˜„์„ ํ•  ๋•Œ๋Š” ์•„๋ž˜์˜ 4๊ฐ€์ง€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ์•„ ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

  1. ํž™ ์˜์—ญ์—์„œ ํ˜„์žฌ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ๊ฐ€?
    • ํž™ ์˜์—ญ์„ ์–ด๋–ป๊ฒŒ๋“  '๊ตฌ์กฐํ™”' ํ•ด์•ผ ์–ด๋–ค ์˜์—ญ์ด ๊ฐ€์šฉํ•œ ์ƒํƒœ์ธ์ง€๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด, ์–ด๋–ค ์กฐ๊ฐ์— ํ• ๋‹นํ•ด์•ผ ํ• ๊นŒ?
  3. ์š”์ฒญ๋ฐ›์€ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์— ํ• ๋‹น ํ›„, ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์— ๋‚จ์€ ์ž‰์—ฌ ๋ถ€๋ถ„์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
  4. ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ๋ฐ˜ํ™˜๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ?

1๋ฒˆ : ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์˜ ํ• ๋‹น ์ƒํƒœ ์ถ”์ 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(linked list)๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
๋‹จ, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ,
ํž™ ์˜์—ญ ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์ปค๋‹ค๋ž€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•œ๋‹ค. ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

๊ฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์— ํ—ค๋”(header) ์ •๋ณด๋ฅผ ๋‘์–ด์„œ,

  • ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์–ผ๋งˆ์ธ์ง€
  • ํ• ๋‹น์ด ๋œ ์ƒํƒœ์ธ์ง€

๋ฅผ ์ €์žฅํ•ด๋‘๋ฉด, ํ• ๋‹น ์ƒํƒœ๋„ ์•Œ ์ˆ˜ ์žˆ๊ณ  ํฌ๊ธฐ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์˜ ํ—ค๋”์—๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฐ ์‹์œผ๋กœ ํž™ ์˜์—ญ ์ „์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์กฐํ™”ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ๋“ค์˜ ํ• ๋‹น ์ƒํƒœ๋ฅผ ์ถ”์ ํ•œ๋‹ค.

2๋ฒˆ : ํ• ๋‹น ์ „๋žต

  1. first-fit: ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ํ• ๋‹น ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธ.
    • ์‹œ๊ฐ„์ด ์ง€๋‚  ์ˆ˜๋ก ์•ž ๋ถ€๋ถ„์— ์ž‘์€ ์กฐ๊ฐ๋“ค์ด ๋‚จ๊ฒŒ๋จ. ๊ทธ๋ž˜์„œ ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€๋  ์ˆ˜ ์žˆ์Œ.
  2. next-fit: ๋ฐ”๋กœ ์ง์ „์— ํ• ๋‹น๋œ ์กฐ๊ฐ์˜ ์œ„์น˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ํ• ๋‹น ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธ.
    • ์ด๋ก ์ ์œผ๋กœ ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ๋น ๋ฅด๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์€ first-fit์— ๋ฏธ์น˜์ง€ ๋ชปํ•œ ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์ง.
  3. best-fit: ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ํ™•์ธํ•ด์„œ ์š”์ฒญ์— ์ ํ•ฉํ•œ ๊ฐ€์žฅ ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์— ํ• ๋‹น.
    • ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆผ. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์€ ๊ฐ€์žฅ ์ข‹์Œ.

์ƒํ™ฉ์— ๋งž๊ฒŒ ๋น„๊ต/์„ ํƒ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ. ์ •๋‹ต์€ ์—†๋‹ค.

3๋ฒˆ : ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ ์ฒ˜๋ฆฌ

ํ• ๋‹น ์‹œ, ์š”์ฒญ์— ์ ํ•ฉํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์š”์ฒญ ๋ฐ›์€ ํฌ๊ธฐ๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์œ  ๋ถ€๋ถ„์ด ์ƒ๊น€. ์ž‰์—ฌ ๋ถ€๋ถ„์„ ๋ฌด์‹œํ•œ๋‹ค๋ฉด ์ด๋Š” ๋‚ด๋ถ€ ๋‹จํŽธํ™”(fragmentation)๊ฐ€ ๋ฐœ์ƒ.

๊ทธ๋ž˜์„œ ๋ณดํ†ต ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋˜๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ํ™œ์šฉํ•จ.

4๋ฒˆ : ๋ฐ˜ํ™˜๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ

free ์š”์ฒญ์„ ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ—ค๋” ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , '๋ณ‘ํ•ฉ' ํ•ด์•ผ ํ•จ.
๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ๊ณ„์† ๋ถ„๋ฆฌ๋˜์–ด ๊ทธ๊ฒƒ๋ณด๋‹ค ํฐ ๋ฉ”๋ชจ๋ฆฌ ์š”์ฒญ์— ๋Œ€์‘ํ•  ์ˆ˜ ์—†์Œ.

๋‹จ, ๋ณ‘ํ•ฉ ์‹œ๊ธฐ๋ฅผ '๋ฐ˜ํ™˜ ์ฆ‰์‹œ' ๋˜๋Š” 'ํ•„์š” ์‹œ(์š”์ฒญ์— ์ ํ•ฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์ด ์—†์„ ๋•Œ)' ๋‘˜ ์ค‘ ํ•˜๋‚˜๋กœ ์„ ํƒ ๊ฐ€๋Šฅ. ๋ฐ˜ํ™˜ ์ฆ‰์‹œ ๋ณ‘ํ•ฉ์€ ๊ตฌํ˜„์ด ๋งค์šฐ ๋‹จ์ˆœํ•˜์ง€๋งŒ, ์‹ค์ œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž๋Š” ๋Œ€๋ถ€๋ถ„ ํ•„์š” ์‹œ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ผ์ข…์˜ ์—ฐ๊ธฐ ์ „๋žต์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

๋˜ํ•œ ํž™ ์˜์—ญ์„ ํ—ค๋” ์ •๋ณด๋กœ๋งŒ ๊ด€๋ฆฌํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌ์กฐํ™” ํ•˜๋ฉด, ๋ณ‘ํ•ฉ ์‹œ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์˜ ์•ž์— ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ๊ณผ ๋ณ‘ํ•ฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›€. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์— footer ๋ฅผ ๋‘๊ณ  ํ—ค๋”์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‘ ์œผ๋กœ์จ, ์•”์‹œ์ ์ธ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(doubly linked list)๋กœ ํž™ ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•จ.

๐Ÿ‘‰ ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์›๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž ๊ตฌํ˜„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜.
์‹ค์ œ๋กœ๋Š” ์ตœ์ ํ™” ํ•  ๊ณณ์ด ๋งค์šฐ ๋งŽ์œผ๋ฉฐ ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋ฌธ์ œ๋„ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

3.5 ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ ์ €์ˆ˜์ค€ ๊ณ„์ธต์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ

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๊ฐ€ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ ํ•  ๋•Œ์˜ ์ƒํƒœ์ด๋‹ค.
    ํฌ๊ฒŒ ์ƒ๊ฐํ•ด์„œ ์šด์˜ ์ฒด์ œ ์ด์™ธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ์œ ์ € ์ƒํƒœ์—์„œ ์‹คํ–‰๋œ ๋‹ค๊ณ  ๋ณด์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

    • ํŠน์ • ์ฃผ์†Œ ๊ณต๊ฐ„ (์ฃผ๋กœ ์ปค๋„ ์ฃผ์†Œ ๊ณต๊ฐ„)์— ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ ‘๊ทผ ์‹œ segmentation fault.
    • ํŠน์ • ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ring 0 ์ƒํƒœ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ๋„คํŠธ์›Œํฌ ์ž…์ถœ๋ ฅ๊ณผ ๊ฐ™์€ ์šด์˜์ฒด์ œ์˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ
์‹œ์Šคํ…œ ์ฝœ(system call) ์ด๋ผ๋Š” ์ž‘๋™ ๋ฐฉ์‹์„ ํ™œ์šฉํ•œ๋‹ค.
์šด์˜ ์ฒด์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•ด์„œ, ์šด์˜ ์ฒด์ œ์— ์–ด๋–ค ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ ์‹œ์Šคํ…œ ์ฝœ์€ ๋‹น์—ฐํžˆ ์šด์˜ ์ฒด์ œ์™€ ๋งค์šฐ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€์ด ์žˆ๊ณ , ์šด์˜ ์ฒด์ œ ๋ณ„๋กœ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ค ๋‹ค๋ฅด๋‹ค.
์ด ์ฐจ์ด๋ฅผ ๊ฐ์ถ”๊ณ  ์ถ”์ƒํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(standard library)๊ฐ€ ์กด์žฌํ•œ๋‹ค.
์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์šด์˜์ฒด์ œ ๋ณ„๋กœ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘์–ด์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ.

๊ฒฐ๊ตญ ์ „์ฒด ์‹œ์Šคํ…œ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ - ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ์šด์˜ ์ฒด์ œ - ํ•˜๋“œ ์›จ์–ด
malloc ๊ณผ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž๋„ ์‚ฌ์‹ค ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์†ํ•ด ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

ํž™ ์˜์—ญ์˜ ์ฆ๊ฐ€

malloc ๊ณผ ๊ฐ™์€ ์š”์ฒญ ์‹œ ํž™ ์˜์—ญ์˜ ๋‚จ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด, brk ๋ผ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•ด์•ผ ํ•œ๋‹ค. brk๋Š” ํž™ ์˜์—ญ์˜ ์ตœ์ƒ๋‹จ์„ ์˜๋ฏธํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง„ ๋ณ€์ˆ˜์ด๋ฉด์„œ, ํž™ ์˜์—ญ ์ฆ๊ฐ€๋ฅผ ์š”์ฒญํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ์ด๋ฆ„์ด๊ธฐ๋„ ํ•˜๋‹ค.

์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋”๋ผ๋„ ๋ฐ”๋กœ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋กœ์„œ๋งŒ ํ• ๋‹น๋œ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ํ• ๋‹น๋œ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— page fault๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด ๋•Œ๊ฐ€ ๋˜์„œ์•ผ ์šด์˜ ์ฒด์ œ๋Š” ํ•ด๋‹น ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์™€์˜ ์‚ฌ์ƒ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•จ์œผ๋กœ์จ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

3.6 ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ ํ’€์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ ๊นŒ?

malloc ์€ ๋งค์šฐ ๋ฒ”์šฉ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ์„œ ๋ชจ๋“  ์ƒํ™ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์‹  ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
๋ฒ”์šฉ์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ง€์ง€๋งŒ ์ฆ‰, ํŠน์ • ์ƒํ™ฉ์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ๋ฒ•์ด ์žˆ์„๊นŒ? -> ๋ฉ”๋ชจ๋ฆฌ ํ’€ (memory pool)

๋ฉ”๋ชจ๋ฆฌ ํ’€

ํ•œ ๋ฒˆ์— ํฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์š”์ฒญํ•œ ํ›„, ๊ทธ๊ฒƒ์„ pool๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹.

  • ์„œ๋ฒ„ ์š”์ฒญ์—์„œ ๋‹จ ํ•œ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ํ’€์— ๊ทธ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด ๋‘๊ณ  ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์“ฐ๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ฐ€๋Šฅ.
  • ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด ์ฆ‰, ์—ฌ๋Ÿฌ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์š”์ฒญ์— ๋Œ€์‘ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ํ’€ ๋‚ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ๋“ค์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•ด ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
    • ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋ฐ›์€ ํฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์ชผ๊ฐœ์„œ ์‚ฌ์šฉํ•œ๋‹ค. ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์˜ ์œ„์น˜๋ฅผ ๊ธฐ์–ตํ•œ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด, malloc์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ํ• ๋‹น ๋ฐ›์•„ ์ด์ „ ์กฐ๊ฐ๊ณผ ๋งํฌ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค. ์ฆ‰ ์ƒˆ๋กœ ๋ฐ›์€ ํฐ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(๋ฉ”๋ชจ๋ฆฌ ํ’€)์— ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹จ, ์ƒˆ๋กœ์šด ์กฐ๊ฐ์€ ์ด์ „ ์กฐ๊ฐ์˜ ํฌ๊ธฐ์˜ 2๋ฐฐ๋กœ ์š”์ฒญํ•œ๋‹ค. malloc ์„ ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์š”์ฒญํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • ์Šค๋ ˆ๋“œ ์•ˆ์ „ ๋ฌธ์ œ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ ํ’€์„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.
    ์Šค๋ ˆ๋“œ ์ „์šฉ ์ €์žฅ์†Œ(thread local storage)๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

3.7 ๋Œ€ํ‘œ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ๋ฒ„๊ทธ

  1. ์ง€์—ญ ๋ณ€์ˆ˜์˜ ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜ํ•˜๊ธฐ
    • ๋‹น์—ฐํžˆ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ์Šคํƒ ํ”„๋ ˆ์ž„์€ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.
  2. ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์˜ ์ž˜๋ชป๋œ ์ดํ•ด
    • ํฌ์ธํ„ฐ ์—ฐ์‚ฐ์€ 1์„ ๋”ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ž๋ฃŒํ˜• ํฌ๊ธฐ ๋งŒํผ์˜ ๋‹ค์Œ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. ์ผ๋ถ€๋Ÿฌ ์ž๋ฃŒํ˜• ํฌ๊ธฐ ๋งŒํผ์„ ๋”ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
  3. ๋ฌธ์ œ ์žˆ๋Š” ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ ํ•˜๊ธฐ
    • int a; scanf("%d", a); ๋ผ๊ณ  ํ•˜๋ฉด ์ž˜๋ชป๋œ ์‚ฌ์šฉ. scanfํ•จ์ˆ˜๋Š” ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ฃผ์†Œ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.
  4. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ
    • malloc ์œผ๋กœ ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌด์กฐ๊ฑด 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด์žˆ์ง€๋Š” ์•Š์Œ. ์ด๋ฏธ ํ•œ ๋ฒˆ ์‚ฌ์šฉ๋˜๊ณ  ๋ฐ˜ํ™˜๋œ ์ฃผ์†Œ์—๋Š” ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ๋‚จ์•„ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋™์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์–ด์•ผ ํ•จ.
  5. ์ด๋ฏธ ํ•ด์ œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ
    • ๋‹น์—ฐํžˆ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. ํ•ด๋‹น ์ฃผ์†Œ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์งˆ ์ˆ˜ ์žˆ์Œ.
  6. ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘.
    • int* arr = (int*)malloc(n * sizeof(int)) ๋ผ๊ณ  ํ• ๋‹น ๋ฐ›์•˜์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์‹ฑ์€ arr[0] ๋ถ€ํ„ฐ arr[n-1]๊นŒ์ง€์ž„. arr[n] ์— ์“ฐ๊ฒŒ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ.
  7. stack overflow
    • C์–ธ์–ด์˜ gets ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ๋ฒ„ํผ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ถ€ํ„ฐ ์ž„์˜์˜ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Œ. ๋ฒ„ํผ๊ฐ€ ์ง€์—ญ๋ณ€์ˆ˜๋ผ๋ฉด ์Šคํƒํ”„๋ ˆ์ž„์— ์œ„์น˜ํ•˜๊ณ  ๊ทธ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ๋„˜์–ด์„œ๋ฉด ๋ฌธ์ œ ๋ฐœ์ƒ. ๋ฒ„ํผ๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„ ๋‚ด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํฌ๊ธฐ๋ฅผ ๋„˜์–ด ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๊ฑด๋“œ๋ฆฌ๋„๋ก ํ•˜์—ฌ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋Š” ๊ณต๊ฒฉ ๋ฐฉ์‹๋„ ์žˆ์Œ.
    • ์ฆ‰, ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์Šคํƒ ํ”„๋ ˆ์ž„์˜ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด์„œ ์‚ฌ์šฉ๋˜๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.
  8. memory leak
    • int p = malloc(); return; ํ•ด๋ฒ„๋ฆฌ๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๊นŒ์ง€ ํ•ด์ œํ•  ๋ฐฉ๋ฒ•์ด ์—†์Œ.
    • ์ด๋Ÿฐ ์‹์˜ ๋ˆ„์ˆ˜๊ฐ€ ๋ˆ„์ ๋˜์„œ ํž™ ์˜์—ญ์ด ์ ์  ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜๊ณ  ์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Œ.
    • ์‚ฌ์šฉ ์ค‘์ธ ์–ธ์–ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ„์„๊ธฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ฒซ ๋ฒˆ์งธ ๋ฉ”๋ชจ๋ฆฌ ๋ถ„์„๊ธฐ์˜ ์ข…๋ฅ˜๋Š” malloc ๊ณผ free ์˜ ์‚ฌ์šฉ์„ ์ถ”์ ํ•˜๋Š” ๋ฐฉ์‹. ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๊ธฐ๋„ ํ•˜๊ณ , ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ.
      • ๋‘ ๋ฒˆ์งธ ์ข…๋ฅ˜๋Š” page fault ์˜ ๋นˆ๋„๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ. page fault๋Š” ์•„์ง ๊ฐ€์ƒ-๋ฌผ๋ฆฌ ๊ฐ„์˜ mapping์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์„ ๋•Œ๋„ ๋ฐœ์ƒํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด swap์ด ๋งŽ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ์—์„œ ๋งŽ์ด ๋ฐœ์ƒํ•จ. ๊ทธ๋ž˜์„œ ๋ฆฌ๋ˆ…์Šค์˜ perf ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•ด ์ด page fault์— ๋Œ€์‘ํ•˜๋Š” ์‹œ์Šคํ…œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์Šคํƒ ์ •๋ณด๋ฅผ ์ถ”์ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Œ.

3.8 ์™œ SSD๋Š” ๋ฉ”๋ชจ๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„๊นŒ?

  1. ์†๋„
    SSD(Solid State Drive)์˜ ์ŠคํŽ™์„ ํ™•์ธํ•ด๋ณด๋ฉด sequential reading speed ๊ฐ€ ์ตœ๋Œ€ 7.5GB/s.
    ์ด๊ฒƒ๋„ ๋งค์šฐ ๋น ๋ฅด์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋” ๋น ๋ฆ„ -> 60GB/s.

  2. ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์™€ ๋””์Šคํฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ์˜ ์ฐจ์ด
    ๋ฐ”์ดํŠธ vs ๋ธ”๋ก
    ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ ์ง€์ • ๋‹จ์œ„๋Š” ๋ฐ”์ดํŠธ. ๊ฐ ๋ฐ”์ดํŠธ ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ ๋ถ€์—ฌ๋˜์–ด ์žˆ๊ณ , CPU๋Š” ์ด ์ฃผ์†Œ๋กœ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ.
    ๋””์Šคํฌ์˜ ๋ธ”๋ก(block) ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ. CPU๊ฐ€ ํŠน์ • ๋ฐ”์ดํŠธ์— ์ง์ ‘ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋””์Šคํฌ๋กœ ์ง์ ‘ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ด ๋ถˆ๊ฐ€.

  3. ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ์ œํ•œ
    32๋น„ํŠธ ์‹œ์Šคํ…œ์˜ ์ตœ๋Œ€ ์ฃผ์†Œ ๋ฒ”์œ„๋Š” 4GB. 1TB ํฌ๊ธฐ์˜ SSD๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์“ฐ๋”๋ผ๋„ ํ”„๋กœ์„ธ์Šค๋Š” 4GB ์ด์ƒ์€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€.
    ๋‹จ 64๋น„ํŠธ ์‹œ์Šคํ…œ์€ ์ด ์ œํ•œ์— ๋Œ€ํ•ด ์˜ˆ์™ธ์ด๊ธด ํ•จ.

  4. SSD ์‚ฌ์šฉ ์ˆ˜๋ช… ๋ฌธ์ œ
    SSD๋Š” ์ˆ˜๋ช…์ด ์กด์žฌ. ๋งˆ์น˜ ์ž๋™์ฐจ์˜ ์ฃผํ–‰๊ฑฐ๋ฆฌ์™€ ๊ฐ™์€ ์ง€ํ‘œ๊ฐ€ SSD์—์„œ๋Š” TBW(TeraBytes Written).
    ์ผ๋ฐ˜์ ์œผ๋กœ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” SSD์˜ TBW๋Š” ๋Œ€๋žต ์ˆ˜๋ฐฑ TB ์ˆ˜์ค€.
    SSD๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด CPU๋Š” ๋Œ€๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ ์“ฐ๊ธฐ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜๋ช… ๋ฌธ์ œ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ.
    SSD๋ฅผ ๋””์Šคํฌ์™€ ๊ฐ™์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ์ผ์ด ๋งŽ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ˆ˜๋ช… ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ ์—†์Œ.

์ข…ํ•ฉ์ ์œผ๋กœ ๋ดค์„ ๋•Œ, ์ €์žฅ์žฅ์น˜ ์ œ์กฐ ๊ธฐ์ˆ ์˜ ํ•œ๊ณ„๋กœ, ํ•˜๋“œ์›จ์–ด ์†Œํ”„ํŠธ์›จ์–ด ๋ถ€๋ฌธ ๋‘˜ ๋‹ค SSD๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์žˆ์Œ.

4.1 ์ด ์ž‘์€ ์žฅ๋‚œ๊ฐ์„ CPU๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค

CPU๋Š” ๊ฒฐ๊ตญ ์ˆ˜์‹ญ์–ต ๊ฐœ์˜ ์Šค์œ„์น˜(๊ฐœํ์žฅ์น˜)๋กœ ์ด๋ฃจ์–ด์ง„ ์žฅ์น˜.
ํŠธ๋žœ์ง€์Šคํ„ฐ๊ฐ€ ๋ฐ”๋กœ ๊ทธ ์Šค์œ„์น˜ ์—ญํ• .

๋…ผ๋ฆฌ ํšŒ๋กœ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํŠธ๋žœ์ง€์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค์Œ์˜ ์„ธ ๊ฐ€์ง€ ํšŒ๋กœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

  1. ๋…ผ๋ฆฌ๊ณฑ ๊ฒŒ์ดํŠธ(AND gate): ๋‘ ๊ฐœ์˜ ์Šค์œ„์น˜๊ฐ€ ๋ชจ๋‘ ์ผœ์ ธ์•ผ ์ „๋ฅ˜๊ฐ€ ํ๋ฆ„.

  2. ๋…ผ๋ฆฌํ•ฉ ๊ฒŒ์ดํŠธ(OR gate): ๋‘ ์Šค์œ„์น˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ผœ์ ธ์žˆ์œผ๋ฉด ์ „๋ฅ˜๊ฐ€ ํ๋ฆ„.

  3. ๋…ผ๋ฆฌ๋ถ€์ • ๊ฒŒ์ดํŠธ(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์ด ๊ฐ€ํ•ด์กŒ์„ ๋•Œ์˜ ์ƒํƒœ.

  • Active-Low ์ด๋ฉด action์ด 0์— ํ•ด๋‹นํ•œ๋‹ค๋Š” ๋œป. ์ฆ‰ no-action์€ 1, ์ „๋ฅ˜๊ฐ€ ํ๋ฅด๋Š” ์ƒํƒœ์ด๋‹ค.
  • Active-High ์ด๋ฉด action์ด 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 ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

4.2 CPU๋Š” ์œ ํœด ์ƒํƒœ์ผ ๋•Œ ๋ฌด์—‡์„ ํ• ๊นŒ?

์‹ค์ œ ์ปดํ“จํ„ฐ์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์€ ์ƒ๊ฐ๋ณด๋‹ค ๋†’์ง€ ์•Š๋‹ค.

์šด์˜ ์ฒด์ œ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„๋ง ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํ”„๋กœ์„ธ์Šค์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๊ณ  ๋Œ€๊ธฐ์—ด์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด์žˆ์„ ๋•Œ, ์ฆ‰ CPU๋ฅผ ์‚ฌ์šฉํ•  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์„ ๋•Œ๋ฅผ ์œ ํœด ์ƒํƒœ๋ผ๊ณ  ํ•œ๋‹ค.

์„ค๊ณ„์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ด '์œ ํœด ์ƒํƒœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”' ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜ ์กด์žฌํ•œ๋‹ค. ์ด๋ฅผ ์œ ํœด ์ž‘์—…์ด๋ผ๊ณ  ํ•˜์ž. ์ด ์œ ํœด ์ž‘์—…์€ ์–ธ์ œ๋‚˜ ์ค€๋น„์ƒํƒœ๋กœ, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋กœ ๋Œ€๊ธฐ์—ด์— ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค.
์ฆ‰, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋Œ€๊ธฐ์—ด์— ์Šค์ผ€์ค„๋งํ•  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์„ ๋•Œ ์ด ์œ ํœด ํ”„๋กœ์„ธ์Šค๋ฅผ ์Šค์ผ€์ค„ํ•˜๊ฒŒ ๋œ๋‹ค.

halt

๊ฒฐ๊ตญ ์ด ์œ ํœด ์ž‘์—…์€ halt ๋ผ๋Š” ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ๋ฃจํ”„์•ˆ์—์„œ ๊ณ„์† ์‹คํ–‰ํ•˜๋Š” ์ž‘์—…๊ณผ ๊ฐ™๋‹ค.

halt๋Š” CPU๋ฅผ ์ ˆ์ „ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋กœ, ํŠน๊ถŒ ๋ช…๋ น์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„ ์ƒํƒœ์—์„œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.
sleep ๊ณผ ๊ฐ™์ด ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋งŒ์„ ์ผ์‹œ์ค‘์ง€(suspend) ํ•˜๋Š” ๋ช…๋ น์–ด์™€๋Š” ๋‹ค๋ฅด๋‹ค. halt๋Š” ๋” ์ด์ƒ CPU๊ฐ€ ์‹คํ–‰ํ•  ์ค€๋น„ ์™„๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์„ ๋•Œ ์‹คํ–‰๋œ๋‹ค.

์‹ค์ œ๋กœ ์ปดํ“จํ„ฐ ์ž…์žฅ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด๋Š” halt ๋ช…๋ น์–ด์ผ ๊ฒƒ์ด๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ

์œ„์™€ ๊ฐ™์ด halt๊ฐ€ ๋ฃจํ”„ ์•ˆ์—์„œ ๊ณ„์† ์‹คํ–‰๋  ๋•Œ, ์–ด๋–ป๊ฒŒ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์„๊นŒ.

์ปดํ“จํ„ฐ์—์„œ ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ(timer interrupt)๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋น ์ ธ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฃจํ”„์—์„œ ๋น ์ ธ๋‚˜์˜ฌ ๊ธฐํšŒ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ CPU๊ฐ€ ์ธ์‹ํ•˜๊ณ , CPU๋Š” ์šด์˜์ฒด์ œ ๋‚ด๋ถ€์— ๋“ฑ๋ก๋œ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ง€๊ธˆ ์ค€๋น„ ์™„๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ ์žˆ๋‹ค๋ฉด ์ค€๋น„ ์™„๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์•„๋‹ˆ๋ผ๋ฉด ์œ ํœด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค.

4.3 CPU๋Š” ์ˆซ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์ธ์‹ํ• ๊นŒ?

2์ง„๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
CPU๋Š” ํŠธ๋žœ์ง€์Šคํ„ฐ, ์ฆ‰ ์ผœ๊ณ  ๋„๋Š” ์Šค์œ„์น˜๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ.

  • unsigned integer
    • ๋ถ€ํ˜ธ๊ฐ€ ์—†๋Š” 0๊ณผ ์–‘์˜ ์ •์ˆ˜๋“ค. 8๊ฐœ์˜ ๋น„ํŠธ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ unsigned integer๋Š” 0 ~ 255.
  • signed integer
    • ๋ถ€ํ˜ธ๊ฐ€ ์žˆ๋Š” 0๊ณผ ์ •์ˆ˜๋“ค. ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด ์–‘์ˆ˜์™€ ์Œ์ˆ˜์— ๋ฐฐ๋ถ„ํ•œ๋‹ค.
      4๊ฐœ์˜ ๋น„ํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ 16๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ 1 ~ 7, -1 ~ -7, 0, -0 ๋กœ ๋‚˜๋ˆ„๋Š” ์‹.
      (ํ˜น์€ 1 ~ 7, -1 ~ -8, 0)
    • ์ตœ์ƒ์œ„ ๋น„ํŠธ(most significant bit)์— ๋ถ€ํ˜ธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
      0***** ์–‘์ˆ˜
      1***** ์Œ์ˆ˜
    • ์Œ์ˆ˜์— ๋Œ€ํ•˜์—ฌ ์ตœ์ƒ์œ„ ๋น„ํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‹ค๋ฅธ ๋น„ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋‚จ์Œ. 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌ.

<์šฉ์–ด>

๋ณด์ˆ˜(่ฃœๆ•ธ)๋Š” ๋ณด์ถฉ์„ ํ•ด์ฃผ๋Š” ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์ด๋ฅผํ…Œ๋ฉด 1์— ๋Œ€ํ•œ 10์˜ ๋ณด์ˆ˜๋Š” 9, 4์— ๋Œ€ํ•œ 15์˜ ๋ณด์ˆ˜๋Š” 11์˜ ๊ฐœ๋…์ด๋‹ค. 1์— ๋Œ€ํ•œ 2์˜ ๋ณด์ˆ˜๋Š” 1์ด๋‹ค.

1์˜ ๋ณด์ˆ˜๋Š” ์˜์–ด๋กœ ones' 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์ด 2๊ฐœ ์ƒ๊ธฐ๋Š” ๋ณต์žก์„ฑ
    • (1์˜ ๋ณด์ˆ˜) ๋ง์…ˆ ์‹œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒํ•˜๋ฉด ์ถ”๊ฐ€๋กœ 1์„ ๋”ํ•ด์ฃผ์–ด์•ผ ํ•จ (end-around-carry)
      • -0 + 1 = 1 ์ด์–ด์•ผ ํ•˜์ง€๋งŒ
        1111 + 0001 = 0000, ์ฆ‰ 0์ด ๋œ๋‹ค.
  • ๊ฒฐ๊ตญ, ์–‘์ˆ˜์™€ ์Œ์ˆ˜์˜ ๊ด€๊ณ„๋ผ๋Š” ๊ฒƒ์€

    A+โˆ’A=0A + -A = 0

    ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ด€๊ณ„๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,
    ์ด๋ฅผ ๋งŒ์กฑํ•˜๋ฉด์„œ๋„ 0 ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 0000 ํ•˜๋‚˜์ธ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒƒ.

    ๋ฐฉ๋ฒ•์€ ์–‘์ˆ˜์— ์Œ์ˆ˜๋ฅผ ๋”ํ–ˆ์„ ๋•Œ ๋”ฑ๋งž๊ฒŒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.
    ๋น„ํŠธ๊ฐ€ 4๊ฐœ๋ผ๊ณ  ํ•˜๋ฉด 0001 + 1111 = (1)0000๊ฐ€ "๋”ฑ๋งž๊ฒŒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ"๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์ด๊ณ , ๊ฒฐ๊ณผ๋Š” 0์ด๋‹ค.

    • 000 (0)
    • 001 (1)+ 111 (-1) = (1)000 = 0
    • 010 (2) + 110 (-2) = (1)000 = 0
    • 011 (3) + 101 (-3) = (1)000 = 0
    • 100 (-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)์ด ์ž๋ฆฌ ์˜ฌ๋ฆผ์ˆ˜๋ผ๋Š” ๊ฒƒ๋งŒ ์•Œ๊ณ  ์ˆ˜ํ–‰ํ•  ๋ฟ์ด๋‹ค.

    ์ด๋Š” ์ง€๊ทนํžˆ ๋‹จ์ˆœํ•œ ์—ฐ์‚ฐ์ž‘์—…๋งŒ์„ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์˜ ๋™์ž‘์ด๋‹ค.
    ํ•ด์„ํ•˜๊ณ  ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์€ "์†Œํ”„ํŠธ์›จ์–ด"์˜ ์˜์—ญ์ด๋‹ค.

4.4 CPU๊ฐ€ if๋ฌธ์„ ๋งŒ๋‚ฌ์„ ๋•Œ

ํŒŒ์ดํ”„๋ผ์ธ (pipeline)

์ž‘์—…์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆˆ ๋‹ค์Œ,

  • ๊ฐ ๋‹จ๊ณ„์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋Š” ํ๋ฆ„๊ณผ
  • ์ง€์†์ ์ธ ์ž…๋ ฅ

์„ ํ†ตํ•ด ์ „์ฒด์ ์ธ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๋†’์ด๋Š” ๊ฒƒ. ๋‹จ, ์ž‘์—… ๋‹จ์œ„ ๋‹น ์ฒ˜๋ฆฌ์‹œ๊ฐ„์€ ๋™์ผํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์ฐจ ๊ณต์žฅ์—์„œ ์ž๋™์ฐจ ํ•œ ๋Œ€๊ฐ€ ์™„์„ฑ๋˜๋Š” ๋ฐ์— 80๋ถ„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ํ•˜์ž. ์ƒ์‚ฐ ๊ณผ์ •์„ ๋‹จ ํ•˜๋‚˜์˜ ํŒ€์ด ๋งก์•„์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์—ฌ์ „ํžˆ 80๋ถ„์— 1๋Œ€๊ฐ€ ์ƒ์‚ฐ๋˜์ง€๋งŒ, ์ƒ์‚ฐ ๊ณผ์ •์„ 4๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์‰ฌ์ง€์•Š๊ณ  ๋„˜๊ธฐ๋ฉด ๊ฒฐ๊ณผ์ ์œผ๋กœ 20๋ถ„์— 1๋Œ€๊ฐ€ ์ƒ์‚ฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ 80๋ถ„์— 4๋Œ€๋ฅผ ์ƒ์‚ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋™์ฐจ 'ํ•œ ๋Œ€'๊ฐ€ ์™„์„ฑ๋˜๋Š” ๋ฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—ฌ์ „ํžˆ 80๋ถ„์ด๋‹ค.

CPU๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ

CPU ๋˜ํ•œ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ด์šฉํ•ด์„œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด์˜ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๋†’์ธ๋‹ค.

ํ•˜๋‚˜์˜ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ ๋‹ค์Œ์˜ 4๋‹จ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  1. ๋ช…๋ น์–ด ์ธ์ถœ (instruction fetch: IF)
  2. ๋ช…๋ น์–ด ํ•ด๋… (instruction decode: ID)
  3. ์‹คํ–‰ (execute: EX)
  4. ๋‹ค์‹œ ์“ฐ๊ธฐ (write back: WB)

๊ฐ ๋‹จ๊ณ„๋Š” ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

if ๊ฐ€ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋‚˜๋ฉด

if ๋ฌธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ '์กฐ๊ฑด๋ถ€ ์ ํ”„ ๋ช…๋ น์–ด'๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ์ ํ”„ํ•˜๊ณ , ๊ฑฐ์ง“์ด๋ผ๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ์ด '์กฐ๊ฑด๋ถ€ ์ ํ”„ ๋ช…๋ น์–ด'๊ฐ€ '์‹คํ–‰' ๋˜์–ด์•ผ ์ ํ”„ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒ์ดํ”„๋ผ์ธ์— ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์„์ง€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ์กฐ๊ฑด๋ถ€ ์ ํ”„ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๊นŒ์ง€ ํŒŒ์ดํ”„๋ผ์ธ์— ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ”„๋กœ์„ธ์„œ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ญ๋น„ํ•˜๋Š” ๊ผด์ด ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์กฐ๊ฑด๋ถ€ ์ ํ”„ ๋ช…๋ น์–ด์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๊ธฐ ์ „, ํŒŒ์ดํ”„๋ผ์ธ์— ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด CPU๋Š” ๋ถ„๊ธฐ ์˜ˆ์ธก (branch prediction) ์„ ํ•œ๋‹ค. ์ด ์˜ˆ์ธก์„ ํ†ตํ•ด ๋ถ„๊ธฐ ๊ฒฐ๊ณผ ๋„์ถœ ์ „ ํŒŒ์ดํ”„๋ผ์ธ์— ์˜ˆ์ƒ ๋ช…๋ น์–ด๋ฅผ ๋ฏธ๋ฆฌ ๋„ฃ์–ด๋‘๊ณ , ์˜ˆ์ƒ์ด ๋งž์•˜๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์‹คํ–‰์„, ํ‹€๋ ธ๋‹ค๋ฉด ์ž˜๋ชป๋œ ๋ถ„๊ธฐ ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋‘ ๋ฌดํšจํ™” ํ•œ๋‹ค. ๊ฒฐ๊ตญ ๋ถ„๊ธฐ ์˜ˆ์ธก์— ์‹คํŒจํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ.

ํ˜„๋Œ€์˜ CPU ๋ถ„๊ธฐ ์˜ˆ์ธก์€ ๊ต‰์žฅํžˆ ๋ฐœ๋‹ฌ๋˜์–ด ์žˆ๊ธด ํ•˜๋‚˜, ๋†’์€ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ์ฝ”๋“œ์— if๋ฌธ์ด ์žˆ๋‹ค๋ฉด CPU๊ฐ€ ๋ถ„๊ธฐ ์˜ˆ์ธก์— ์„ฑ๊ณตํ•  ํ™•๋ฅ ์ด ๋†’๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. C++์˜ likely/unlikely ๋งคํฌ๋กœ๋Š” ์ด๋Ÿฐ ์ด์œ ์—์„œ ์กด์žฌ ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ๋Ÿฌ์— ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์€ ๋ถ„๊ธฐ๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

CPU์˜ ๊ตฌํ˜„ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์œผ๋กœ CPU๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๋‹ค.

4.5 CPU ์ฝ”์–ด ์ˆ˜์™€ ์Šค๋ ˆ๋“œ ์ˆ˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋Š” ๋ฌด์—‡์ผ๊นŒ?

CPU ์ฝ”์–ด ์ˆ˜์™€ ์Šค๋ ˆ๋“œ ์ˆ˜ ์‚ฌ์ด์—๋Š” ์–ด๋–ค ํ•„์—ฐ ๊ด€๊ณ„๋„ ์—†๋‹ค.

ํ•˜๋“œ์›จ์–ด๋Š” ์ง€๊ทนํžˆ ๋‹จ์ˆœํ•œ ์—ฐ์‚ฐ์ž‘์—…๋งŒ์„ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰ํ•  ๋ฟ์ด๋‹ค.
ํ•ด์„ํ•˜๊ณ  ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์€ "์†Œํ”„ํŠธ์›จ์–ด"์˜ ์˜์—ญ์ด๋‹ค.

  • CPU๋Š” ํ•˜๋“œ์›จ์–ด๋กœ, PC์นด์šดํ„ฐ ์ฃผ์†Œ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ๊บผ๋‚ด ์‹คํ–‰ํ•  ๋ฟ์ด๋‹ค. ์Šค๋ ˆ๋“œ์˜ ์กด์žฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์•Œ ํ•„์š”๋„ ์—†๋‹ค.
  • ์Šค๋ ˆ๋“œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ด๊ณ , ์ •ํ™•ํ•˜๊ฒŒ๋Š” "์‹คํ–‰ ํ๋ฆ„"์ด์ž "์ž‘์—…"์ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด์ ์œผ๋กœ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ํ•ด์„ํ•œ ๊ฒฐ๊ณผ๋กœ์„œ ์กด์žฌํ•œ๋‹ค. ์ถ”์ƒ์ ์ธ ์ž‘์—…์˜ ๋‹จ์œ„์ด๊ณ , ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋” ํฐ ์†Œํ”„ํŠธ์›จ์–ด์ธ ์šด์˜์ฒด์ œ์ด๋‹ค.

๋‹จ์ผ ์ฝ”์–ด๋“  ๋‹ค์ค‘ ์ฝ”์–ด๋“  ํ”„๋กœ๊ทธ๋žจ์˜ ํ•„์š”์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ๋ฅผ ์–ผ๋งˆ๋“ ์ง€ ๋งŽ์ด ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹ค๋งŒ,

  • ์Šค๋ ˆ๋“œ๋“ค์˜ ์ž‘์—…์ด ์ž…์ถœ๋ ฅ/๋™๊ธฐํ™” ๊ฐ™์€ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ '์ˆœ์ˆ˜ํ•œ ๊ณ„์‚ฐ' ์œ„์ฃผ๋ผ๋ฉด
    -> ์ฝ”์–ด๋‹น ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ์„ ํƒ์ด๊ณ ,
  • ์Šค๋ ˆ๋“œ์— ๋ธ”๋กœํ‚น ์ž…์ถœ๋ ฅ์ด ์กด์žฌํ•œ๋‹ค๋ฉด
    -> ๊ทธ ์ž‘์—…์„ ๋ถ„ํ• ํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๋” ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

์Šค๋ ˆ๋“œ์˜ ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œ ๊ฐ„ ์ „ํ™˜ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ฝ”์–ด๋‹น ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ๋‹จ์ˆœํžˆ ์ˆ˜์น˜ํ™” ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ์‹ค์ œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ง€์†์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค.

4.6/4.7/4.8 CPU ์ง„ํ™”๋ก 

๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ์˜ ํƒ„์ƒ

CPU๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ฝ์–ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ ๋ฟ.
๊ทธ๋ ‡๋‹ค๋ฉด CPU์˜ '๋Šฅ๋ ฅ ๋ฒ”์œ„'๋Š” ๊ฒฐ๊ตญ '์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€'์™€ ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.
์ด๋ฅผ ๋ช…๋ น์–ด ์ง‘ํ•ฉ(instruction set)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋ช…๋ น์–ด ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๊ธฐ์–ตํ•ด์•ผํ•  ์‚ฌ์‹ค.

  • ๋ช…๋ น์–ด ์ง‘ํ•ฉ์€ ๊ฒฐ๊ตญ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜์—ˆ์Œ.
    • ์ตœ์ดˆ์˜ ํ”„๋กœ๊ทธ๋žจ์€ CPU์— ๋Œ€์‘ํ•˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์ž‘์„ฑ๋จ.
  • ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ CPU๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.
    • ๋ช…๋ น์–ด ์ง‘ํ•ฉ์˜ ํ˜•ํƒœ์™€ CPU ํ•˜๋“œ์›จ์–ด์˜ ์„ค๊ณ„๋Š” ์•„์ฃผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ.

๊ฐ€์žฅ ์ฒ˜์Œ์œผ๋กœ ๋“ฑ์žฅํ•œ CISC(Complex Instruction Set Computer)๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.
(x86 ๊ตฌ์กฐ๋Š” ์ด CISC์— ๊ธฐ์ดˆ๋ฅผ ๋‘๊ณ ์žˆ๋‹ค)

CISC

"๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ", ์ฆ‰ CISC์˜ ํƒ„์ƒ์ด ํ•„์—ฐ์ ์ด์—ˆ๋˜ ์ด์œ .

  1. ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์˜ ํŽธ๋ฆฌํ•จ์„ ์œ„ํ•ด
    • 1970๋…„๊นŒ์ง€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์„ฑ์ˆ™ํ•˜์ง€ ๋ชปํ•ด, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค.
    • ์ด๋Š” ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด ํ’๋ถ€ํ•˜๊ณ , ๋ช…๋ น์–ด ์ž์ฒด ๊ธฐ๋Šฅ์ด ๊ฐ•๋ ฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ์ด์–ด์กŒ๋‹ค.
      • ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด '๋งค์šฐ ์ ๊ฑฐ๋‚˜', ๋ช…๋ น์–ด ์ž์ฒด ๊ธฐ๋Šฅ์ด '๋‹จ์ˆœ'ํ•œ ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€.
    • ์ด๋ฅผ ์ปดํ“จํ„ฐ ๊ณผํ•™์ž๋“ค์€ '์˜๋ฏธ์ƒ ๊ฐ„๊ฒฉ(semantic gap)'์„ ์ด์–ด์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ๋‹ค.
      • ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์ˆœํ™˜ ์ œ์–ด ๋“ฑ์˜ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๊ฐœ๋…๊ณผ ์ด์— ์ง์ ‘ ๋Œ€์‘ํ•˜๋Š” ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ.
    • ์ฆ‰, ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ฒ˜๋Ÿผ '์ถ”์ƒํ™”๋œ' ํ˜•ํƒœ๋กœ ์กด์žฌํ•ด์•ผํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.
    • ์ฆ‰, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‹จ์ˆœํ•จ์„ ์œ„ํ•ด ๋ช…๋ น์–ด ์ง‘ํ•ฉ์˜ ๊ตฌํ˜„์ด '๋ณต์žก(complex)'ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.
  2. ์ฝ”๋“œ์˜ ์ €์žฅ๊ณต๊ฐ„ ์ ˆ์•ฝ์„ ์œ„ํ•ด
    • 'ํฐ ๋…ธ์ด๋งŒ ๊ตฌ์กฐ' ์—์„œ๋Š” "์‹คํ–‰ ํŒŒ์ผ์ด ๊ธฐ๊ณ„ ๋ช…๋ น์–ด์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ํฌํ•จ"ํ•˜๊ณ  ์žˆ๊ณ , ์ด๋Š” ๋””์Šคํฌ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋˜์–ด ์‹คํ–‰๋œ๋‹ค. ์ฆ‰, ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.
    • 1970๋…„๋Œ€์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๊ฐ€ ์ˆ˜KB ~ ์ˆ˜์‹ญKB ์— ๋ถˆ๊ณผํ–ˆ๋‹ค.
    • ๊ทธ๋ž˜์„œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ๋ฐ˜๋“œ์‹œ ๋งค์šฐ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ฐจ์ง€ํ•˜๋Š” ์ €์žฅ๊ณต๊ฐ„์„ ์ค„์—ฌ์•ผ ํ–ˆ๊ณ , ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์„ฑ์œผ๋กœ ์ด์–ด์กŒ๋‹ค.
      • ๋‹จ์ผ ๋ช…๋ น์–ด : ํ•˜๋‚˜์˜ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋กœ ๋” ๋งŽ์€ ์ž‘์—…์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Œ.
      • ๊ฐ€๋ณ€ ๊ธธ์ด ๋ช…๋ น์–ด: ๊ธฐ๊ณ„ ๋ช…๋ น์–ด ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š์Œ. ๊ณต๊ฐ„์˜ ๋‚ญ๋น„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ.
      • ๊ณ ๋„๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ช…๋ น์–ด: ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ.

๋”๋ถˆ์–ด, ๋งˆ์ดํฌ๋กœ์ฝ”๋“œ(microcode) ๋ผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ CPU ์„ค๊ณ„์— ๋„์ž…ํ–ˆ๋‹ค.

์ด ์‹œ๊ธฐ CPU ๋ช…๋ น์–ด ์ง‘ํ•ฉ์€ ๋ชจ๋‘ 'hardwired' ๋˜์–ด ์žˆ์—ˆ๋‹ค. IF, ID, EX ๋“ฑ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ํŠน์ • ์กฐํ•ฉ ํšŒ๋กœ๋กœ ์ง์ ‘ ์ œ์–ด๋˜๋Š” ๊ฒƒ.
์ด๋Š” ๋ช…๋ น์–ด ์‹คํ–‰์—๋Š” ๋งค์šฐ ํšจ์œจ์ ์ด๋‚˜ ์œ ์—ฐ์„ฑ์ด ๋งค์šฐ ๋–จ์–ด์ ธ ๋ช…๋ น์–ด ์ˆ˜์ •์—๋Š” ๋Œ€์‘ํ•˜๊ธฐ ํž˜๋“ค์—ˆ์Œ.

๊ทธ๋ž˜์„œ, ๋ช…๋ น์–ด ์ง‘ํ•ฉ์˜ ๊ณตํ†ต๋˜๋Š” ์—ฐ์‚ฐ์„ ์ •์˜ํ•ด๋‘” ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ •์˜ํ•ด์„œ ์ด๋ฅผ CPU์— ์ €์žฅํ•ด๋‘ ์œผ๋กœ์จ ๋ชจ๋“  ๊ธฐ๊ณ„ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์ „์šฉ ํšŒ๋กœ ์„ค๊ณ„๋ฅผ ํ•˜์ง€ ์•Š๋„๋ก ํ•จ.
๋ณต์žกํ•œ ํ•˜๋“œ์›จ์–ด ๋ณ€๊ฒฝ ๋Œ€์‹ , ๋น„๊ต์  ์‰ฌ์šด ์†Œํ”„ํŠธ์›จ์–ด ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ๋ช…๋ น์–ด ์ง‘ํ•ฉ์˜ ๋ณ€๊ฒฝ์— ๋Œ€์‘ํ•˜๋„๋ก ํ•œ ๊ฒƒ.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋งˆ์ดํฌ๋กœ์ฝ”๋“œ๋Š”,

  • ๋ฒ„๊ทธ ์ˆ˜์ •์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฒ„๊ทธ ์ˆ˜์ •๋ณด๋‹ค ํ›จ์”ฌ ์–ด๋ ค์› ๊ณ ,
  • ํŠธ๋žœ์ง€์Šคํ„ฐ๋ฅผ ๋งค์šฐ ๋งŽ์ด ์†Œ๋ชจํ–ˆ๋‹ค.

-> ์ƒˆ๋กœ์šด ์„ค๊ณ„์— ๋Œ€ํ•œ ํ•„์š”๊ฐ€ ๋Œ€๋‘๋˜์—ˆ์Œ.

์ถ•์†Œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์˜ ํƒ„์ƒ

CISC ๋Š” ํ•œ์ •๋œ ์ž์›์˜ ์‹œ๋Œ€์— ์ ์‘ํ•œ ๊ฒฐ๊ณผ๋กœ ํƒ„์ƒํ•œ ๊ฒƒ.
์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์™€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ์ˆ ์ด ๋ฐœ์ „ํ–ˆ๊ณ , ๋ณต์žก ๋ช…๋ น์–ด์˜ ๋‚ด๋ถ€์˜ ๋ณต์žก์„ฑ(๋ช…๋ น์–ด๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ๋ณต์žก์„ฑ)์˜ ๋น„ํšจ์œจ ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ดํฌ๋กœ์ฝ”๋“œ์˜ ๋น„ํšจ์œจ์ด ์ ์ฐจ ๋ถ€๊ฐ๋จ.

RISC

"์ถ•์†Œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ"์˜ ํƒ„์ƒ. ๊ทธ๊ฒƒ์ด ๊ฐ€์ง€๋Š” ํŠน์„ฑ

  1. ๋ช…๋ น์–ด์˜ ๋ณต์žก์„ฑ์„ ์ค„์ž„
  • ์—ฌ๊ธฐ์„œ ๊ณ„์† ๋งํ•˜๋Š” ๋ช…๋ น์–ด์˜ ๋ณต์žก์„ฑ์€ ๋ช…๋ น์–ด ๋’ท๋‹จ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ž‘์—…์˜ ๋ณต์žก์„ฑ์„ ์˜๋ฏธํ•จ.
  • ๋ณต์žกํ•œ ๋ช…๋ น์–ด ํ•˜๋‚˜ ๋Œ€์‹ , ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ.
  • ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋‹น ๋“ค์—ฌ์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ์ด ๋” ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ์˜๋ฏธ.
  1. ์ปดํŒŒ์ผ๋Ÿฌ
  • ๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ์—์„œ๋Š” ๋งˆ์ดํฌ๋กœ์ฝ”๋“œ์˜ ์ •๋ณด๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•จ.
  • ์ถ•์†Œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์—์„œ๋Š” ๋งˆ์ดํฌ๋กœ์ฝ”๋“œ ์—†์ด CPU์˜ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ œ๊ณตํ•จ์œผ๋กœ์จ,
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ CPU์— ๋Œ€ํ•ด ๋” ๊ฐ•๋ ฅํ•œ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ.
  1. LOAD / STORE ๊ตฌ์กฐ
  • ๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๊ณผ ํ•จ๊ป˜ IF, EX, WB ๋‹จ๊ณ„๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Œ.
  • ์ถ•์†Œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…๋ น์–ด๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๋‚ด์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ ,
  • LOAD / STORE ๊ฐ™์€ ์ „์šฉ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋งŒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฝ๊ธฐ ์“ฐ๊ธฐ๋ฅผ ๋‹ด๋‹นํ•จ.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ A, B์— ์ €์žฅ๋œ ๋‘ ์ˆซ์ž๋ฅผ ๊ณฑํ•˜๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด,

๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ์€

MULT A B

ํ•˜๋‚˜๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๋ถ€ํ„ฐ ์—ฐ์‚ฐ๊นŒ์ง€ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ฉด, ์ถ•์†Œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์€

LOAD RA, A
LOAD RB, B
PROD RA, RB
STORE A, RA

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๊ณผ ์—ฐ์‚ฐ์˜ ๋‹จ๊ณ„๋ฅผ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ๊ณ„๋ณ„๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ์€ ๋ช…๋ น์–ด ์‚ฌ์ด์— ๋น„๊ต์  ์ฐจ์ด๊ฐ€ ์ปค์„œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ณ ๋ฅด์ง€ ์•Š๋‹ค. -> ํŒŒ์ดํ”„๋ผ์ธ ๋ฐฉ์‹ ํ™œ์šฉ ์–ด๋ ค์›€.
ํ•˜์ง€๋งŒ ์ถ•์†Œ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์—…์„ ํ’€์–ด์“ฐ๋ฉด, ๊ฐ ๋ช…๋ น์–ด๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์‹œ๊ฐ„์ด ๋ชจ๋‘ ๊ฑฐ์˜ ๋™์ผํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. -> ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ์ˆ ์„ ๋„์ž…ํ•˜๊ธฐ ์•„์ฃผ ์ข‹์Œ.

๊ฐœ์„ ๋œ ๋ณต์žก ๋ช…๋ น์–ด ์ง‘ํ•ฉ

CISC ์ง„์˜์—์„œ ๋‹จ์ ์„ ๊ฐœ์„ .

  1. ๋งˆ์ดํฌ๋กœ ๋ช…๋ น์–ด (micro-operation)
  • CISC์˜ ๋ช…๋ น์–ด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™œ์šฉํ•ด, CPU ๋‚ด๋ถ€์—์„œ ๋ช…๋ น์–ด๋ฅผ RISC ๋ช…๋ น์–ด ๋ณ€ํ™˜. ์ž˜๊ฒŒ ์ชผ๊ฐœ๋Š” ๊ฒƒ.
  • ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ชผ๊ฐœ์ง„ ๋ช…๋ น์–ด๋“ค์ด RISC์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•ด์ง€๊ณ , ๊ฐ ๋ช…๋ น์–ด์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ณ ๋ฅด๊ฒŒ ๋˜๊ณ , ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ์ˆ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ.
  1. ํ•˜์ดํผ์Šค๋ ˆ๋”ฉ (hyper-threading)
  • CPU๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์Šค๋ ˆ๋“œ. ํ•˜๋“œ์›จ์–ด ์Šค๋ ˆ๋“œ.
  • ๋ฌผ๋ฆฌ CPU ์ฝ”์–ด๊ฐ€ ํ•˜๋‚˜๋ผ๊ณ  ํ•ด๋„, ์šด์˜ ์ฒด์ œ๋Š” ๋…ผ๋ฆฌ์ ์œผ๋กœ CPU ์ฝ”์–ด๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ค์ œ ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ์ˆ ์€ ๋ช…๋ น์–ด๊ฐ„ ์ข…์†์„ฑ์œผ๋กœ ์ธํ•ด ํ•ญ์ƒ ์™„๋ฒฝํ•˜๊ฒŒ ์ฑ„์›Œ์ง„ ์ƒํƒœ์ผ ์ˆ˜๋Š” ์—†๋‹ค. ํ•„์—ฐ์ ์œผ๋กœ ๋นˆ ๊ณต๊ฐ„์ด ๋ฐœ์ƒํ•˜๊ณ , ์ด ํ‹ˆ์— ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด ํ๋ฆ„(์Šค๋ ˆ๋“œ)์„ ๋ผ์›Œ๋„ฃ์–ด ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ.
  • ์žŠ์ง€ ๋ง์•„์•ผ ํ•  ์ ์€, ์†Œํ”„ํŠธ์›จ์–ด ์Šค๋ ˆ๋“œ์˜ ๊ด€๋ฆฌ ์ฃผ์ฒด๋Š” ์šด์˜ ์ฒด์ œ์ด๊ณ , ํ•˜๋“œ์›จ์–ด ์Šค๋ ˆ๋“œ(ํ•˜์ดํผ์Šค๋ ˆ๋”ฉ)์€ CPU ํ•˜๋“œ์›จ์–ด์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์šด์˜ ์ฒด์ œ์™€ ๋ฌด๊ด€.

๋‘ ์ง„์˜์€ ์„œ๋กœ ์žฅ์ ์€ ์ทจํ•˜๊ณ  ์•ฝ์ ์€ ๋ณด์™„ํ•˜๋ฉด์„œ ๋Š์ž„ ์—†์ด ๋ฐœ์ „ ์ค‘.
CISC๋Š” ์ ์  RISC ๋ช…๋ น์–ด์— ๊ฐ€๊นŒ์›Œ ์ง€๊ณ  ์žˆ๊ณ , ์ผ๋ถ€ ๊ณ ์„ฑ๋Šฅ RISC๋„ ๋งˆ์ดํฌ๋กœ๋ช…๋ น์–ด๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์Œ.
๋‹ค๋งŒ ์•„์ง๋„ ๋ถ„๋ช…ํ•œ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ,

  1. RISC์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์•„์ง๋„ ์ค‘์š”ํ•œ ์—ญํ• . ๋ช…๋ น์–ด์˜ ๊ธธ์ด๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” RISC๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด์ธ CISC์— ๋น„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”์— ์ด์ ์ด ์žˆ์Œ.
  2. ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์‹œ ์•„์ง๋„ RISC๋Š” LOAD / STORE ๊ตฌ์กฐ์ด๊ณ , CISC๋Š” ์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ์—†์Œ.

์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ธฐ์ˆ ์  ๊ด€์ . ์ƒ์—…์  ๊ด€์ ์—์„œ์˜ ๋‘ ์ง„์˜์˜ ๋Œ€๊ฒฐ ๋˜ํ•œ ์กด์žฌ.

  • x86์œผ๋กœ ๋Œ€ํ‘œ๋˜๋Š” CISC์˜ ๋Œ€ํ‘œ์ฃผ์ž๋Š” intel๊ณผ AMD.
    • ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” RISC๊ฐ€ ์šฐ์„ธํ–ˆ๋”๋ผ๋„, CISC๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ƒํƒœ๊ณ„๋ผ๋Š” ํ›Œ๋ฅญํ•œ ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Œ. ์ด๋ฏธ ๋งŽ์€ ์ˆ˜์˜ ํ›Œ๋ฅญํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ x86 ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ.
    • ๋™์‹œ์— RISC์—์„œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์šฐ์ˆ˜ํ•œ ์‚ฌ์ƒ๋“ค์„ ํก์ˆ˜ํ•˜์—ฌ ๋ฐœ์ „ํ–ˆ์Œ.
    • ์œˆํ…”(์œˆ๋„์šฐ + ์ธํ…”)์ด ์ด๋ฅผ ๋ฒˆ์˜์‹œ์ผœ ๋ฐ์Šคํฌํƒ‘, ์„œ๋ฒ„ ์‹œ์žฅ ์ ๋ น์— ์„ฑ๊ณต.
  • RISC์˜ ๋Œ€ํ‘œ์ฃผ์ž๋Š” ARM.
    • ์•„์ดํฐ ์ถœ์‹œ์™€ ํ•จ๊ป˜ ๋ณธ๊ฒฉ์ ์ธ ๋ชจ๋ฐ”์ผ ์‹œ๋Œ€.
    • ์˜ค๋žซ๋™์•ˆ ๋…์ ์ ์ธ ์œ„์น˜๋ฅผ ๊ฐ€์ง„ ์œˆํ…” ์ง„์˜์€ ๋ณ€ํ™”์— ๋ฐ˜์‘ํ•˜๋Š” ๋ฐ์— ๋„ˆ๋ฌด ํฐ ๊ด€์„ฑ์ด ๋ฐœ์ƒ.
    • ARM์ด ๊ธฐํšŒ๋ฅผ ์–ป์–ด ์Šค๋งˆํŠธํฐ ํ”„๋กœ์„ธ์„œ๋Š” RISC์˜ ์ง„์˜์ด ๋…์ ํ•˜๊ฒŒ ๋จ.
    • ์• ํ”Œ์€ ์ž์ฒด ๊ฐœ๋ฐœํ•œ ๋ชจ๋ฐ”์ผ ํ”„๋กœ์„ธ์„œ ์„ค๊ณ„ ๋Šฅ๋ ฅ๊ณผ ์ด๋ฅผ ํ†ตํ•ด ์–ป์€ ๋ฐ์Šคํฌํƒ‘ ํ”„๋กœ์„ธ์„œ ์„ค๊ณ„ ๋Šฅ๋ ฅ์œผ๋กœ M1 ์นฉ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์ด๋ฅด๋Š”๋ฐ, ์ด ์นฉ์ด RISC์˜ ARM์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ์Œ.
  • ๋‘ ๊ธฐ์ˆ ์€ ์•„์ง๋„ ๊ณต์กด, ๊ฒฝ์Ÿ, ๋ฐœ์ „ ์ค‘.

4.9 CPU, ์Šคํƒ๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ถœ, ์‹œ์Šคํ…œ ํ˜ธ์ถœ, ์Šค๋ ˆ๋“œ ์ „ํ™˜, ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ†ต๋‹ฌํ•˜๊ธฐ

context

๋ ˆ์ง€์Šคํ„ฐ๋Š” ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ„. ๋Œ€์‹  ์ œ์กฐ ๋น„์šฉ์ด ๋น„์‹ธ์„œ ์šฉ๋Ÿ‰์— ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ.
ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋˜ CPU๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ๋ ˆ์ง€์Šคํ„ฐ์— ์ž„์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€.
ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ, ํŠน์ • ์‹œ์ ์—์„œ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ '์ƒํ™ฉ ์ •๋ณด'(context) ๋ผ๊ณ  ํ•จ.

์•„๋ž˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ ˆ์ง€์Šคํ„ฐ๋“ค -> ์ฆ‰ context

  1. ์Šคํƒ ํฌ์ธํ„ฐ
  • ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ์Šคํƒ ํ”„๋ ˆ์ž„๋“ค์ด ์Œ“์ด๋Š” ๋Ÿฐํƒ€์ž„ ์Šคํƒ์˜ ์ƒ๋‹จ์˜ ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋จ.
  • ์Šคํƒ ํ”„๋ ˆ์ž„: ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ ํ•จ์ˆ˜์— ์ •์˜๋œ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ์ „๋‹ฌ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„.
  1. ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ
  • PC: program counter ํ˜น์€ x86์—์„œ IP: instruction pointer ๋ผ๊ณ  ๋ถ€๋ฆ„.
  • CPU๊ฐ€ ์ง€๊ธˆ ๋‹น์žฅ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๊ฐ€ PC์— ์ €์žฅ๋จ. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ๋กœ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๊ฐ€ PC์— ์ €์žฅ๋˜๋Š” ๊ฒƒ.
  • ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ํ˜€์žˆ๊ธฐ์— PC๋˜ํ•œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์ง€๋งŒ, ๋ถ„๊ธฐ ์ ํ”„(if๋ฌธ), ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๋ฐ˜ํ™˜ ๊ฐ™์€ ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด ์ฃผ์†Œ๊ฐ€ PC์— ์ €์žฅ๋จ.
  1. ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ (status register)
  • x86 ์—์„œ๋Š” FLAGS ๋ ˆ์ง€์Šคํ„ฐ, ARM ์—์„œ๋Š” application program status register ๋ผ๊ณ  ๋ถ€๋ฆ„.
  • ์‚ฐ์ˆ  ์—ฐ์‚ฐ ์‹œ ๋ฐœ์ƒํ•˜๋Š” carry(์ž๋ฆฌ ์˜ฌ๋ฆผ์ˆ˜) ํ˜น์€ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ ์ •๋ณด๋ฅผ ์ €์žฅ.
  • CPU์˜ user mode, kernel mode ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋น„ํŠธ๋ฅผ ์ €์žฅ. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด CPU์˜ ๋™์ž‘ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋จ.

์ด๋Ÿฌํ•œ context ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์ผ์‹œ ์ •์ง€ํ•˜๊ณ  ์žฌ๊ฐœํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•จ.
CPU๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 4๊ฐ€์ง€ ์ƒํ™ฉ์—์„œ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ '์ˆœ์ฐจ์ ์ธ ํ๋ฆ„' ์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๊ณ , ์ด ๋•Œ context์˜ ์ €์žฅ๊ณผ ๋ณต์›์ด ํ•„์š”ํ•จ.

  • ํ•จ์ˆ˜ ์‹คํ–‰
  • ์‹œ์Šคํ…œ ์ฝœ
  • ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ
  • ์Šค๋ ˆ๋“œ ์ „ํ™˜

์ €์žฅ๊ณผ ๋ณต์›

์œ„ 4๊ฐ€์ง€ ์ƒํ™ฉ์˜ ๊ตฌํ˜„์€ CPU context์˜ ์ €์žฅ/๋ณต์›์ด ํ•„์ˆ˜์ ์ด๊ณ  ์ด๋Š” ์Šคํƒ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์™„์„ฑ๋œ๋‹ค.

์ค‘์ฒฉ ๊ตฌ์กฐ์—๋Š” ์Šคํƒ (stack)์ด ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค.
โ”” (A๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ B๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ)
์Šคํƒ์€ ์ผ์ข…์˜ ๋งค์ปค๋‹ˆ์ฆ˜์ผ ๋ฟ์ด๋ฏ€๋กœ, ์ด๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋“  ํ•˜๋“œ์›จ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋“  ์ƒ๊ด€ ์—†์Œ.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ ๊ธฐ๋Šฅ์€ ์–ด๋–ป๊ฒŒ context๋ฅผ ์ €์žฅ/๋ณต์› ํ•˜๊ณ  ์žˆ์„๊นŒ.

  1. ํ•จ์ˆ˜ ์‹คํ–‰

    • ํ•จ์ˆ˜ ์‹คํ–‰์„ ์œ„ํ•ด์„ 
      1. ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์–ด๋กœ "์ ํ”„" ํ•ด์•ผ ํ•˜๊ณ ,
      2. ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์›๋ž˜ ์œ„์น˜๋กœ "์ ํ”„"ํ•ด์•ผ ํ•จ์„ ๊ธฐ์–ต.
    • ๊ฒฐ๊ตญ ์ด๋Š” ๊ธฐ์กด์— ์‹คํ–‰ํ•˜๋˜ ํ•จ์ˆ˜์˜ context๋ฅผ ์ €์žฅ/๋ณต์› ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ.
    • ์Šคํƒ ํ”„๋ ˆ์ž„์ด๋ผ๋Š” ๊ณณ์— context ๋กœ์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ, ์‚ฌ์šฉํ•œ ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด ๋“ฑ์„ ์ €์žฅํ•˜๊ณ  ๋‚˜์ค‘์— ์ด๋ฅผ ์ด์šฉํ•ด context๋ฅผ ๋ณต์›ํ•œ๋‹ค.
    • ์ด ์Šคํƒ ํ”„๋ ˆ์ž„๋“ค์ด ์Œ“์—ฌ์„œ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์„ ๋งŒ๋“ ๋‹ค.
    • ์ฆ‰, ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด์„œ๋Š” ๋Ÿฐํƒ€์ž„ ์Šคํƒ์ด ํ•„์š”ํ•˜๋‹ค.

    ์ •๋ฆฌํ•˜๋ฉด,

    1. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ,
    2. CPU์˜ user mode ํ˜น์€ kernel mode์˜ ๋ณ€ํ™” ์—†์ด,
    3. ์‹คํ–‰ ์ค‘์ธ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์— (๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋Ÿฐํƒ€์ž„ ์Šคํƒ ์•ˆ ํ˜„์žฌ ์‹คํ–‰ ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์—), ๋ฐ˜ํ™˜ ์ฃผ์†Œ, ์‚ฌ์šฉํ•œ ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด ๋“ฑ์˜ context๋ฅผ ์ €์žฅํ•˜๊ณ ,
    4. ์‹คํ–‰ ์ค‘์ธ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํ›„,
    5. ํ˜ธ์ถœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ์™„๋ฃŒ๋˜๋ฉด context๋ฅผ ๋ณต์›ํ•˜์—ฌ ์ด์ „ ํ•จ์ˆ˜ ์‹คํ–‰์ด ์žฌ๊ฐœ๋œ๋‹ค.
  2. ์‹œ์Šคํ…œ ์ฝœ

    • ์‹œ์Šคํ…œ ์ฝœ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šด์˜์ฒด์ œ ๋˜ํ•œ ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” 'ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ' ํ•ด์•ผ ํ•จ์„ ๊ธฐ์–ต.
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ์„ ์œ„ํ•ด์„œ๋Š” ๋Ÿฐํƒ€์ž„ ์Šคํƒ์ด ํ•„์š”ํ•˜๋‹ค. -> ์ปค๋„ ์Šคํƒ

    ์ •๋ฆฌํ•˜๋ฉด,

    1. ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•  ๋•Œ (๋Œ€์‘ ๋˜๋Š” ๋ช…๋ น์–ด, x86 ์—์„œ๋Š” INT ๊ฐ€ ์‹คํ–‰๋  ๋•Œ),
    2. CPU๊ฐ€ user mode์—์„œ kernel mode ๋กœ ์ „ํ™˜๋˜๊ณ ,
    3. ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€์‘ํ•˜๋Š” ์ปค๋„ ์Šค๋ ˆ๋“œ์˜ ์ปค๋„ ์Šคํƒ์—, ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ ๋ ˆ์ง€์Šคํ„ฐ ์ •๋ณด์™€ ๊ฐ™์€ context๋ฅผ ์ €์žฅํ•˜๊ณ ,
    4. ์ปค๋„ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํ›„,
    5. ํ•จ์ˆ˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด context๋ฅผ ๋ณต์›ํ•˜์—ฌ user mode ๋ณต๊ท€, ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์žฌ๊ฐœ๋œ๋‹ค.
  3. ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ

    • ์ธํ„ฐ๋ŸฝํŠธ๋Š” ์‹œ์Šคํ…œ ์ฝœ๊ณผ ๋‹ฌ๋ฆฌ ์™ธ๋ถ€ ์žฅ์น˜๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, CPU๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํƒœ์—์„œ ๋ช…๋ น์–ด ์ˆ˜ํ–‰ ์‹œ ์–ธ์ œ๋“ ์ง€ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ต.
    • ์ธํ„ฐ๋ŸฝํŠธ ๋˜ํ•œ ์šด์˜ ์ฒด์ œ๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
      ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์— interrupt service routine(ISR) ์Šคํƒ์ด๋ผ๋Š” ์ž์ฒด ๋Ÿฐํƒ€์ž„ ์Šคํƒ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋Š” ISR ์Šคํƒ์—์„œ ์‹คํ–‰๋จ. ์•„๋‹ˆ๋ผ๋ฉด ์ปค๋„ ์Šคํƒ์—์„œ.

    ์ •๋ฆฌํ•˜๋ฉด, (์ปค๋„ ์Šคํƒ ์‚ฌ์šฉ ์‹œ)

    1. ์–ธ์ œ๋“  ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ,
    2. CPU๊ฐ€ user mode์—์„œ kernel mode๋กœ ์ „ํ™˜๋˜๊ณ ,
    3. ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€์‘ํ•˜๋Š” ์ปค๋„ ์Šค๋ ˆ๋“œ์˜ ์ปค๋„ ์Šคํƒ์— context๋ฅผ ์ €์žฅํ•˜๊ณ ,
    4. ์ปค๋„ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํ›„,
    5. ํ•จ์ˆ˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด context๋ฅผ ๋ณต์›ํ•˜์—ฌ user mode ๋ณต๊ท€, ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์žฌ๊ฐœ๋œ๋‹ค.
  4. ์Šค๋ ˆ๋“œ ์ „ํ™˜

    • ์Šค๋ ˆ๋“œ ์ „ํ™˜์€ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์˜ ํƒ€์ด๋จธ๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ธํ„ฐ๋ŸฝํŠธ๋กœ ์ด๋ฃจ์–ด์ง์„ ๊ธฐ์–ต.
    • ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ ์‹œ, ์ปค๋„ ์•ˆ์˜ ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด์„œ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ€์ง„ ์‹œ๊ฐ„์ด ๋‚จ์•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‚จ์€ ์‹œ๊ฐ„์ด ์—†๋‹ค๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์ „ํ™˜ํ•˜๊ฒŒ ๋จ.
    • ์Šค๋ ˆ๋“œ ์ „ํ™˜์—๋Š” 1) ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ, 2) CPU์˜ ์ž‘์—…์„ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ: context๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ. ์ด ํฌํ•จ๋œ๋‹ค.
    • ๋ชจ๋“  ๋ฆฌ๋ˆ…์Šค ์Šค๋ ˆ๋“œ์—๋Š” process descriptor ๋กœ task_struct๊ฐ€ ์กด์žฌํ•˜๊ณ , ๊ทธ ์•ˆ์— thread_struct๊ฐ€ ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ CPU context๋ฅผ ์ €์žฅํ•˜๋Š” ์—ญํ• .

    ์ •๋ฆฌํ•˜๋ฉด,

    1. ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ,
    2. CPU๊ฐ€ user mode์—์„œ kernel mode๋กœ ์ „ํ™˜๋˜๊ณ ,
    3. ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€์‘ํ•˜๋Š” ์ปค๋„ ์Šค๋ ˆ๋“œ์˜ ์ปค๋„ ์Šคํƒ์— ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์˜ ํ˜„์žฌ context๋ฅผ ์ €์žฅํ•˜๊ณ ,
    4. ์ปค๋„ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด ์Šค๋ ˆ๋“œ ์ „ํ™˜์ด ํ•„์š”ํ•˜๋‹ค๋ฉด,
    5. ์ปค๋„ ์Šค๋ ˆ๋“œ์˜ task_struct -> thread_struct ์— context๋ฅผ ์ €์žฅํ•˜๊ณ ,
    6. ์ „ํ™˜ํ•  ์Šค๋ ˆ๋“œ์˜ context๋ฅผ task_struct -> thread_struct ์—์„œ ์ฝ์–ด CPU์— ๋ณต์›ํ•˜๊ณ ,
    7. user mode๋กœ ๋ณต๊ท€ํ•ด ์ „ํ™˜๋œ ์Šค๋ ˆ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์žฌ๊ฐœ๋œ๋‹ค.
profile
I think I think too much.

0๊ฐœ์˜ ๋Œ“๊ธ€