I/O 관점에서 Blocking/non-Blocking (3/31)

세젤게으름뱅이·2025년 3월 31일

Spring Webflux

목록 보기
3/16

I/O 관점에서는 Application과 Kernel간 사이를 보자.

Blocking의 종류

  • Blocking은 Thread가 오랜 시간 일을 하거나 대기하는 경우 발생
  • CPU-bound Blocking : 오랜 시간 일을 한다.
  • IO-bound Blocking : 오랜 시간 대기한다.

CPU-bound Blocking

  • Thread가 대부분의 시간 CPU 점유
  • 연산이 많은 경우
  • 추가적인 코어를 투입 (성능 개선 목적)

IO-bound Blocking

  • Thread가 대부분의 시간을 대기
  • 파일 읽기/쓰기, network 요청처리, 요청 전달 등
  • IO-bound non-Blocking 가능
  • callee의 관점에서 Thread가 waiting -> running까지 오래 걸릴 것이다.
    • caller의 요청에 대한 리턴을 바로 수행한다면, caller는 다음 어떤 작업이라도 수행 가능
    • non-Blocking의 형태

Blocking의 전파

Blocking 전파

  • 하나의 함수는, 여러 함수를 호출할 수도 있으며 함소 호출은 중첩적으로 발생 가능
  • callee는 caller가 될 수 있고, 다시 다른 callee를 호출하는 경우처럼
  • Blocking한 함수를 하나라도 호출한다면, caller는 결국 Blocking이 된다.

Blocking 전파 방지

  • 함수가 non-Blocking하려면 모든 함수가 non-Blocking이어야 한다.
  • 따라서 I/O bound Blocking 또한 발생해선 안 된다.
    • ex) 최하위 callee에 I/O bound Blocking 존재한다던지.
    • I/O bound Blocking이 껴있다면, non-Blocking하게 변환이 필요하다.

I/O 모델간 비교 (동기 Blocking / 동기 non-Blocking)

I/O 모델간 공통점 / 차이점

  • 공통점
    • Application이 Kernel의 결과에 관심이 있다.
    • Application이 Kernel로부터 받은 결과를 이용해서 다음 작업 수행한다.
    • 동기다.
  • 차이점
    • A모델은 Kernel이 file을 read하는 동안 Application이 Blocing 상태 (동기 Blocking)
    • B모델은 응답을 돌려주기 전에 Application은 다른 일을 수행 (동기 non-Blocking)

작동방식

동기 Blocking I/O

  • recvfrom 호출 (System call)
  • blocking socket을 이용하여 read/write 수행
  • Application Thread가 block됨 (wait Queue에서 기다린다)

비동기 Blocking I/O

  • recvfrom 주기적으로 호출 (System call)
  • non-blocking socket을 이용하여 read/write 수행
  • 작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환
    • C기반 프로그래밍에서 사용되는 오류
    • I/O 작업시 읽을 데이터가 없을시 발생
    • non-blocking일 경우 바로 EAGAIN/EWOULDBLOCK 반환
  • Application이 wait Queue에 안 들어가고 할 일함.

I/O 모델간 비교 (동기 non-Blocking / 비동기 non-Blocking)

I/O 모델간 공통점 / 차이점

  • 공통점
    • Kernel이 Application의 실행을 막지 않는다.
    • caller는 callee를 기다리지 않고 본인의 일을 수행. (non-Blocking)
  • 차이점
    • B모델은 Application이 Kernel의 결과에 관심이 있음 (동기 non-Blocking)
    • C모델은 Thread1은 Kernel의 결과에 관심이 없고, Kernel은 작업을 완료한 후 결과를 Thread2에게 전달한다. (비동기 non-Blocking)

작동방식

동기 non-Blocking I/O

  • recvfrom 주기적으로 호출 (System call)
  • non-blocking socket을 이용하여 read/write 수행
  • 작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환
    • C기반 프로그래밍에서 사용되는 오류
    • I/O 작업시 읽을 데이터가 없을시 발생
    • non-blocking일 경우 바로 EAGAIN/EWOULDBLOCK 반환
  • Application이 wait Queue에 안 들어가고 할 일함.

비동기 non-Blocking I/O

  • aio_read를 호출 (async I/O call)
  • 작업이 완료되면 Kernel이 완료 시그널을 보내거나, callback 실행
profile
🤦🏻‍♂️

0개의 댓글