IOCP & Overlapped I/O (2) : Blocking 대 Non-blocking, 동기 입출력 대 비동기 입출력 , 비동기 통지
blocking / non-blocking Blocking socket mode 소켓 함수 호출 시, 조건이 만족되지 않으면 함수가 r eturn하지 않고 스레드 실행이 그 위치에서 정지 한다. 조건이 만족될 때, socket 함수가 return하며 정지 상태의 스레드가 깨어난다.(wake-up) 그리고 작업을 재개한다. 조건이 만족되는 시점이 길어지면 교착 상태로 인해 스레드가 오랜 시간 정지할 수 있다. 다른 스레드가 있다면 TerminateThread() 함수를 호출해 강제 종료시키거나 주 스레드가 종료되어 모든 스레드가 종료되기를 바래야한다. Non-blocking socket mode 소켓 함수 호출시, 조건이 만족되지 않아도 일단 함수가 return 한다. (이 때, 조건이 만족되지 않았다는 오류를 리턴한다.) 때문에 중단 없이 다음 코드를 계속 수행한다. 멀티스레드를 사용하지 않고도 싱글스레드로 여러 소켓을 번갈아가며 입출력 처리를 할 수 있으며 중간에 다른 작업을 수행할 수 있다. 그러나 위에서 말한 '조건이 만족되지 않았다는 오류'를 처리해야한다. 클라이언트가 없어도 계속 cpu자원을 소모하여 함수 return 로직을 수행하기 때문에 blocking 소켓보다 CPU 사용률이 높다. 윈도우에서 제공하는 Select 모델을 사용하면 소켓 함수 호출 성공시점을 미리 알 수 있다. 블록킹 소켓의 단점인 교착상태 돌입 위험과 넌블록킹 소켓의 단점인 '조건 불충족 오류' 처리 로직을 해결할 수 있다. 동기 입출력 / 비동기 입출력 동기 입출력 ( synchronous I/O ) 1. 응용 프로그램이 입출력 함수를 호출하고, 입출력 작업이 끝날 때까지 기다린다. 2. OS는 입출력 작업을 커널 모드에서 수행한다. 3. 커널 모드의 입출력 작업이 완료되면 입출력 함수가 리턴한다. 4. 응용 프로그램은 리턴된 값을 처리하거나 다른 작업을 진행한다. 입출력 작업이 완료될 때까지 기다린다. 비동기 입출력 (...