일단 설명에 앞서, 예제 코드를 하나 보고, 실행 결과를 예상해봅시다.
console.log(1);
setTimeout(() =>
console.log("1초 뒤 2출력"), 1000);
터미널을 이용해 실행하게 된다면
1이 출력되고, 1초정도의 대기시간을 가지고 "1초 뒤 2출력"이라는 문자열이 출력됩니다.
아하... 그럼 단순히 js의 timeout 문법과 거의 동일해 보이네요.
자, 그럼 다시 2번째 예제 코드를 보고, 실행 결과를 예상해봅시다.
console.log(1);
setTimeout(() =>
console.log(2), 0);
console.log(3);
console.log(4);
console.log(5);
console.log(6);
console.log(7);
console.log(8);
console.log(9);
console.log(10);
이번에는 timeout의 대기시간을 0초로 줄였습니다. 그렇다면 대기시간이 없는 것이라고 볼 수도 있겠죠?
실행 결과는 이러합니다.
???
예상과는 달리, 1 다음에 2가 출력되지 않고 가장 마지막에 출력되었습니다.
이것이 바로 nodejs의 특징, 비동기입니다.
WHY??
다음과 같은 현상이 일어나는 이유는, nodejs는 싱글스레드를 가지고 있기 때문입니다.
스레드??
제가 사용하고 있는 인텔 i5 12세대를 보면, 2690개의 스레드가 할당되어있는 것을 확인할 수 있습니다.한 개의 스레드는 한 개의 프로세스, 즉 한 가지의 일을 할 수 있습니다.대체로 일반적으로 여러분이 사용하는 cpu는 멀티스레드를 지원합니다. 그러므로 여러분이 크롬창, vsc등등 다양한 탭을 띄워놓고 멀티태스킹이 가능한것입니다.
반면에 싱글스레드는 한번에 한 개의 프로세스만 처리가 가능합니다.
호출 스택
다음과 같이, nodejs에는 호출 스택이라는 것이 존재합니다. nodejs는 싱글스레드이므로, 한 번에 한 가지 일만 처리합니다. 따라서 timeout 함수를 사용한 2번째 줄을 WEB APIs라는 곳에 콜백해 가둬두고, 설정한 시간인 0초가 지난 후 콜백 큐에 할당합니다. 그리고 나머지 console.log 함수들을 마저 실행합니다.
그리고 마침내 콜 스택이 비어있을 때, 이벤트 루프를 통해 갇혀있던 2번째 줄 코드가 콜 스택에 할당되고, 비로소 2를 출력하게 됩니다.
결론
생각보다 복잡한 과정을 통해 nodejs는 코드를 실행합니다.
싱글스레드의 문제를 해결하기 호출 스택을 이용하는 것이 꽤나 신기합니다.
'TeamLog > 과제' 카테고리의 다른 글
ip주소란? (0) | 2023.09.03 |
---|---|
[NodeJs] REST API (0) | 2023.06.25 |
[js] 이벤트와 이벤트 핸들러 (0) | 2023.06.11 |
C언어와 js의 차이 (0) | 2023.06.05 |
[JS] 리터럴, 식별자, 키워드 (0) | 2023.05.21 |