Single Thread - ์ฝ”๋“œ์ข…๐Ÿ””๋‹˜:)

๊น€๋ฏผ์žฌยท2021๋…„ 8์›” 15์ผ
0

TIL, Core JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
3/11
post-thumbnail

*๐Ÿ”Study Keyword :

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๐Ÿ”‘single thread์˜ ํŠน์ง•์„ ๐Ÿ”‘setTimeout ํ•จ์ˆ˜์˜ ์‹คํ–‰๊ณผ์ •์„ ํ†ตํ•ด ์‚ดํŽด๋ณด์ž์ด์ž์ด์ž์‹์•„!

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๐Ÿ”‘setTimeout ํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•œ ์‹œ๊ฐ„์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

=> ์ด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ ๐Ÿ”‘single thread์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค.
=> ๐Ÿ”‘single thread์˜ ํŠน์ง•์„ ์ดํ•ดํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ์‹œ์ž‘์ ์ด ๋˜๋‹ˆ ์ž˜ ์•Œ์•„๋‘์ž!

<script>
function yo(){  
  setTimeout(function(){
    console.log('1.5์ดˆ ํƒ€์ด๋จธ ๋!')
  }, 1500);
  for(let i=0;i<3;i++){
    doSomething(); // 1์ดˆ ์ •๋„ ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ผ ๊ฐ€์ •
    console.log(i) 
  }
  console.log('3์ดˆ ๊ฑธ๋ฆฌ๋Š” for๋ฌธ ๋!')
}
yo();
console.log('main ๋!')
</script>
  • ์šฐ์„  ๋‹ค์Œ ํ•จ์ˆ˜์˜ ์˜ˆ์ƒ๋˜๋Š” ๊ณผ์ •์„ ์ ์–ด๋ณด์ž.
  1. ํ•จ์ˆ˜ yo๋ผ๋Š” function ์žˆ์–ด ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  2. ํ•จ์ˆ˜ yo๋Š” 1.5์ดˆ ๋’ค์— ์ฝ˜์†” ๋กœ๊ทธ '1.5 ์ดˆ ํƒ€์ด๋จธ ๋!'์„ ์ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ํƒ€์ด๋จธ๋ฅผ ๊ฑธ์–ด๋‘์—ˆ๋‹ค.
  3. setTimeout๋ฅผ ํ˜ธ์ถœ์„ ๋๋‚ด๋ฉด for๋ฌธ์„ 3๋ฒˆ ๋„๋Š”๋ฐdoSomething(1์ดˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š”) ์ž„์˜์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์ฝ˜์†”๋กœ๊ทธ์— ๋ช‡ ๋ฒˆ์งธ ์ผ ๋Œ์•˜๋Š”์ง€ i๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ณผ์ •์„ 3๋ฒˆ์„ ๋Œ๊ธฐ ์œ„ํ•ด์„  ์ด 3์ดˆ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  4. ์ดํ›„ ๋ชจ๋“  for๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด ์ฝ˜์†”์— '3์ดˆ
    ๊ฑธ๋ฆฌ๋Š” for๋ฌธ์„ ๋๋‚ฌ๋‹ค!'๋ผ๋Š” ๋กœ๊ณ ๋ฅผ ์ฐ๋Š”๋‹ค.
  5. yoํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ชจ๋‘ ๋งˆ์น˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ '๋ฉ”์ธ ๋'์ด๋ผ๊ณ  ์ฝ˜์†”์„ ์ฐ๋Š”๋‹ค.
  • Q. yo ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ ๋ช‡ ์ดˆ ๋’ค์—
    ํƒ€์ด๋จธ ํ•จ์ˆ˜์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ฝ˜์†” ๋‚ด์šฉ์ธ '1.5 ์ดˆ ํƒ€์ด๋จธ ๋!'์ด ์ฐํž๊นŒ๐Ÿคทโ€?โ™‚๏ธ
  • A. 1.5์ดˆ๋ผ๊ณ  ์ƒ๊ฐ ํ•  ์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ ๐Ÿ™…โ€โ™€๏ธ
    ์ •๋‹ต์€ ์•ฝ 3์ดˆ ๋’ค์— ์‹คํ–‰์ด ๋œ๋‹ค.๐Ÿ™†โ€
  • ๊ทธ ์ด์œ ๋Š” ๐Ÿ”‘single thread์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Queue์—์„œ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด
    ๐Ÿ”‘single thread์— ํ•ด๋‹นํ•˜๋Š” ํ•˜๋‚˜์˜ Call Stack์—์„œ ํ•˜๋‚˜์”ฉ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ • ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.

-WHAT ISโ“

Queue

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—” Queue๊ฐ€ ์žˆ๋Š”๋ฐ ์ผ์ข…์˜ ํ•  ์ผ๋“ค์„ ๋ชจ์•„ ๋†“์€ ๊ฒƒ์ด๋‹ค.
    EX> Queue์—” main ํ•จ์ˆ˜, ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญ ์‹œ ํด๋ฆญ์— ํ•ด๋‹น๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์Œ“์ธ๋‹ค.

Event Loop & Call Stack

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„, Event Loop๊ฐ€ ์ด Queue๋ฅผ ๊ณ„์† ํ™•์ธํ•˜์—ฌ ์ด ์•ˆ์—์„œ ํ•˜๋‚˜์”ฉ ์ฝ”๋“œ๋ฅผ ๊บผ๋‚ด Call Stack์œผ๋กœ ๋ณด๋‚ด ์‹คํ–‰์„ ์‹œํ‚จ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ Call Stack์€ Queue์— ๋“ค์–ด์žˆ๋Š” ํ•จ์ˆ˜(์ฝ”๋“œ)๋ฅผ ๊บผ๋‚ด์–ด Call Stack์œผ๋กœ ๋ณด๋‚ด ์‹คํ–‰์‹œํ‚จ๋‹ค.**
  • ์ดํ›„ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด ํ•จ์ˆ˜๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋‹ค์‹œ ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ Queue์—์„œ ๊บผ๋‚ด์„œ Call Stack์œผ๋กœ ๋ณด๋‚ด ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    EX> Call Stack ๋ณด๋‚ธ 1> click์—์„œ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด click ์œ„์— 2>ํ•จ์ˆ˜๊ฐ€ ์Œ“์ด๊ณ  ๊ทธ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ฝ˜์†”๋กœ๊ทธ ์ฐ์œผ๋ฉด ํ•จ์ˆ˜ ๋ฐ”๋กœ ์œ„์— 3>์ฝ˜์†”๋กœ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์Œ“์ธ๋‹ค.
    ์ดํ›„ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๊ฐ€์žฅ ์ƒ๋‹จ์˜ 3>์ฝ˜์†”๋กœ๊ทธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฆฌํ„ดํ•œ ๋’ค ๋น ์ง€๊ฒŒ๋˜๊ณ  2>ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์„œ ๋น ์ง„ ๋’ค 1>click ๋ฆฌํ„ดํ•œ ๋’ค ๋น ์ง€๊ฒŒ ๋˜๋ฉด ๋น„์–ด์žˆ๋Š” Call Stack์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
  • ์ดํ›„ Event Loop๋Š” Queue์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ๋•Œ๊นŒ์ง€ ๊ณ„์† ํ™•์ธ์„ ํ•œ๋‹ค.

  • ์ด์ œ ๋‹ค์Œ์˜ ๐Ÿ”‘single thread์ด๋ฏ€๋กœ ๋ฐœ์ƒํ•˜๋Š” ์‹ค์ œ ์ฝ”๋“œ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.
<script>
//1. main ํ•จ์ˆ˜๋Š” queue์—์„œ call stack์œผ๋กœ ์ด๋™
function yo(){ //2. yo ํ•จ์ˆ˜๋Š” main ํ•จ์ˆ˜ ์ƒ๋‹จ์œผ๋กœ ์˜ฌ๋ผ๊ฐ (call stack)
  setTimoust(function(){ // 3. setTiemout ํ•จ์ˆ˜: ์™ธ๋ถ€ ๋Œ€๊ธฐํ•จ
    console.log('1.5์ดˆ ํƒ€์ด๋จธ ๋!')
  }, 1500);
  for(let i=0;i<3;i++){ // 4, 5. doSomething ํ˜ธ์ถœ๊ณผ ์ฝ˜์†” ๋กœ๊ทธ ๋ฐ˜๋ณต
   /** 
   4. for๋ฌธ ๋‚ด๋ถ€ doSomething () ํ•จ์ˆ˜๋Š”
   yoํ•จ์ˆ˜ ์ƒ๋‹จ์œผ๋กœ ์ด๋™(call stack)
    doSomething();
   5. console.log(i) ํ•จ์ˆ˜๋Š” doSomething ๋ฆฌํ„ด๋˜๋ฉด yo ํ•จ์ˆ˜ ์ƒ๋‹จ์œผ๋กœ ์ด๋™(call stack)
   ** //
    console.log(i) 
  }
  console.log('3์ดˆ ๊ฑธ๋ฆฌ๋Š” for๋ฌธ ๋!')
}
yo();
console.log('main ๋!')
</script>
    1. ๊ฐ€์žฅ ๋จผ์ € 1>Queue์— main ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  main ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์„ ์œ„ํ•ด ์Œ“์•„๋‘๋Š” 2>Call Stack์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค.
    1. main ํ•จ์ˆ˜์—์„œ ์‹คํ–‰๋œ yo ํ•จ์ˆ˜๊ฐ€ main ํ•จ์ˆ˜ ์ƒ๋‹จ์œผ๋กœ 2>call stack์— ์˜ฌ๋ผ๊ฐ„๋‹ค.
    1. setTiemout ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€, (ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด์ธ Web API) ์ฆ‰ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์žˆ๋Š” ํ•จ์ˆ˜๋กœ ์™ธ๋ถ€ ํ•จ์ˆ˜ setTiemout์—๊ฒŒ function์„ ๋„˜๊ฒจ์ฃผ๋ฉด์„œ 1.5 ์ดˆ๋’ค์— ์ฝ˜์†”์„ ์‹คํ–‰ํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค€๋‹ค.
    1. for ๋ฌธ์„ ๋Œ๋ฉฐ doSomething() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด 1์ดˆ๊ฐ€ ์ง€๋‚˜๊ฐ€๊ณ  ์ดํ›„ ์ฝ˜์†”๋กœ๊ทธ์— i๋ฅผ ์ฐ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
    1. 2>call stack์—์„œ ์ผํ•˜๋Š” ๋™์•ˆ(๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰) 1.5์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ๋•Œ setTiemout ํ•จ์ˆ˜๋ฅผ Queue์— ๋„ฃ๊ณ  ์ดํ›„ setTiemout ํ•จ์ˆ˜๋Š” Call Stack์ด ์‹คํ–‰์„ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ์ƒํƒœ์— ๋จธ๋ฌธ๋‹ค.
    1. for ๋ฌธ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ(// 3์ดˆ ๊ฒฝ๊ณผ ํ›„)๊ณผ ํšŸ์ˆ˜๋ฅผ ๋‹ด์€ ์ฝ˜์†”์ด ๋ชจ๋‘ ์ฐํžˆ๋Š” ๋ฆฌํ„ด์„ ๋ฐ˜๋ณตํ•œ ๋’ค(// 0,1,2) Call Stack ์ƒ๋‹จ์—์„œ ๋น ์ ธ for ๋ฌธ์„ ๋น ์ ธ๋‚˜์˜ค๋ฉด ('3์ดˆ ๊ฑธ๋ฆฌ๋Š” for๋ฌธ ๋!) ๋กœ๊ทธ๊ฐ€ ์‹คํ–‰๋œ ๋’ค ๋ฆฌํ„ด๋˜๋ฉฐ Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
    1. ์ดํ›„ Call Stack์— ๋‚จ์•„์žˆ๋Š” ๋งˆ์ง€๋ง‰ main ํ•จ์ˆ˜์—์„œ('main ๋!') ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๋ฉด์„œ main ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ Call Stack์ด ๋นˆ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
    1. ์ด์ œ์„œ์•ผ Queue์— ์žˆ๋˜ setTiemout ํ•จ์ˆ˜๋ฅผ Call Stack์œผ๋กœ ์˜ฎ๊ฒจ ์‹คํ–‰ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰์œผ๋กœ ('1.5์ดˆ ํƒ€์ด๋จธ ๋!')๋กœ๊ทธ๋ฅผ ์ฐ์€ ๋’ค ๋ฆฌํ„ด๋˜๋ฉฐ Call Stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.

*๐Ÿ’กconclusion

  • Call Stack์€ ํ•˜๋‚˜์ด๊ธฐ์— ํ•˜๋˜ ์ผ์„ ๋ฉˆ์ถ”์ง€ ๋ชปํ•œ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ด๋จธ ํ•จ์ˆ˜๋Š” Call Stack์ด ์‹คํ–‰(์ผํ•˜๋Š”)๋˜๋Š” ๋™์•ˆ ์ง€์ • ๋”œ๋ ˆ์ด ์‹œ๊ฐ„ ๋’ค์— Queue์— ํƒ€์ด๋จธ๋กœ ๋„˜๊ฒจ์ค„ ํ•จ์ˆ˜๋ฅผ ๋„ฃ.์–ด.์ค„.๋ฟ.์ด.๋‹ค.
    -Call Stack์ด ํ•˜๋˜ ์ผ์„ ๋ชจ๋‘ ๋งˆ์ณ(์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ) Call Stack ๋‚ด๋ถ€๊ฐ€ ๋น„์–ด์ ธ์žˆ์–ด์•ผ Queue์— ๋Œ€๊ธฐํ•˜๋˜ ํƒ€์ด๋จธ๊ฐ€ Call Stack์œผ๋กœ ์˜ฌ๋ผ๊ฐ€ ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ๋‹ค

#๐Ÿ“‘Study Source

  1. ์ฝ”๋“œ์ข…๋‹˜ - https://www.youtube.com/watch?v=iNH4UQxZexs
profile
์ž๊ธฐ ์‹ ๋ขฐ์˜ ํž˜์„ ๋ฏฟ๊ณ  ์‹ค์ฒœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

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