- JS는 싱글 스레드에서 작동하며, 한 번에 하나의 작업만 동기 방식으로 처리할 수 있다.
- 'process' 란 프로그램을 구동해 프로그램의 상태가 메모리상에서 실행되는 작업 단위를 의미하며, 소프트웨어의 복잡성으로 하나의 프로그램에서 동시에 여러개의 복잡한 작업을 수행하기 위해 탄생한 더 작은 실행 단위가 'thread'
- 하나의 'process' 에서 여러개의 'thread'를 만들 수 있고, 'thread' 끼리는 메모리를 공유할 수 있어 여러가지 작업을 동시에 수행할 수 있으며, 'process' 내부에서 여러개의 'thread' 를 활용하면서 동시 다발적인 작업을 처리할 수 있게 됨.
- 'thread' 는 하나의 'process'에 동시에 접근 가능하며, 동시에 여러 작업 수행 시 같은 자원에 대해 다발적인 수정하는 등 동시성 문제가 발생할 수 있어 이에 대한 처리가 필요. 하나의 'thread'에 문제가 생기면 같은 자우너을 공유하는 다른 'thread'에도 문제가 발생할 있다.
- 초기의 JS는 multi thread에 대한 개념이 대중화 되어 있지 않았으며 브라우저에 간단한 script를 지원하기 위해 1995년경 첫선을 보였다. (2002년에 출시된 펜티엄4가 최초로 동시 멀티스레딩을 구현한 데스크톰)
- c, java, c+, 등 메이저 프로그래밍 언어에서는 실행중인 thread를 멈추고 다른 thread코드를 먼저 실행할 수 있지만 JS에서는 Node.js에서 추가된 Woker나 브라우저에서 제공하는 WebWorker를 활용하면 동시에 여러 작업을 처리할 수 있다.
- Run-to-completion 의 특징에 따라 하나의 코드가 오래 걸리면 뒤이은 코드가 실행되지 않으며, 이는 JS 개발자에게 동시성을 고민하지 않게 한다는 장점이 있지만 반대로 웹 페이지에서는 큰 단점으로 작용해 사용자가 웹 페이지가 멈춰 있다는 느낌을 줄 수 있다. 즉, JS 의 모든 코드는 '동기식'으로 한번에 하나씩 순차적으로 처리 됨.
- JS 에서 비동기 함수를 선언할 때 쓰는 async (asynchronous) 는 동시에 일어나지 않는다는 것을 의미함.
console.log(1)
setTimeout(()=> {
console.log(2)
}, 0)
setTimeout(()=> {
console.log(3)
}, 100)
console.log(4)
/* 동기적으로 작동하는 상황에서의
예상 출력 값: 1, 2, (0.1s 후) 3, 4
실제 출력 값 : 1, 4, 2, 3
*/
- 위의 상황을 이해하기 위해 이벤트 루프에 대한 개념이 필요하다.
| (3) 이벤트 루프와 비동기 작업 (0) | 2024.09.20 |
|---|---|
| (2) 이벤트 루프 (0) | 2024.09.19 |
| 클로저 비용 (0) | 2024.09.19 |
| 함수 레벨 스코프와 블록 레벨 스코프의 비교와 클로저 (0) | 2024.09.19 |
| 클로저 (0) | 2024.04.22 |