[memo] socket models

socket 사용의 여러 모델

  • blocking scoket
    • 일반 blocking socket 을 이용한 send,recv
      • 매 send,recv 시 마다 동기 작업으로 여러 소켓을 동시 처리(다수의 client) 하기 위해서는 일반적으로 thread 를 각 소켓마다 할당해 recv,send 하는 식의 스레드 를 활용
  • non blocking socket
    • non bloking mode socket 으로 전환하는 경우 비동기 send,recv 가능
      • send,recv 이후 종료시까지 기다리지 않게 되지만 스레드와 병행할 경우 리소스를 많이 잡아 먹는다
  • select model
    • 여러 소켓을 등록(fd_set) 해두며 해당 여러 소켓을 순회해 read/write 해야 하는 케이스를 루프를 돌며 처리한다
    • select 함수를 통한 여러 등록 된 소켓 중 작업이 필요한 소켓을 골라내는 방식
      • 소켓 리스트의 갯수 제한과 해당 루프만큼을 순회 해야 하기 때문에 효율적이지는 않지만 스레드 하나당 여러 소켓을 처리할 수 있음
  • WSAAsyncSelect model
    • winsock only
      • windows msg 와 select 를 동시에 이용한 방법으로 window 가 있는 코드에서만 사용가능
  • WSAEventSelect model
    • winsock only
      • 위와 같지만 window msg 가 아닌 event object 를 이용한다
      • 하지만 둘다 모두 select 기반임
      • 기존 select 와 다른점은 select 만 사용했을때의 소켓 갯수 제한이 없음
  • Overlapped I/O model
    • Overlapped 구조체를 사용해 비동기적 I/O 작업
  • Completion Port(IOCP)
    • win32 커널의 지원으로 (일반적으로) cpu 의 코어 갯수만큼의 스레드풀을 이용해 필요한 때마다의 소켓 처리를 thread safe 보증된 queue 오브젝트를 접근해 각 스레드에서의 처리로 가능하게 한다
      • 다수의 소켓에 대한 처리를 cpu 와 커널의 지원으로 효율적인 처리가 가능하다
      • 일반적으로 해당 소켓의 상태변화를 처리할 스레드 갯수는 코어갯수+1 정도로 하는편
        • 컨텍스트 스위칭이 적은 효율
        • 이미 활성된 스레드풀을 사용하는 방식 이기에 추가비용이 적음
      • 추가로 커널-유저 영역의 메모리 복사의 리스크가 해당 모델에서는 없다 라는점이 특징
      • 커널 관리하의 비동기 io를 이미 거친 뒤 해당 완료 시점에 대한 핸들링을 하게 되는 방식이 proactor 패턴의 개략적 설명이 될 루 있다
  • epoll
    • linux 에서의 IOCP 라고 보면된다
      • IOCP 와 비슷하지만 다른점은
        • 실제 구동방식 자체가 다르다
          • epoll : reactor 패턴 , IOCP : proactor 패턴
          • reactor 패턴의 경우 io 발생시 처리할 핸들러를 등록 해두어야 하며 해당 이벤트 발생시 이벤트 핸들러를 통해 처리하게 된다
  • kqueue
    • FreeBSD 에서의 epoll
  • boost asio (async input ouput)
    • boost library 에서 제공되는 비동기 입출력 모델
      • 플랫폼 디펜던시가 없지만 리눅스 에서는 epoll 을 윈도우 에서는 iocp 를 사용하게 된다
      • 리눅스에서 사용시 epoll 을 proactor 패턴으로 랩핑해서 사용하는 것으로 보인다
      • 참고: https://popcorntree.tistory.com/154 이 블로그의 글이 잘 설명되어 있어 나중에 읽어보면 되움이 될것 (작성자님 감사합니다)

대충 생각나는데로 메모 수준으로 정리해보았으며 틀리거나 부족한 내용이 있을 수 있고 시간날때 각 내용에 대해서 자세히 정리해볼 예정..


댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다