CS/Network

Blocking I/O & Non-Blocking I/O

ummchicken 2023. 2. 26. 20:41

✔️ I/O가 성능에 미치는 영향

 

❓ I/O란?

데이터의 입력(Input)과 출력(Output)을 함께 일컫는 말이다.

 

※ 일반적으로 I/O라고 하면, 파일 I/O만 생각하는 경우가 있는데, 

어떤 디바이스를 통해 입력과 출력이 이뤄지는 작업을 모두 I/O라고 합니다.

네트워크를 통해 다른 서버로 데이터를 전송하거나, 

다른 서버로부터 데이터를 전송받는 것도 I/O에 포함됩니다.

 

 

💡 I/O는 어플리케이션의 성능에 가장 영향을 많이 미칩니다!

 

 

따라서 높은 성능을 보장해야 하는 어플리케이션 입장에서는 I/O는 큰 장애물이 될 수 있습니다.

 

 

I/O로 인한 blocking은 CPU를 긴 시간동안 idle하게 두기 때문에,

다른 작업을 할 수 있음에도 오랫동안 다른 작업을 실행할 수 없어 매우 비효율적입니다.

※ idle 상태란?

더보기

- IDLE :"프로세스가 실행하고 있지 않은 상태"

 

- 프로세스 : 동작중인 프로그램, 운영체제가 관리하는 실행 단위

 

- 예를 들어 I/O 인터럽트 대기중이거나, 준비 큐에서 대기하거나, sleep하고있거나....

 

출처 : https://boradol0902.tistory.com/35

 

 

 

✔️ 들어가기 전...

💡 동기(Synchronous)

어떠한 순서를 가지고 진행되는 것

 

예를 들어, 

  • 시작과 종료를 동시에 하거나, 
  • 하나의 작업이 끝나는 동시에 다른 주체가 작업을 시작할 때

 

 

 

💡 비동기(Asynchronous)

어떠한 순서를 보장하지 않는 것

즉, 두 주체가 서로의 시작, 종료시간과는 관계 없이 별도의 수행 시작/종료시간을 가지고 있음

 

예를 들어,

  • 서로 다른 주체가 하는 작업이, 자신의 작업 시간, 종료 시간과는 관계가 없을 때

 

 

출처 : https://deveric.tistory.com/99

 

 

 


 

✔️ Blocking I/O & Non-Blocking I/O

Blocking I/O & Non-Blocking I/O는 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사이다.

 

※ I/O 작업은 Kenel level에서만 수행할 수 있다.

따라서 Process, Thread는 커널에게 I/O를 요청해야 한다.

 

 

 


 

✔️ Blocking I/O

I/O 작업이 진행되는 동안, User Process가 자신의 작업을 중단한채, 
I/O가 끝날 때까지 대기하는 방식이다.

 

그림을 살펴봅시다.

Blocking I/O 형태의 작업은 다음과 같이 진행됩니다.

  1. Process(Thread)가 Kernel에게 I/O를 요청하는 함수를 호출
  2. Process(Thread)는 작업 결과를 반환 받을 때까지 대기
  3. Kernel이 작업을 완료하면, 작업 결과를 반환 받음

 

즉, 애플리케이션에서 Read()를 호출해 커널에 read I/O를 요청하면,

read가 끝날 때까지 application은 block이 되어 다른 작업을 하지 못합니다.

  • 이는 read I/O가 수행될 때까지는 애플리케이션이 다른 작업을 수행하지 못한다는 것을 의미합니다.
  • 즉, 그동안 프로그램 처리를 진행할 수 없습니다.

 

 

🚨 이 경우 말 그대로 block이 되고, 
어플리케이션에서 다른 작업을 수행하지 못하고 대기하게 되므로
 Resource 낭비가 심합니다.

 

 

예를 들어, 

카카오톡이 사용자가 메세지를 전송핼 때까지 대기하고 있는 것입니다.

카카오톡은 메신저 이외에도 다양한 기능이 많은데, 

만약 이러한 상황이라면 매우 비효율적입니다.

 

 

 


 

✔️ Non-Blocking I/O

작업이 진행되는 동안, User Process의 작업을 중단하지 않고, 
I/O 호출에 대해 즉시 리턴하고, 
User Process가 이어서 다른 일을 수행할 수 있도록 하는 방식이다.

 

Non-Blocking I/O 형태의 작업은 다음과 같은 형태로 진행됩니다.

  1. read I/O를 하기 위해 System call
  2. 커널의 I/O 작업 완료 여부와 관계 없이 즉시 응답
  3. 이는 커널이 System call을 받자마자 CPU 제어권을 다시 어플리케이션에게 넘겨주는 작업이다.
  4. 어플리케이션은 I/O 작업이 완료되기 전에 다른 작업을 수행 가능
  5. 어플리케이션은 다른 작업 수행 중간중간에 System call을 보내 I/O가 완료되었는지 커널에 요청하고, 완료되면 I/O 작업을 완료

 

 

💡 이러한 과정을 통해 모든 작업 수행이 I/O의 진행 시간과는 관계 없이 빠르게 동작하기 때문에, 

User Process는 자신의 작업을 오랜시간 중지하지 않고도 I/O 처리를 수행할 수 있습니다.

 

 

🚨 그러나 반복적으로 System call이 발생하기 때문에 이것 또한 Resource 낭비가 심합니다.

 

 

 


 

✔️ 요약

  • Blocking / Non-Blocking
    • 호출되는 I/O 함수가 바로 리턴하느냐, 아니면 제어권을 가져가서 block하느냐의 차이

 

  • Blocking I/O
    • I/O가 호출되면, 제어권을 가져가서 어플리케이션이 멈춤

 

  • Non-Blocking I/O
    • I/O가 호출되면 결과를 즉시 리턴하고, I/O가 완료될 때까지 대기하지 않는다.
    • 제어권을 어플리케이션이 가지고, 어플리케이션이 동작함
    • 필요한 경우에는 polling과 같은 상태확인은 할 수 있다.

 

  • Sync / Async
    • 호출되는 함수의 작업 완료 여부에 따라 이어지는 작업을 누가 처리하느냐의 차이

 

 

  • Synchronous
    • 동기를 의미한다.
    • 모든 요청, 응답이 일련의 순서를 따른다.

 

  • ASynchronous
    • 비동기를 의미한다.
    • 요청을 보냈을 때, 응답 상태와 상관없이 다음 동작을 수행한다.
    • 따라서 작업의 순서가 보장되지 않는다.

 

 

 

 

 


출처