블로킹 함수란?
- 이 함수로 인해서 다른 코드들이 실행하지 못하게 만드는 함수를 지칭한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div id="result"></div>
<button onclick="func();">start</button>
<script type="text/javascript">
function func() {
document.getElementById('result').innerText = test1();
document.body.style.backgroundColor = '#008299';
}
function test1() {
var num = 0;
for (var i = 0; i < 1000000000; i++) {
num++;
}
return num;
}
</script>
</body>
</html>
- 위 코드에서 test1 메소드 때문에 배경화면의 색이 변하지 않는 것을 확인할 수 있다.
비동기적이란?
- 요청한 작업에 대하여 완료 여부를 신경쓰지 않고 자신의 그 다음 작업을 수행할 수 있도록 하는 방법이다.
- 대규모 트래픽에서 안정적으로 동작할 수 있는 웹 애플리케이션을 만들 수 있다.
동기 vs 비동기
- 동기 처리에서는 응답이 다 올 때까지 기다린 후 다음 작업을 실행하지만 비동기 서버는 멀티 스레드나 멀티 프로세싱과 같은 방식으로 구현될 수 있다.
- 단 비동기 처리에서는 앞의 작업이 뒤에 영향을 주는 경우에는 문제가 될 가능성이 있다.
- 동기는 작업 순서가 잘 지켜지고, 비동기는 작업 순서가 지켜지지 않을 수도 있다.
- 비동기 방식은 작업을 하면서도 다른 작업을 하기 때문에 다른 작업이 먼저 완료가 될 수가 있다.
IOCP 서버란?
IOCP(IO Completion Port)란
- Overlapped IO에서 입출력 결과를 통지하는 하나의 방법론이다.

- 비동기 I/O 시작
- 동기 함수와 같은 역할을 하는 비동기 함수를 실행하여 윈도우 I/O에 넘긴다. 이 동작을 거친 뒤에는 프로그램의 흐름이 다시 호출한 쓰레드로 바로 돌아온다.(비동기)
- 비동기 입출력 완료
- 비동기 입출력이 윈도우 I/O에서 종료되면 IOCP라는 항구에 쌓이게 되는데 이 자료구조는 Queue 이다.
- GetQueuedCompletionStatus
- 할 일이 없는 쓰레드에서 GetQueuedCompletionStatus를 호출하면 IOCP에서 완료된 내용을 꺼내서 받을 수 있다.
논블로킹이란?
- 다른 요청의 작업을 처리하기 위해 현재 작업을 차단하지 않는 프로세스의 실행 방식이다.
- 논블로킹 방식으로 파일을 읽는 작업이 있다면 파일을 다 읽지 않아도 다른 작업을 수행할 수 있다.
논블로킹 vs 블로킹
- 한 작업을 하는 도중에 다른 작업이 들어왔을 시 기존에 하던 작업을 기다리면 블로킹, 기존에 하던 작업을 다른 작업과 동시에 진행하면 논 블로킹이다.
작업자 스레드란?
- 한번 기동하면 영원히 일을 실행하는 스레드이다.
- 기존의 클라이언트의 요청이 들어오면 일을 실행할 때마다 새로운 스레드를 만들어 사용하지만, 작업자 스레드는 요청을 반복해서 실행하고 있어 새로운 스레드를 만들 필요가 없다.
- 작업자 스레드는 용량을 제어할 수 있어 실제 프로그램이 동작하는 환경에 따라서 작업자 스레드를 조절해야 된다.
Overlapped 란?
- NonBlocking과 비동기 I/O 처리가 합쳐진 개념이다.
- Overlapped I/O는 I/O 처리를 Device Driver에 맡김으로써 해당 쓰레드가 다른일을 할 수 있도록 한다.
- Send 100 Byte를 하면 100Byte를 Send 할 때까지 완료 결과가 오지 않는다.
- 유저 영역의 버퍼를 이용하므로 소켓 버퍼에 복사하지 않으므로 한번의 복사 비용이 줄어든다.