ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

JavaScript

[JavaScript] ์“ฐ๋ ˆ๋“œ(Thread)

๊ฐœ๋ฐœ๊ฐœ๊ตด๐Ÿธ 2022. 6. 20. 20:32

์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ(Single Thread)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋งŒ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ Node.JS๊ฐ™์€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž์ฒด๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ด์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์€ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹˜!

(** ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋Š” ๋ณดํ†ต ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•Œ๋ ค์กŒ์žˆ์Œ)

 

์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๋กœ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ(Asynchronous)

๊ธฐ์กด ๋™๊ธฐ์‹ ์š”์ฒญ์€ ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ ํ•œ์ค„ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์˜ ์ž‘์—…์‹œ๊ฐ„์ด ๊ธธ์ˆ˜๋ก ์‹œ๊ฐ„ ๋ฐ ์ž์›์˜ ๋‚ญ๋น„๊ฐ€ ์‹ฌํ•ด์ง‘๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋™์‹œ์— ๋‹ค๋ฅธ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋น„๋™๊ธฐ ํ˜ธ์ถœ๋กœ ์ด๋ฅผ ๊ทน๋ณตํ•ฉ๋‹ˆ๋‹ค.

 

ex) setTimeout, ์ด๋ฒคํŠธ๋ฆฌ์Šคํ„ฐ, $.ajax()์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌ๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์š”์ฒญ์€ Web API ๊ณต๊ฐ„์œผ๋กœ ์ด๋™์‹œํ‚จ ํ›„, ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„ ๊ณผ์ •

์šฐ์„ , ๋น„๋™๊ธฐ๋ฅผ ๋™์ž‘ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 4๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

- Call Stack: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ํ•จ์ˆ˜๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์Šคํƒ์— ๋‹ด์•„ ์ฒ˜๋ฆฌ

- Web API: ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” API๋กœ AJAX๋‚˜ Timeout๋“ฑ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰

- Callback Queue(Task Queue): Web API์—์„œ ๋„˜๊ฒจ๋ฐ›์€ Callbackํ•จ์ˆ˜๋ฅผ ์ €์žฅ

- Event Loop: Call Stack์ด ๋น„์–ด์žˆ๋‹ค๋ฉด Task Queue์˜ ์ž‘์—…์„ Call Stack์œผ๋กœ ์˜ฎ๊น€

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ์˜ ๋™์ž‘๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

setTimeout(() => console.log('async A'), 1000);
console.log('B');

'async A'์ฝ”๋“œ๊ฐ€ ์œ„์— ์žˆ์Œ์—๋„, ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ผ ๋‚˜์ค‘์— ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋™์ž‘๊ณผ์ •์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด,

1. 'B'๊ฐ€ Call Stack์— ์Œ“์ด๊ณ , ์ด๋Š” ๋ฐ”๋กœ ์‹คํ–‰๋˜์–ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

2. Event Loop๋Š” Call Stack์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

3. Call Stack์ด ๋น„์–ด์žˆ๋‹ค๋ฉด, Task Queue์— ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ callback์ด Call Stack์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

์ด๋•Œ, setTimeout์˜ callbackํ•จ์ˆ˜๋Š” ๋ฐ”๋กœ Call Stack์— ์Œ“์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹คํ–‰๋˜๊ณ , Web API์—์„œ timer๊ฐ€ ์ƒ์„ฑ๋˜์–ด,

์ƒ์„ฑ๋œ ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ 1์ดˆ ํ›„์— callbackํ•จ์ˆ˜๊ฐ€ Task Queue๋กœ ์ „๋‹ฌ๋˜์–ด ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ setTiemout์ด 0์ดˆ์—ฌ๋„ B๋ณด๋‹ค ๋Šฆ๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ JS์—”์ง„์€ ํ•ด๋‹น ์ž‘์—…์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ์–ด๋– ํ•œ ์ž‘์—…์ˆ˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋„๋ก ๋™๊ธฐ ์ž‘์—…์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์„ Blockingํ•˜์ง€๋งŒ,

promise, async/await ๋“ฑ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ†ตํ•ด Non-Blocking์„ ์‹คํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

https://chanyeong.com/blog/post/44

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์™œ ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ผ๊นŒ? :: chanyeong

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ผ๋Š” ์–ธ์–ด๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์–ธ์–ด๋ผ๊ณ  ์•Œ๋ ค์ ธ์žˆ๋‹ค. ๋ณดํ†ต ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๋ผ๊ณ  ํ•˜๋ฉด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์›น ์‚ฌ์ดํŠธ

chanyeong.com

https://velog.io/@jaehyeon23/Javascript-%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9CThread

 

Javascript ์™€ ์Šค๋ ˆ๋“œ(Thread)

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

velog.io

https://medium.com/@vdongbin/javascript-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC-single-thread-event-loop-asynchronous-e47e07b24d1c

 

Javascript ๋™์ž‘์›๋ฆฌ (Single thread, Event loop, Asynchronous)

Javascript๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”๊ฐ€?

medium.com