웹프로그래밍/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을 호출
- 요청을 했던 스레드와 다른 스레드에게 전달