Window I/O 통지모델

songtofu·2024년 2월 21일
0

STUDY

목록 보기
3/4

WSAAsyncSelect

  • 윈도우 운영체제에서 제공하는 socket용 통지모델.

  • Async(비동기)를 표방

  • 사용자가 커널의 상황을 지속하며 통지 받는 것이 아닌, 특정 상황이 되면 통지를 주도록 예약.

  • 기존 Select가 확인하던 I/O 상태변화에 대해서 소켓별로 WAS를 사용해 등록하면 윈도우 메세지를 통해 통지된다. 그래서 둘이 합쳐 Async Select.

  • 통지 방식으로 윈도우 메세지를 사용하는 만큼 WAS는 윈도우 프로시저에서만 사용 가능.

  • 리눅스의 동기 형식의 통지방식은 다수의 fd(소켓)에 대해 동시에 체크 할 수 있었지만, 윈도우의 비동기 통지방식은 소켓별로 따로 통지.

  • 내부적으로 따로 체크하는 것이 아니라 운영체제가 I/O 상황이 될 때 인터럽트를 사용하는 방식->운영체제 수준 연상량 줄어든다. (다른 운영체제에서는 지원하지 않는 기능 -> 다른 구동환경에서 같은 프로세스 사용불가)

  • 커널에게 미리 등록만 해두면 유저는 따로 커널에게 확인하여 동기화하지 않더라도 알아서 메시지가 날아온다. Sync보다 상당히 편하고, 매 프레임마다 체크를 하지 않아도 되니 부담도 적다. 그리고 WAS 함수자체에서 I/O상황을 리턴받는 것이 아니고 등록만 하는 것이다 보니 Block이 걸릴 소지가 없다. 따라서 Non-Block 방식이다.

WSAEventSelect

  • 윈도우 메세지 대신 이벤트 오브젝틀를 사용: 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이기도 하다.

Overlapped I/O

  • 앞서 말한 윈도우의 Select 형식들은 유저와 커널의 관계는 비동기 형태, 구동 방식은 여전히 동기형인 Select의 구조(선체크 후I/O)를 따른다.
  • 일단 I/O명령을 날리고, 끝나면 signal을 받는다. 뿐만 아니라 끝났을때 특정 함수를 실행하게 할 수도 있다.
  • 비동기형태로 작동, WSAEventSelect와 동일하게 Wait하는 방법에 따라서 Blocking도 가능하고 Non-Blocking도 가능하다.

출처: https://ozt88.tistory.com/22

profile
읽으면 머리에 안들어와서 직접 쓰는 중. 잘못된 부분 지적 대환영

0개의 댓글