티스토리 뷰
#3 Non-blocking I/O, Event Loop, Event-driven with chatGPT
RadderNepa 2023. 3. 27. 05:44- 이전 강의에서 Event Loop, Non-blocking I/O 등에 대해 짧게 얘기만 해줘서 내가 직접 구글링과 chatGPT를 이용해 검색했다.
- 메인을 chatGPT, 보조 수단으로 구글링을 사용했다.
- 1년전만 해도 이런 일은 상상도 할 수 없었다. 물론 라스베거스에서도 상상할 수도 없었다.
1. Non-blocking I/O
- Node.js의 비동기 I/O(= Non-Blocking I/O)모델은 Node.js의 핵심 개념 중 하나이다.
- Node.js의 Non-Blocking I/O 모델은 높은 처리량과 낮은 지연 시간을 동시에 달성할 수 있게 해주는 핵심이다.
- Non-Blocking I/O 모델은 Node.js가 I/O 작업을 비동기적으로 처리하면서 동시에 다른 작업을 처리할 수 있게 한다.
- 해당 모델을 통해 높은 성능을 가진 서버 애플리케이션을 개발할 수 있다.
- Node.js의 Non-Blocking I/O 모델은 아래와 같은 특징이 있다.
1). Event-driven
- Node.js는 Event-driven 기반으로 동작한다.
- Event가 발생하면 Node.js는 Event를 처리하기 위한 callback function을 실행한다.
- Event-driven 모델을 사용하면 Node.js는 비동기적으로 I/O 작업을 처리하면서도 다른 작업을 동시에 처리할 수 있다.
2). 비동기 I/O
- Node.js의 I/O 작업은 비동기적으로 처리된다.
- 이는 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있게 한다.
- Non-Blocking I/O을 사용하면 여러 클라이언트의 요청을 동시에 처리할 수 있으므로 높은 처리량(high-throughput)과 낮은 지연 시간(low-latency)을 동시에 달성할 수 있다.
3). callback function
- Node.js에서는 callback function을 사용하여 비동기적으로 I/O 작업의 결과를 처리한다.
- callback function은 I/O 작업이 완료된 후에 실행되며 결과를 처리하거나 다음 작업을 실행하는 등의 동작을 수행한다.
4). Event loop
- Node.js의 Non-Blocking I/O 모델은 Event loop를 기반으로 동작한다.
- Event loop는 Node.js의 Event-driven 모델에서 Event를 처리하면서 Non-Blocking I/O을 처리하는 핵심 메커니즘이다.
2. Event Loop
- Node.js의 event loop는 Node.js의 비동기(non-blocking) I/O 작업을 처리하는 핵심 메커니즘이다.
- event loop는 Node.js의 런타임 환경에 내장된 요소로서 Node.js가 event-driven 및 non-blocking I/O 모델을 구현하는 데 사용된다.
- Node.js의 event loop는 아래와 같은 단계로 구성된다.
1. event loop는 Node.js의 내부 Queue(FIFO = First In First Out)에서 event를 가져온다.
2. 가져온 event가 있다면 해당 event를 처리하기 위한 callback function을 실행한다.
3. 실행된 callback function이 비동기 I/O 작업을 수행하는 경우 event loop는 해당 작업이 완료될 때까지 기다리지 않고 다음 event를 처리하기 위해 다시 내부 Queue로 돌아간다.
4. 비동기 I/O 작업이 완료되면 event loop는 해당 작업에 대한 callback function을 실행한다.
5. 실행된 callback function이 내부 Queue에 다시 event를 추가하는 경우 event loop는 해당 event를 처리하기 위해 내부 Queue로 돌아간다.
6. event loop는 위의 과정을 반복하면서 Node.js의 비동기 I/O 작업을 처리한다.
- 이러한 Event loop는 무한 루프로 동작하며 Node.js 애플리케이션의 생명주기 동안 계속 실행된다.
3. Event-driven
- Node.js는 Event-driven(Event 기반) 아키텍처를 사용한다.
- Event-driven 모델은 외부 요소(파일 시스템, 네트워크, 타이머 등)에서 Event가 발생하면 미리 등록된 Callback function을 실행하여 Event를 처리하는 방식이다.
- Event가 발생할 때마다 Node.js는 해당 Event를 처리하기 위해 등록된 Callback function을 호출하고 다음 Event를 대기한다.
- 이러한 Event-driven 모델을 통해 Node.js는 다른 요청이 처리되는 동안 블로킹되지 않고 Event를 처리할 수 있다.
- 그렇기에 높은 처리량(high-throughput)과 낮은 지연 시간(low-latency)을 동시에 달성할 수 있다.
- 즉, Event-driven 모델은 Node.js가 효율적으로 다수의 동시 요청을 처리할 수 있도록 하며 이러한 특징은 많은 양의 I/O 작업을 다루는 서버 애플리케이션에서 특히 유용하다.
- Node.js의 Event-driven 모델은 또한 Event 간의 상호 작용을 허용한다.
- Event 간의 상호 작용은 Node.js의 다른 부분에서 Event를 발생시키는 경우 모든 Event가 상호 작용하여 높은 수준의 유연성과 확장성을 제공한다.
ex) 파일을 읽을 때 파일 읽기가 완료되면 다른 Event를 실행
- 즉, 파일 읽기 완료와 같은 Event가 발생했을 때 해당 Event와 관련된 다른 Event들이 함께 상호 작용할 수 있다는 것을 의미한다.
- 즉, Event 간의 상호 작용을 위해 다른 Event들이 함께 동작하는 부분을 뜻한다.
- 단, Event-driven 모델은 콜백 지옥(Callback Hell)과 같은 문제를 발생시킬 수 있다.
- 이를 해결하기 위해 Node.js는 Promise, async/await과 같은 비동기 패턴을 지원한다.
4. 위의 3가지 개념을 종합해서 정리해 달라고 물어봤다.
- Node.js의 Event-driven, Non-Blocking I/O, Event loop는 높은 처리량과 낮은 지연 시간을 동시에 달성할 수 있는 기능을 제공한다.
- 이를 통해 높은 성능을 가진 서버 애플리케이션을 개발할 수 있다.
- Node.js는 Event-driven 및 비동기 I/O(Non-Blocking I/O) 모델을 사용하며 이는 Event loop를 기반으로 동작한다.
Event-driven
- Event-driven 모델은 Event가 발생하면 미리 등록된 Callback function을 실행하여 Event를 처리한다.
- Event는 파일 시스템, 네트워크, 타이머 등의 외부 요소로부터 발생할 수 있다.
- Event-driven 모델을 사용하면 Node.js는 다른 요청이 처리되는 동안 블로킹되지 않고 Event를 처리할 수 있으므로 높은 처리량(high-throughput)과 낮은 지연 시간(low-latency)을 동시에 달성할 수 있다.
Non-Blocking I/O
- 비동기 I/O(Non-Blocking I/O)는 I/O 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있게 해준다.
- 이는 I/O 작업이 느리고 대기 시간이 길 경우 Blocking 되는 것을 방지할 수 있으며 다수의 클라이언트 요청을 처리할 수 있도록 해준다.
Event loop
- Event loop는 Node.js의 비동기 I/O(Non-Blocking I/O)를 구현하는 핵심 메커니즘이다.
- Event loop는 Event queue에서 Event를 가져와 처리하고 비동기 I/O 작업이 완료되면 Callback function을 실행한다.
- Event loop는 무한 루프로 동작하며 Node.js 애플리케이션의 생명주기 동안 계속 실행된다.
5. Non-blocking I/O = 비동기?
- 우연히 chatGPT 한테 물어봤는데 아래와 같은 답변이 나왔다.
- non-blocking과 비동기(async)는 서로 다른 개념이다.
- non-blocking은 어떤 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있는 것을 의미한다.
ex)
- 파일을 읽는 동안 다른 작업을 처리할 수 있도록 비동기적인 방식으로 파일을 읽는 것이 non-blocking 이라고 할 수 있다.
- 반면, 비동기(async)는 어떤 작업이 완료될 때까지 기다리지 않고 다른 작업을 처리할 수 있는 것 뿐만 아니라 작업의 완료 여부를 callback function을 통해 알려줌으로써 비동기적인 처리가 가능한 것을 의미한다.
- 즉, 비동기적인 작업은 non-blocking 방식으로 동작할 수 있지만 non-blocking 방식이 비동기적인 방식이라고 할 수는 없는 것이다.
- Yes
- non-blocking은 작업이 완료될 때까지 기다리지 않고 다음 작업을 진행할 수 있도록 하는 방식을 의미한다.
- 따라서 작업의 완료 여부를 알기 위해서는 다른 방법이 필요하며 이 때문에 event-driven 모델이 필요한 것이다.
- event-driven 모델은 외부 요소(파일 시스템, 네트워크, 타이머 등)에서 event가 발생하면 미리 등록된 Callback function을 실행하여 event를 처리하는 방식으로 작동한다.
- event가 발생할 때마다 노드는 해당 event를 처리하기 위해 등록된 Callback function을 호출하고 다음 event를 대기시킨다.
- 즉, event-driven 모델을 사용하면 non-blocking 작업이 완료되었을 때 해당 작업에 대한 Callback function이 실행되어 완료 여부를 알리며 event 간의 상호작용을 통해 다른 작업을 동시에 처리할 수 있다.
- non-blocking과 event-driven 모델을 함께 사용할 때 Node가 높은 처리량과 낮은 지연 시간을 달성할 수 있다.
- 아래의 감사한 글들을 참고해 작성했다.
https://www.korecmblog.com/node-js-event-loop/
Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기
글에 들어가기에 앞서 Node.js의 이벤트 루프의 경우 공식 문서에 설명이 부족하고 이에 따라 여러 사람들이 각자 나름대로 분석한 글이 많아 무엇이 이벤트 루프의 정확한 동작인지 알기 힘듭니
www.korecmblog.com
https://etloveguitar.tistory.com/140
blocking I/O, non-blocking I/O에 대하여 (sync, async와의 차이)
Blocking I/O / Non Blocking I/O, synchronous / asynchronous 는 개발을 하다보면 자주 접하게 되는 용어다. 특히 파이썬, NodeJS와 같이 싱글스레드로 동작하는 언어에서는 성능을 위해 필수적으로 알아두어야
etloveguitar.tistory.com
- chatGPT... 참 무서우면서 편하다. chatGPT는 스카이넷이 되고 싶을 때 아래 글을 참고하도록
https://ko.wikipedia.org/wiki/%EB%9F%AC%EB%8B%A4%EC%9D%B4%ED%8A%B8_%EC%9A%B4%EB%8F%99
러다이트 운동 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 러다이트 운동(Luddite)은 19세기 초반 영국에서 있었던 사회 운동으로 섬유 기계를 파괴한 급진파부터 시작되어 1811년에서 1816년까지 계속된 지역적 폭동으로 절
ko.wikipedia.org
'흥미 > Node.js+MongoDB' 카테고리의 다른 글
#5 GET 요청 (0) | 2023.04.03 |
---|---|
#4 Node.js, Express 라이브러리 설치 (0) | 2023.03.30 |
#2 Non-blocking I/O (0) | 2023.03.22 |
#1 서버? Node.js? (0) | 2023.03.21 |
#0 왜 하는가 (0) | 2023.03.21 |
- Total
- Today
- Yesterday
- MySQL
- 코딩테스트
- Phaser3
- git
- Stream
- OS
- 운영체제
- 알고리즘
- Phaser
- 프로그래머스
- 메모리
- nosql
- java
- jpa
- db
- SpringBoot
- 자료구조
- DART
- Advanced Stream
- API
- 빅데이터 분석기사
- 빅데이터
- Spring Boot
- spring
- MongoDB
- 프로세스
- Java8
- SQL
- node.js
- 코테
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |