Java
I/O 관점에서 Blocking/Non-blocking
Hyung1
2024. 1. 20. 19:44
728x90
반응형
공부한 것 기록하기..
Blocking의 종류
- blocking은 thread가 오랜 시간 일을 하거나 대기하는 경우 발생
- CPU-bound blocking: 오랜 시간 일을 한다.
- IO-bound blocking: 오랜 시간 대기한다.
CPU-bound blocking
- thread가 대부분의 시간 CPU 점유
- 연산이 많은 경우
- 추가적인 코어를 투입
IO-bound blocking
- thread가 대부분의 시간을 대기
- 파일 일기/쓰기, netowrk 요청 처리, 요청 전달 등
- IO-bound non-blocing 가능하다.
Blocking의 전파
- 하나의 함수에서 여러 함수를 호출하기도 하고, 함수 호출은 중첩적으로 발생
- callee는 caller가 되고 다시 다른 callee를 호출
- blocking한 함수를 하나라도 호출한다면 caller는 blocking이 된다.
- 함수가 non-blocking하려면 모든 함수가 non-blockingdldjdi gksek.
- 따라서 I/O bound blocking 또한 발생하면 안된다.
두 I/O 모델의 공통점과 차이점
- Application이 Kernel 결과에 관심이 있다.
- Application의 Kernel로 부터 받은 결과를 이용해서 다음 작업을 수행한다.
- caller는 callee의 결과에 관심이 있다 -> 동기
A 모델 | B 모델 |
Kernel이 응답을 돌려주기 전까지 Application은 아무것도 하지 않는다. | Kernel이 응답을 돌려주기 전에 Application은 다른 일을 수행한다. |
caller는 Callee가 완료될때까지 대기 -> Blocking | caller는 callee를 기다리지 않고 본인의 일을 한다 -> Non-blocking |
동기 Blocing I/O | 동기 Non-blocking I/O |
recvfrom을 호출 | recvfrom을 주기적으로 호출 |
blocking socket을 이용해서 read/writer을 수행 | non-blocking socket을 이용해서 read/write 수행 |
쓰레드가 block 된다.(wait queue에서 기다린다) | 작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환 |
두 I/O 모델의 공통점
- kernel이 Application의 실행을 막지 않는다.
- caller는 callee를 기다리지 않고 본인의 일을 한다 -> Non-blocking
B 모델 | C 모델 |
Application은 Kernel의 결과에 관심이 있다. | Thread1은 Kernel의 결과에 관심이 없다. |
결과를 이용해서 액션을 수행한다. | Kernel은 작업을 완료 후 Thread2에게 결과를 전달한다. |
caller는 callee의 결과의 감시이 있다 -> 동기 | caller는 callee의 결과에 관심이 없다 -> 비동기 |
동기 Non-blocking I/O | 비동기 Non-blocking I/O |
recvfrom을 주기적으로 호출 | aio_read를 호출 |
non-blocking socker를 이용해서 read/write 수행 | 작업이 완료되면 커널이 완료 시그널을 보내거나 callback을 호출 |
작업이 완료되지 않았다면 EAGAIN/EWOULDBLOCK 에러 반환 |
I/O 모델
동기 | 비동기 | |
Blocking | Application은 Kernel가 I/O 작업을 완료할 때까지 기다린다. 그 후 결과를 직접 이용해서 이후 본인의 일을 수행한다. | X |
Non-blocking | Application은 Kerenl에 주기적으로 I/O 작업이 완료되었는지 확인한다. 중간중간 본인의 일을 할 수 있고 작업이 완료되면 그때 본인의 일을 수행한다. | Application은 Kernel에 I/O 작업 요청을 보내고 본인의 일을 한다.작업이 완료되면 Kernel은 signal을 보내거나 callback를 호출한다. |
728x90
반응형