Select, epoll, IOCP, sync, and async (드래프트)

Hoyoung Jung·2021년 1월 26일
3

읽을거리 저장소

목록 보기
3/3

현재 상태

  • 드래프트
  • 쓰다보니 머리가 복잡해져서 다 정리하지 못했습니다. 주말에 천천히 정리해 보려고 해요.

Unix Select()

  • IO 통지 모델의 조상

select() allows a program to monitor multiple file descriptors,
waiting until one or more of the file descriptors become "ready"
for some class of I/O operation (e.g., input possible). A file
descriptor is considered ready if it is possible to perform a
corresponding I/O operation (e.g., read(2), or a sufficiently
small write(2)) without blocking.

Linux epoll()

  • epoll()은 리눅스 시스템콜로 posix api가 아니다.
  • select와 epoll 읽어보자.

IOCP

sync, async, block, non-block IO에 대한 개인적 의견

  • CS계의 떡밥 중 하나이면서 면접 단골 질문 중 하나인 동기 vs 비동기, 블록 vs 넌블록의 차이에 대해 찾아봤는데, 재미있는 사실은 한국어 문서 외에는 해당 내용을 모아서 다룬 문서가 하나도 없다는 것이다.
  • 컴퓨터과학은 다른 분야와 달리 경험적으로 결과가 도출되는 경우가 많은데, 이 경우 명확한 정의가 없어서 자주 논쟁거리가 된다.
  • 초창기 Posix 관련 문서를 살펴봤는데 동기 + 블록, 비동기 + 넌블록을 유사한 개념으로 사용하고 있다.
  • Wiki에 보면 block sync / non-block / async 의 세 가지로 분류한다. 그런데 비교적 최근 block-async도 생긴 느낌.
  • 기존의 다양한 글도도 조금씩 내용이 다르고 다 맞다고 할 수 없으니, 자기만의 생각을 정리해 보자.

한줄 요약

  • 블록 IO: API 완료 전까지 기다림, 현재 프로세스나 스레드가 실행을 양보(yield)할 수 있다.
  • 논블록 IO: 작업 완료 여부와 관계 없이 즉시 리턴.
  • 동기 IO: 코드가 순차적으로 실행되어 API 결과를 리턴 값 또는 parameter의 참조객체로 처리 가능한 것
  • 비동기 IO: 요청 직후 다음 코드를 실행한다. IO는 주로 백그라운드로 완료하고 통지. 대체로 콜백이나 이벤트 핸들러로 처리된다.

예제

  • block + sync: 평범하고 고전적인 read() API들
  • non-block + async: 역시 평범하고 모던한 api들, JS의 Promise도 여기에 해당
  • non-block + sync: polling 방식의 api들. 주로 즉시 리턴되고, loop를 돌면서 완료 여부를 체크해 줌
  • block + async: 10년 전에 쓴 글에서는 이 카테고리에는 아무도 없다고 했던 것 같은데, 요즘은 논쟁의 여지는 있지만 JS의 async- await나 Java의 CompletableFuture가 여기에 해당되는 것 같다.

참고링크

profile
주짓수를 좋아하는 개발자

0개의 댓글