논블록킹 I/O, 이벤트 루프 기반의 비동기 I/O
노드의 I/O는 모두 논블록킹 I/O이다. 이로인해 노드는 상당히 빠른 성능을 보여준다.
노드의 I/O는 이벤트 루프를 기반으로 비동기로 실행된다. 따라서 I/O의 결과를 콜백 함수의 파라미터로 전달 받는다.
예제
var server = require('http');
server.createServer();
server.on('request', function(req, res){});
server.listen(3000, 'localhost');
console.log('서버가 시작되었습니다.');
설명
- server.on('request')에서 request 이벤트에 콜백 함수 등록
- request 이벤트가 발생하면 이벤트 루프가 감지하여 콜백 함수를 실행
싱글 스레드
코드를 실행하는 스레드가 오직 하나뿐이기 때문에 동시성에 대한 고민을 할 필요가 없다. 싱글 스레드는 개발자가 작성한 코드만 동기로 실행하고 그 외 모든 I/O는 비동기로 실행한다. 비동기로 실행한 I/O가 완료됐다는 이벤트가 발생해도 현재 스택에 존재하는 이벤트를 먼저 처리한 후에 다음 이벤트를 처리한다.
참고로 사용자의 코드를 처리하는 스레드는 하나이지만 내부적으로는 여러개의 스레드가 존재할 수 있다. 예를 들어 사용자의 코드를 처리하는 동안에도 I/O 작업은 병렬적으로 처리될 수 있다. 이런 작업은 노드 내부에서 처리되므로 개발자는 싱글 스레드만 신경쓰면 된다.
단점
- 현재 스레드가 처리 중인 작업이 CPU 처리량이 많아 오래 걸리면 다른 이벤트가 처리되지 않는다.
- 스케일업(CPU, 메모리 향상)으로 성능이 크게 향상되지 않는다. CPU의 속도가 빨라진다면 노드도 빨라지겠지만 싱글 스레드를 사용하는 노드는 CPU 개수나 메모리 용량에는 큰 영향을 받지 않는다. 이 문제는 노드 인스턴스를 여러 개 실행해 인스턴스 간의 메시지 통신을 통해 해결할 수 있다.
'Node.js' 카테고리의 다른 글
[node.js] HTTP Digest 인증 (0) | 2015.05.09 |
---|---|
[node.js] 이벤트 (0) | 2015.05.05 |
[node.js] HTTP 동시 접속 성능 테스트 (0) | 2015.05.05 |
[node.js] require() 그리고 module.exports (0) | 2015.05.05 |
[node.js] 시작하기 (0) | 2015.04.20 |