TIL(Today I Learned)

[CS스터디] Blocking I/O & Non-Blocking I/O (+ 동기와 비동기)

yunseohhe 2024. 9. 29. 14:18

I/O란?

  • Input/Output이라고 부르며, 프로그램이 외부와 데이터를 주고받는 작업이다.
  • 네트워크에서의 I/O
     : 서버가 클라이언트의 요청을 받아 응답을 돌려주는 과정이다.
  • 예시
     - 파일 읽기/쓰기
     - 네트워크 요청 처리(웹 서버와 클라이언트의 HTTP 요청/응답)

(출처 : 챗GPT)
(출처 : 챗GPT)

  • 위의 이미지는 네트워크 I/O 흐름을 간단하게 표현한 다이어그램이다.
  • 클라이언트가 서버에 요청을 보내고, 서버가 응답을 돌려주는 과정이다.

 

 

 

동기(Synchronous) I/O와 비동기(Asynchronous) I/O

동기 I/O

  • I/O 작업이 완료될 때까지 대기하는 방식이다.
  • I/O 작업이 끝나기 전까지 다음 코드 실행이 불가능하다.

cf ) 동기

  - 사전적으로 '동시에 일어난다'는 의미를 가지고 있다.

  - 프로그래밍에서의 동기는 작업이 순차적으로 진행되는 것을 의미한다.

 

비동기 I/O

  • I/O 작업을 요청하면, 응답 상태와 상관없이 다음 동작을 수행한다.(= 작업의 순서가 보장되지 않는다.)
  • 작업이 완료되면 별도의 이벤트나 콜백으로 알림을 받는다.

cf ) 비동기

  - 사전적으로 '동시에 일어나지 않는다'는 의미를 가지고 있다.

 

cf ) 이벤트(Event)

  - 비동기 작업이 끝나면 어떤 일이 발생했다는 신호를 주는 것이다.

 

cf ) 콜백(Callback)

  - 위의 이벤트가 발생했을 때, 자동으로 실행되는 함수이다.

  - 작업이 끝난 후 어떤 동작을 할지 정해놓는 것
  - 예
      : 파일 다운로드가 끝나면, 콜백 함수가 실행되어 "다운로드 완료" 메시지를 출력하거나 파일을 처리하는 작업을 시작한다.

(출처 : 구글이미지)

 

 

Blocking I/O와 Non-Blocking I/O

Blocking I/O

  • I/O 작업이 완료될 때까지 스레드가 대기하는 방식
  • 예시
     : 클라이언트가 서버에 요청을 보내면, 서버가 그 요청을 처리하는 동안 아무것도 하지 않고 대기한다.
  • 장점
     : 이해하기 쉽고 구현이 간단하다.
  • 단점
     : 요청이 많아지면 서버가 여러 요청을 동시에 처리하지 못하고, 대기 시간이 길어질 수 있다.

블로킹 I/O 예시 1

  • 애플리케이션에서 Read함수를 호출해 커널에 read I/O를 요청하면, read가 끝날 때까지 애플리케이션은 block이 되어 다른 작업을 하지못하고 대기한다.
     = read I/O가 수행될 때까지는 애플리케이션이 다른 작업을 수행하지 못한다는 것을 의미

cf ) 커널이란?

  - 하드웨어와 소프트웨어 사이의 중간자 역할을 한다.

  - I/O 작업이 일어난 후 커널이 없다면, 애플리케이션이 하드웨어를 제어할 수 없고, I/O 작업이 불가능하다.

블로킹 I/O 예시 2

  • Blocking I/O 시스템 호출은 I/O가 완료될때 까지 반환하지 않는다.

 

Non-Blocking I/O

  • I/O 작업을 요청한 후, 작업이 완료되지 않았더라도 스레드가 다른 작업을 처리할 수 있는 방식이다.
  • 예시
     : 클라이언트가 서버에 요청을 보냈을 때, 서버는 그 요청을 바로 처리하지 않고 다른 요청도 동시에 처리 가능하다.
  • 장점
     : 동시성 처리에 유리하며, 많은 요청을 효율적으로 처리할 수 있다.
  • 단점
     : 구현이 복잡하고, 코드의 가독성이 떨어질 수 있다.

논블로킹 예시1

  • read I/O를 하기 위해 system call을 수행하면, 커널의 I/O작업 완료 여부와는 무관하게 즉시 응답한다.
  • 커널이 시스템 콜을 받자마자 CPU 제어권을 다시 애플리케이션에게 넘겨주고, 따라서 애플리케이션은 I/O 작업이 완료되기 전에 다른 작업을 수행할 수 있다.
  • 애플리케이션은 다른 작업들을 수행하다가 중간중간 시스템 콜을 보내서 I/O가 완료됐는지 커널에게 물어보고, 완료되면 I/O 작업을 완료한다.

논블로킹 예시2

  • Non-Blocking I/O 시스템 호출은 즉시 반환되며, 프로세스는 나중에 I/O가 완료되면 알림을 받는다.

 

Blocking I/O와 Non-Blocking I/O의 비교

구분 Blocking I/O Non-Blocking I/O
스레드 대기 여부 대기함 대기하지 않음
성능 동시성 처리 어려움 많은 동시 요청 처리 가능
구현 난이도 쉬움 어려움
사용 사례 간단한 애플리케이션이나
작은 규모의 서버 등
실시간 채팅 서버,
대규모 네트워크 서비스 등

 

 

 

실생활 비교

블로킹 I/O와 논블로킹 I/O의 차이

 

I/O 작업 처리의 4가지 방식

Blocking I/O vs Non-Blocking I/O제어권의 차이

  • Blocking: 제어권이 반환되지 않고 함수가 끝날 때까지 기다린다.
  • Non-Blocking: 제어권이 즉시 반환되어 함수가 완료되지 않아도 다른 작업을 계속할 수 있다.

 

Sync I/O vs Async I/O 작업 완료 후의 처리 방식의 차이

  • Sync(동기): 작업이 완료된 후에만 다음 작업을 처리한다.
  • Async(비동기): 작업이 완료되지 않아도 즉시 반환되며, 작업 완료 후 나중에 콜백이나 이벤트를 통해 후속 작업을 처리한다.

 

4가지 방식 (출처 : 구글이미지)

 

  • Synchronous + Blocking (동기식 + 블로킹) 
      : 여기에서는 Read/Write 방식으로, 작업이 끝날 때까지 기다린다.
  • Synchronous + Non-Blocking (동기식 + 논블로킹)
      : 이 방식에서는 작업이 끝날 때까지 기다리지 않고, Polling으로 확인하며 다른 작업을 할 수 있다.
  • Asynchronous + Blocking (비동기식 + 블로킹)
     : I/O 멀티플렉싱(Select/Poll) 방식으로, 비동기적으로 여러 작업을 처리하지만, 각각의 작업이 완료될 때까지 대기한다.
  • Asynchronous + Non-Blocking (비동기식 + 논블로킹)
     : 가장 효율적인 방식으로, I/O 작업이 완료되지 않아도 다른 작업을 하면서, 완료되면 알림을 받아 처리하는 방식입니다.