๐Ÿคฟ (5) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ• ๊นŒ? ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ• ๊นŒ?

Kayยท2023๋…„ 3์›” 9์ผ
0

Javascript

๋ชฉ๋ก ๋ณด๊ธฐ
6/12

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

์ฃผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋™๊ธฐ, ๋น„๋™๊ธฐ๋ผ๋Š” ๋‹จ์–ด์— ๋Œ€ํ•ด ๋จผ์ € ์ •๋ฆฌํ•˜๊ณ  ๋“ค์–ด๊ฐ€๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

  • Syncronousย ๋™๊ธฐ: ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ํ•ด๋‹น ์š”์ฒญ์˜ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹
  • Asynchronousย ๋น„๋™๊ธฐ: ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์‘๋‹ต๊ณผ ๊ด€๊ณ„์—†์ด ๋‹ค์Œ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

์ฆ‰, ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ,

๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ ์ž‘์—…์ด ๋๋‚˜๊ธฐ ์ „์— ๋‹ค์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•  ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์–ธ์ œ ๋๋‚ ์ง€, ์–ธ์ œ ์‹œ์ž‘ํ• ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ,

์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ž‘์—…ํ•˜์—ฌ ๋น„๊ต์  ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ๋ฐฉ๋ฒ•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๊ณ  ํ—ท๊ฐˆ๋ฆฌ๊ณค ํ•˜๋Š”๋ฐ ์•„๋งˆ ์ถ”์ธก์ปจ๋ฐ Node.js๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ ์‹ถ๋‹ค.

Node.js ๋ฅผ ์ฒ˜์Œ ํ•™์Šตํ•  ๋•Œ ํ•ญ์ƒ ๋งˆ์ฃผํ•˜๋Š” ๊ทธ ๋ฌธ์žฅ๊ณผ ๋‹จ์–ด๋“ค!

โ€œNode.js๋Š” V8 ์—”์ง„์œผ๋กœ ๋นŒ๋“œ๋œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์ด๋ฉฐ,
๋…ผ๋ธ”๋กœํ‚น I/O์™€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•œ ๋†’์€ ์„ฑ๋Šฅ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.โ€ (์ถœ์ฒ˜: ์œ„ํ‚ค๋ฐฑ๊ณผ)

  • V8 ์—”์ง„: ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๊ธฐ๋ฐ˜์„ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ (๊ตฌ๊ธ€ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์™€ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ธŒ๋ผ์šฐ์ €์— ํƒ‘์žฌ)
  • ์ด๋ฒคํŠธ: ๋ธŒ๋ผ์šฐ์ €์—์„œ ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋“ฑ ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์ด ์ผ์–ด๋‚œ ๊ฒƒ์„ ์ด๋ฒคํŠธ๋ผ๊ณ  ํ‘œํ˜„
  • ๋Ÿฐํƒ€์ž„: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๊ตฌ๋™๋˜๋Š” ํ™˜๊ฒฝ
  • ๋…ผ๋ธ”๋กœํ‚น: ๋น„๋™๊ธฐ(Asynchronous)๋ฅผ ์˜๋ฏธ โ†โ†’ ๋ธ”๋กœํ‚น: ๋™๊ธฐ(Syncronous)๋ฅผ ์˜๋ฏธ
  • I/O: Input๊ณผ Output
  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ: ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์•ˆ์—์„œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” ์ตœ์†Œ ์‹คํ–‰ ๋‹จ์œ„๋ฅผ ์Šค๋ ˆ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ, ๋ธ”๋กœํ‚น(๋™๊ธฐ, Syncronous) ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ๋™์ž‘ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ

  • ํ˜ธ์ถœ ์Šคํƒ(Call Stack): ์›์‹œ ํƒ€์ž… ๊ฐ’๊ณผ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(Execution Context) ์ €์žฅ
  • ๋ฉ”๋ชจ๋ฆฌ ํž™(Memory Heap): ์ฐธ์กฐํƒ€์ž…์ด ์ €์žฅ๋˜๋ฉฐ, ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ๋ฐฉ๋ฒ•

  1. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ˆœ์„œ๋Œ€๋กœ Call Stack์— ์‹คํ–‰ํ•  ํ•จ์ˆ˜๊ฐ€ ์Œ“์ธ๋‹ค.(push)
  2. ์Œ“์ธ ๋ฐ˜๋Œ€ ์ˆœ์„œ๋กœ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.(LIFO)
  3. ์‹คํ–‰์ด ๋œ ํ•จ์ˆ˜๋Š” Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค(pop)

first() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์›Œ์ง€๋ฉด, third() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ฒ˜์Œ ๋“ค์–ด์˜จ ํ•จ์ˆ˜๊ฐ€ ์™„์ „ํžˆ ์‹คํ–‰๋˜๊ณ  ๋‚œ ํ›„ ๋‹ค์Œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™๊ธฐ์ ์ธ ๋™์ž‘ ๋ฐฉ๋ฒ•์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

์›น ํŽ˜์ด์ง€์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ

๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ ๊ต‰์žฅํžˆ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ด๊ณ ,

์‚ฌ์šฉ์ž๋Š” ๋ฐ˜์‘์ด ์—†๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ์  ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.

์ฝœ๋ฐฑ(callback), ํ”„๋กœ๋ฏธ์Šค(promise), async/await ๋“ฑ์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ์  ์ฝ”๋“œ๋ฅผ ์ œ์–ด(?)ํ•  ์ˆ˜ ์žˆ๋‹ค. (์š” ๊ฐœ๋…์€ ๋‹ค์Œ ๊ธ€์—์„œ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค!)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ(Background): ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ๊ณต๊ฐ„
  • ์ฝœ๋ฐฑ ํ(Callback Queue): ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋ณด๊ด€๋˜๋Š” ์˜์—ญ, Queue์ด๊ธฐ ๋•Œ๋ฌธ์— FIFO(First In First Out) ๋™์ž‘
    • ํƒœ์ŠคํŠธ ํ(Task Queue): setTimeout()๊ณผ ๊ฐ™์€ ํƒ€์ด๋จธ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์˜์—ญ
    • ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ(Microtask Queue): Promise์˜ then / catch ๋“ฑ์ด ๋“ค์–ด๊ฐ€๋Š” ์˜์—ญ
    • ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„(Animation Frames): requestAnimationFrame API๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋“ค์–ด๊ฐ€๋Š” ์˜์—ญ
  • ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop): ํ˜ธ์ถœ ์Šคํƒ(Call Stack)๊ณผ ์ฝœ๋ฐฑ ํ(Callback Queue)์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜์—ฌ ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์ด ๋นˆ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ์ฝœ๋ฐฑ ํ(Callback Queue)์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์Šคํƒ(Call Stack)์œผ๋กœ ๋„ฃ๋Š” ๋ฐฉ์‹

์ถœ์ฒ˜: ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ๋ฃจํ”„

์ถœ์ฒ˜
zerocho - ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ๋ฃจํ”„
tistory - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ๋™๊ธฐ(Synchronous)? ๋น„๋™๊ธฐ(Asynchronous)?
tistory - ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ - ๋™์ž‘ ์›๋ฆฌ
velog - Javascript๋Š” ๋™๊ธฐ์ผ๊นŒ? ๋น„๋™๊ธฐ์ผ๊นŒ?
velog - ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ(Single thread) vs ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ (Multi thread)
velog -JS ๋น„๋™๊ธฐ์˜ ํ•ต์‹ฌ Event Loop

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