Día de Ruru
[JS]동기와 비동기, 스레드와 프로세스 본문
1. 동기와 비동기 코드 실행 방식
동기는 순차적으로 프로그램이 진행되며 이전 요청이 처리되는 동안 다음 요청을 처리하지 못하며 요청이 완료되어야만 다음 처리가 가능한 방식입니다. 비동기는 하나의 요청 처리가 완료되기 전에 제어권을 다음 요청으로 넘깁니다. 비동기로 처리되는 요청은 메인스레드가 아닌 브라우저(Web API)에서 실행이되며 값을 반환할 준비를 마친 상태에서 콜백큐에서 대기상태가 됩니다. 비동기 처리 함수는 promise, setTimeout 등이 있습니다. async/await를 사용해서 비동기 함수를 동기식으로 작동하게 할 수 있습니다.
동기방식으로 프로그램이 실행되면 IO처리를 Blocking하는데 이 문제를 스레드로 처리하게 됩니다. 비동기 방식에서는 IO처리가 Blocking 되지 않으며 다음 요청을 처리할 수 있습니다.그렇기 때문에 Node.js에서는 비동기 IO를 지원하며 요청을 처리하면서 다음 요청을 받을 수 있습니다. 이를 싱글스레드 논블로킹 모델이라고 합니다.
2. 스레드와 프로세스
프로세스: 메모리에 올라와 실행되고 있는 프로그램의 인스턴스. 실행되고 있는 프로그램(독립적인 개체)
스레드: 프로세스 내에서 할당받은 실행의 단위. 스레드는 프로세스 당 CPU의 코어 개수만큼 생성될 수 있습니다. 스레드는 프로세스 내의 메모리 공간을 공유하지만, 각각의 프로세스는 별도의 메모리 공간을 갖습니다.
프로세스는 각각 독립된 메모리 영역을 할당받으며 각각 코드영역, 데이터영역, 스택영역, 힙 영역이 있습니다.
코드 영역에는 작성된 프로그램이 저장되며 데이터 영역에는 코드가 실행되면서 사용한 환경이나 파일들의 각종 데이터, 전역변수가 저장됩니다. 스택 영역에는 호출한 함수가 종료되면 되돌아올 메모리의 주소나 지역변수 들이 저장됩니다. 스택 영역은 함수가 호출되면 할당되며 호출이 완료되면 소멸됩니다. (스택영역이 초과되면 스택오버플로우 에러가 나타납니다.) 힙 영역은 동적으로 할당되는 데이터를 위해 존재합니다. 코드영역과 데이터 영역은 프로그램이 실행되면 크기가 정해지는 정적 영역이며 스택영역과 힙영역은 동적으로 크기가 줄어들었다 늘어났다합니다.
각 프로세스는 별도의 주소 공간에서 실행되며 기본적으로 다른 프로세스의 자원에 접근할 수 없습니다.
스레드는 프로세스 내에서 각 필요한 스택만 할당받고 코드영역, 데이터영역, 힙영역은 서로 공유합니다.하나의 프로세스는 최소 하나의 스레드를 갖습니다.
싱글스레드는 프로세스 내에서 하나의 스레드가 하나의 요청만을 수행하는 것입니다. 멀티스레드는 스레드 풀에서 실행의 요청만큼 스레드를 매칭하여 작업을 수행합니다. 스레드 풀에 스레드가 늘어날수록 CPU 비용을 소모하기 때문에 효율성이 떨어집니다.
Node.js는 클러스터링을 통해 프로세스를 포크하여 멀티스레드처럼 사용될 수 있습니다. 트레픽에 따라서 프로세스를 포크할 수 있어서 서버의 확장성이 용이하다는 장점이 있습니다.
'JS' 카테고리의 다른 글
[JS] 자료구조와 알고리즘, 데이터베이스와 ORM (0) | 2023.06.05 |
---|---|
[JS]HTTP와 HTTPS, RESTful API (0) | 2023.06.01 |
[JS]이벤트 루프와 콜백함수 (0) | 2023.05.30 |
기술 면접 준비 Day 04 (0) | 2023.05.24 |
기술 면접 준비 Day 03 (0) | 2023.05.23 |