IOCP & Overlapped I/O (2) : Blocking 대 Non-blocking, 동기 입출력 대 비동기 입출력 , 비동기 통지


blocking / non-blocking



Blocking socket mode


소켓 함수 호출 시, 조건이 만족되지 않으면 
함수가 return하지 않고 스레드 실행이 그 위치에서 정지한다.

조건이 만족될 때,
socket 함수가 return하며 정지 상태의 스레드가 깨어난다.(wake-up)
그리고 작업을 재개한다.

조건이 만족되는 시점이 길어지면
교착 상태로 인해 스레드가 오랜 시간 정지할 수 있다.

다른 스레드가 있다면 TerminateThread() 함수를 호출해 강제 종료시키거나
주 스레드가 종료되어 모든 스레드가 종료되기를 바래야한다.



Non-blocking socket mode

소켓 함수 호출시, 조건이 만족되지 않아도
일단 함수가 return한다.

(이 때, 조건이 만족되지 않았다는 오류를 리턴한다.)


때문에 중단 없이 다음 코드를 계속 수행한다.

멀티스레드를 사용하지 않고도
싱글스레드로 여러 소켓을 번갈아가며 입출력 처리를 할 수 있으며
중간에 다른 작업을 수행할 수 있다.

그러나 위에서 말한 '조건이 만족되지 않았다는 오류'를 처리해야한다.

클라이언트가 없어도 계속 cpu자원을 소모하여
함수 return 로직을 수행하기 때문에
blocking 소켓보다 CPU 사용률이 높다.


윈도우에서 제공하는 Select 모델을 사용하면
소켓 함수 호출 성공시점을 미리 알 수 있다.

블록킹 소켓의 단점인 교착상태 돌입 위험과
넌블록킹 소켓의 단점인 '조건 불충족 오류' 처리 로직을 해결할 수 있다.



동기 입출력 / 비동기 입출력


동기 입출력 ( synchronous I/O )

1. 응용 프로그램이 입출력 함수를 호출하고,
   입출력 작업이 끝날 때까지 기다린다.

2. OS는 입출력 작업을 커널 모드에서 수행한다.

3. 커널 모드의 입출력 작업이 완료되면 입출력 함수가 리턴한다.

4. 응용 프로그램은 리턴된 값을 처리하거나
    다른 작업을 진행한다.

입출력 작업이 완료될 때까지 기다린다.



비동기 입출력 ( asynchronous I/O )

1. 응용 프로그램이 입출력 함수를 호출하면
   

2. OS는 입출력 작업을 커널 모드에서 수행한다.
   응용프로그램은 호출후 다른 작업을 진행한다.

3. 커널 모드의 입출력 작업이 완료되면
    작업이 완료되었다는 것을 응용 프로그램에 알려준다,

4. 응용 프로그램은 하던 작업을 중단하고 입출력 결과를 처리한다.




동기와 비동기를 나누는 기준


- 함수 호출 시점 -> 입출력 시작 시점
- 입출력 완료 시점 -> 함수 리턴 시점

동기 입출력의 경우 위 2가지 시점이 일치한다.




비동기 입출력의 경우
- 함수 호출 시점-> 입출력 시작 시점

위 1가지 시점만 일치하고

- 입출력 완료 시점 -> 함수 리턴 시점
은 일치하지 않는다.

입출력이 완료되면 운영체제는 따로 구현된 방법을 통해
응용프로그램에 전달한다.





비동기 통지


OS가 응용 프로그램에게

- 입출력 작업 완료나
- 성공적인 입출력 함수 호출 시점

을 알려준다.










댓글

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code TIL 6 : 6장. 객체와 자료구조

백엔드 개발자가 Djnago fullstack 사이드 프로젝트를하며 ( html, css, vanillaJS 그리고 JS프레임워크 )