웹프로그래밍/WebFlux

blocking과 non-blocking의 차이(I/O 관점)

W2AS2L 2023. 6. 12. 04:31

Blocking의 종류

  • blocking은 thread가 오랜 시간 일을 하거나 대기하는 경우 발생
  • CPU-bound blocking
    • thread가 대부분의 시간 cpu 점유
    • 연산이 많은 경우
    • 성능을 올리기 위해 추가적인 코어를 투입
  • IO-bound blocking
    • thread가 대부분의 시간을 대기
    • 파일 읽기,쓰기 network 요청 처리, 요청 전달 등
    • 성능을 올리기 위해 IO-bound non-blocking 가능하다

Blocking의 전파

  • 하나의 함수에서 여러 함수를 호출하기도 하고, 함수 호출은 중첩적으로 발생
  • callee는 caller가 되고 다른 callee를 호출
  • blocking한 함수를 하나라도 호출한다면 caller는 blocking된다.
  • 함수가 non-blocking 하다라고 이야기 하려면 모든 함수가 non-blocking이어야 한다.
  • 따라서 I/O bound blocking또한 발생하면 안된다.\

동기 Blocking I/O

  • recvfrom을 호출(시스템콜)
  • blocking socket을 이용해서 read/write를 수행
  • 쓰레드가 block된다 (wait queue 에서 기다림)

동기 Non-blocking I/O

  • recvfrom을 주기적으로 호출(시스템콜)
  • non-blocking socket을 이용해서 read/write 수행
  • 작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환

비동기 Non-blocking I/O

  • aio_read를 호출
  • 작업이 완료되면 커널이 완료 시그널을 보내거나 callback을 호출
    • 요청을 했던 스레드와 다른 스레드에게 전달