윈도우 운영체제에서 제공하는 socket용 통지모델.
Async(비동기)를 표방
사용자가 커널의 상황을 지속하며 통지 받는 것이 아닌, 특정 상황이 되면 통지를 주도록 예약.
기존 Select가 확인하던 I/O 상태변화에 대해서 소켓별로 WAS를 사용해 등록하면 윈도우 메세지를 통해 통지된다. 그래서 둘이 합쳐 Async Select.
통지 방식으로 윈도우 메세지를 사용하는 만큼 WAS는 윈도우 프로시저에서만 사용 가능.
리눅스의 동기 형식의 통지방식은 다수의 fd(소켓)에 대해 동시에 체크 할 수 있었지만, 윈도우의 비동기 통지방식은 소켓별로 따로 통지.
내부적으로 따로 체크하는 것이 아니라 운영체제가 I/O 상황이 될 때 인터럽트를 사용하는 방식->운영체제 수준 연상량 줄어든다. (다른 운영체제에서는 지원하지 않는 기능 -> 다른 구동환경에서 같은 프로세스 사용불가)
커널에게 미리 등록만 해두면 유저는 따로 커널에게 확인하여 동기화하지 않더라도 알아서 메시지가 날아온다. Sync보다 상당히 편하고, 매 프레임마다 체크를 하지 않아도 되니 부담도 적다. 그리고 WAS 함수자체에서 I/O상황을 리턴받는 것이 아니고 등록만 하는 것이다 보니 Block이 걸릴 소지가 없다. 따라서 Non-Block 방식이다.
윈도우 메세지 대신 이벤트 오브젝틀를 사용: WSAEventSelect는 윈도우 메시지 대신 이벤트 오브젝트에 시그널을 변경시키는 방식으로 통지를 준다. 이벤트 객체를 사용하기 때문에, Wait 함수를 사용하여 signal 대기하는 방식으로 구현해야한다.
벤트 오브젝트를 사용하여 signal을 체크한다는 점이 동기랑 비슷한 점이 있어보인다. 그리고 wait함수로 이벤트가 발생할 때까지 대기한다는점이 blocking같기도 하다. 하지만 select나 epoll처럼 유저가 리소스를 사용하여 체크하는 것이 아니라 Wait함수를 사용하여 이벤트가 발생할 때 활성화 된다는 점이 비동기 방식에 가깝다
WSAWaitForMultipleEvent() 함수에서 timeout 옵션이 있기 때문에 select나 epoll 처럼 어떻게 사용하느냐에 따라 blocking 방식으로 사용할 수도 non-blocking 방식으로 사용할 수도 있다. 하지만 다른 점이 있다면, blocking 방식을 사용해도 멀티플렉싱이 가능하다는 점이다. 하나의 Wait에서 여러개의 I/O를 동시에 감지하고 있기 때문에, 쓰레드 하나만 wait를 통해 blocking한 상태에서 대기시키면 멀티플렉싱이 가능하다. 결과적으로는 Blocking 이면서 Non-Blocking이기도 하다.