더북(TheBook)

3.1 블로킹 소켓

 

 

디바이스에 처리 요청을 걸어 놓고 응답을 대기하는 함수를 호출할 때 스레드에서 발생하는 대기 현상을 블로킹이라고 합니다. 소켓뿐만 아니라 파일 핸들에 대한 함수를 호출했을 때도 이러한 대기 현상이 발생하는 것을 모두 블로킹이라고 합니다.

소켓이나 파일 핸들에 대한 함수를 호출한 후 블로킹이 발생하는 스레드에서는 CPU 연산을 하지 않습니다. 따라서 CPU 사용량이 0%가 됩니다. 즉, 스레드는 waitable state인 상태입니다.

스레드가 waitable 상태일 동안 파일이나 소켓의 실제 처리는 디바이스에서 합니다. 파일에 기록을 하는 함수를 호출했다면, 기록하려는 데이터가 디스크에 완전히 기록될 때까지 waitable(대기) 상태를 유지합니다.2 파일에서 읽기를 하는 함수를 호출했다면 디스크 읽기가 완전히 끝날 때까지 waitable 상태를 유지합니다. 파일 읽기 쓰기가 완전히 끝나면 waitable 상태는 다시 running 상태로 바뀌고, 함수는 리턴하며 다음 명령어를 실행합니다.

p147

▲ 그림 3-1 디바이스에 일을 시키는 함수를 호출한 후 스레드가 한동안 대기 상태가 되는 상황

 

이는 소켓도 마찬가지입니다. 스레드에서 네트워크 수신을 하는 함수를 호출하면, 수신할 수 있는 데이터가 생길 때까지 스레드는 waitable 상태, 즉 블로킹이 발생합니다. 데이터를 수신할 함수를 호출했으나, 상대방 컴퓨터에서 아무런 데이터를 보내지 않고 있다면 영원히 블로킹이 발생할 것입니다.

 

2 이해를 돕고자 이렇게 설명했을 뿐입니다. 실제로는 RAM에 기록을 마친 후 즉시 블로킹이 끝납니다. RAM에 기록된 데이터는 추후 디스크에 기록됩니다. 지금은 중요하지 않은 내용이므로 논외로 하겠습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.