인생을 코딩하다.

I/O 관점에서 Blocking/Non-blocking 본문

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
반응형
Comments