I/O 관점에서는 Application과 Kernel간 사이를 보자.
- Blocking은 Thread가 오랜 시간 일을 하거나 대기하는 경우 발생
- CPU-bound Blocking : 오랜 시간 일을 한다.
- IO-bound Blocking : 오랜 시간 대기한다.
- Thread가 대부분의 시간 CPU 점유
- 연산이 많은 경우
- 추가적인 코어를 투입 (성능 개선 목적)
- Thread가 대부분의 시간을 대기
- 파일 읽기/쓰기, network 요청처리, 요청 전달 등
- IO-bound non-Blocking 가능
![]()
- callee의 관점에서 Thread가 waiting -> running까지 오래 걸릴 것이다.
- caller의 요청에 대한 리턴을 바로 수행한다면, caller는 다음 어떤 작업이라도 수행 가능
- non-Blocking의 형태
![]()
- 하나의 함수는, 여러 함수를 호출할 수도 있으며 함소 호출은 중첩적으로 발생 가능
- callee는 caller가 될 수 있고, 다시 다른 callee를 호출하는 경우처럼
- Blocking한 함수를 하나라도 호출한다면, caller는 결국 Blocking이 된다.
- 함수가 non-Blocking하려면 모든 함수가 non-Blocking이어야 한다.
- 따라서 I/O bound Blocking 또한 발생해선 안 된다.
- ex) 최하위 callee에 I/O bound Blocking 존재한다던지.
- I/O bound Blocking이 껴있다면, non-Blocking하게 변환이 필요하다.
- 공통점
- 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에 안 들어가고 할 일함.
- 공통점
- 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 실행