Non-Blocking IO / Blocking IO

2023. 2. 10. 19:35기술 창고/정보 창고

728x90
SMALL

Blocking IO

Blocking IO 란 IO 프로세스가 시작한 작업이 진행되는 동안 다른 작업은 중단한 상태로 진행 중인 IO 작업이 끝날 때까지 대기하는 방식을 뜻한다,

# Blocking IO

Blocking IO 에 관한 자료를 찾다보니 가장 흔한 이미지가 위의 사진이였다.

사진을 보면, Read() 함수가 호출이 되면 해당 함수가 완전히 끝날 때까지 다른 작업을 수행하지 못한다.

 

 

 

Non-Blocking IO

Non-Blocking IO 는 한 프로세스가 IO 작업을 호출했을 때 IO 작업이 완료될 때까지 작업을 중단하지 않고 IO 호출에 대해 즉시 리턴한 뒤, 해당 프로세스가 이어서 다른 IO 작업을 수행할 수 있도록 하는 방식을 뜻한다.

 

Non-Blocking IO 는 한 프로세스가 작업을 진행할 때 즉시 커널 쪽에서 어플리케이션에 바로 응답을 한다.

이 때 프로세스는 계속해서 진행되는 상태이다.

어플리케이션에 바로 응답이 도착했기 때문에 어플리케이션은 다른 프로세스 작업을 수행할 수 있게 된다.

어플리케이션은 다른 작업들을 수행하다가 중간마다 시스템 콜을 보내 IO 작업이 수행 완료되었는지 커널에게 확인해보고, 완료가 되었다면 해당 IO 작업을 완료한다.

# Non-Blocking IO

이미지를 보면 Read() 함수가 호출(시스템 콜)이 되고 난 이후에 바로 커널에서 어플리케이션으로 응답을 해준다.

이 때 어플리케이션은 응답을 받았기 때문에 작업 제어권은 어플리케이션에 있는 상태이며 따라서 다른 작업을 이어서 진행할 수 있다.

이후에 해당 작업들을 수행하면서 중간중간에 작업 완료가 되었는지 확인을 하고 완료가 되었다면 정상적으로 완료시킨다.

 

 

# Blocking 과 Non-Blocking 의 차이는 호출되는 IO함수가 바로 리턴하여 제어권을 어플리케이션에 넘기느냐 아니면 바로 리턴하지 않아 커널 쪽에서 제어권을 가지고 있느냐의 차이이다.

ㄴ Blocking 은 바로 리턴하지 않고 IO 작업이 완료될때까지 제어권을 커널 쪽에 넘긴 상태이다. (제어권을 넘겨서 block)

ㄴ Non-Blocking 은 바로 리턴하여 어플리케이션한테 다시 제어권이 돌아온 상태이다. (제어권을 돌려받아서 non block)

 


 

이 Blocking IO 와 Non-Blocking IO 가 동기(synchronous) , 비동기(asynchronous) 와 비슷하다고 하여 똑같다고 생각할 수 있으나 엄연히 다른 개념이라고 한다.

 

 

동기 (synchronous)

프로세스의 작업을 직렬화하여 수행하는 방식이다.

즉, 한 작업이 완전히 수행될 때까지 다른 작업들은 대기 상태이고, 완전히 완료가 되었다면 이어서 다른 작업이 수행되는 형식이다.

# 요청을 보내고 반드시 응답을 받아야 다음 작업을 수행하는 형식

 

 

비동기 (asynchronous)

프로세스의 작업을 병렬화하여 수행하는 방식이다.

즉, 여러 작업을 동시에 수행하는 상태이다.

# 요청을 보내고 반드시 응답을 받을 필요없이 다음 작업을 동시에 수행하는 형식

 

[동기 / 비동기 참고 글]

https://jindevelopetravel0919.tistory.com/87

 

동기 / 비동기

동기 통신 (Synchronous) 동기란 태스크(작업)을 직렬적으로 수행하는 방식이다. 요청(Request)을 보내고 난 이후에 반드시 응답(Response)을 받아야 다음 동작이 이루어진다. 흔히 말하는 동기화라고 하

jindevelopetravel0919.tistory.com

 

 

 

여러 자료에서 동기/비동기, Blocking IO/Non-Blocking 의 차이를 말하고 있다.

  • blocking : 작업을 요청하면 일단 요청한 쪽은 일단 block이 되고, 작업이 완료가 된후에 응답을 받을수 있음. 그렇기에 완료가 되기 전에는 요청한 쪽은 block이 되어 다른 작업을 수행하지 못함.
  • non-blocking : 작업을 요청하면, 즉시 응답이 돌아옴
  • 동기(sync) : 작업을 요청한 측에서 작업의 완료 여부를 체크함.
  • 비동기(async) : 작업을 요청 받은 측에서 작업의 완료 여부를 알려줌

혹은

  • blocking : wait queue 에 들어가고, 시스템 콜이 완료된 후에 응답을 보냄.
  • non-blocking : wait queue 에 들어가지 않고, 즉시 리턴함. (응답 또는 에러코드)
  • 동기(sync) : wait queue 에 머무는게 필수가 아니고, 시스템 콜의 완료를 기다림.
  • 비동기(async) : 즉시 리턴하고, 시스템콜의 완료을 기다리지않음

이렇게 구분을 한다고 보면 될 것 같다.

 

 

비동기와 Non-Blocking 의 경우 비동기는 병렬적으로 작업을 수행하고 이때 여러 작업이 같은 시점에 동시에 수행할 수도 있지만 Non-Blocking은 한 작업의 시스템 콜을 보내면 바로 응답을 돌려받고 이 때 다른 작업을 이어서 할 수 있다는 차이점을 확인할 수 있는데, 개인적으로 동기와 Blocking의 명확한 차이점이 아직까지 잘 이해가 되지 않는다.

이후에 다시 추가 정리할 필요가 있을 것 같다.

 

 

 

[도움받은 출처 글]

https://etloveguitar.tistory.com/140

 

blocking I/O, non-blocking I/O에 대하여 (sync, async와의 차이)

Blocking I/O / Non Blocking I/O, synchronous / asynchronous 는 개발을 하다보면 자주 접하게 되는 용어다. 특히 파이썬, NodeJS와 같이 싱글스레드로 동작하는 언어에서는 성능을 위해 필수적으로 알아두어야

etloveguitar.tistory.com

https://limdongjin.github.io/concepts/blocking-non-blocking-io.html#ibm-%E1%84%8B%E1%85%A1%E1%84%90%E1%85%B5%E1%84%8F%E1%85%B3%E1%86%AF

 

blocking, non-blocking IO, 동기, 비동기 개념 정리

blocking, non-blocking IO, 동기, 비동기 개념 정리

limdongjin.github.io

 

728x90
반응형
LIST