Blocking/Non-Blocking

Yoon·2024년 1월 25일
0

Blocking I/O Model 이란?

CPU의 기본적인 I/O 모델로 리눅스에서 모든 소켓 통신은 기본 blocking으로 동작한다.

I/O 작업이 진행되는 동안 유저 프로세스는 자신의 작업을 중단한 채 대기하는 방식이다.

  1. 유저는 커널에게 read 작업 요청
  2. 데이터가 입력될 때까지 대기
  3. 데이터가 입력되면 유저에게 커널이 결과를 전달한다.

ex) 카카오톡이 사용자가 메시지를 전송할 떄까지 대기하는 것

Non-Blocking Model 이란?

I/O 작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식이다.

  1. 유저가 커널에게 read 작업 요청
  2. 데이터가 입력됐든 안됐든 요청하는 그 순간, 바로 결과가 반환된다 (데이터가 없다면 없다는 결과 메시지 EWOULDBLOCK 반환)
  3. 입력 데이터가 있다면 1-2번 반복. (2번에서 결과 메시지를 받은 유저는 다른 작업을 진행한다)
  4. 입력 데이터가 있다면 커널이 유저에게 결과 전달한다.
  • 이 경우 I/O의 진행시간과 관계없이 애플리케이션에서 작업을 오랜 시간 중지하지 않고 I/O 작업을 진행할 수 있다.

  • 하지만 반복적으로 시스템 호출이 발생하기에 이역시 자원 낭비가 된다. (데이터를 입력할 때만 전송하는 게 아니라 주기적 반복)

  • "너 보낸 메시지 있니?" -> "없네" -> '잠시 이 사용자한테 공지 보내야겠다' -> "너 보낸 메시지 있니?" (반복)

  • Non-Blocking 문제인 반복적 시스템 콜 호출을 해결하기 위해 I/O 이벤트 통지 모델이 도입


동기 & 비동기는 정리한 부분이 많아서 스킵,


결론

  • 블로킹(Blocking): I/O 작업 기다림 O / 대기 큐 stay O
  • 논블로킹(Non-Blocking): I/O 작업 기다림 O / 대기 큐 stay X
  • 동기(Synchronous): I/O 작업 기다림 O / 대기 큐 stay X
  • 비동기(Asynchronous) : I/O 작업 기다림 X / 대기 큐 stay X

profile
나의 공부 일기

0개의 댓글

관련 채용 정보