alt
Home Sync, Async, blocking, non-blocking
Post
Cancel

Sync, Async, blocking, non-blocking


  • 동기: 두개 이상의 작업이 시작 종료시간이 같거나 시작과 동시에 종료 (선후 관계가 확실)
  • 비동기: 다른 작업과 시작, 종료 시점이 관계가 없다.
  • blocking: 다른 작업 진행되는 동안 기다린다. (코드상 Return 하지않음)
  • non blocking: 다른 작업 진행 동안 기다리지 않는다. (코드상 일단 Return)


 BlockingNon-blocking
SyncRead/WriteRead/Write. + Polling
AsyncI/O MultiplexingAsynchronous I/O


Sync + blocking

  • 기본적인 mvc 패턴, application에서 I/O 요청한 후 완료되기 전까지 application block된다.
  • 메서드에서 다른 메서드를 호출해, 결과값 기다리는 것


Sync + non-blocking

  • 논 블로킹 IO에 접근하는 가장 기본적인 패턴
  • application에서 I/O 요청한 후 return하여 다른 작업 수행하다가 완료되었는지 틈틈히 확인해준다.
    • 이것이 polling 방식 (busy-waiting)
    • long polling : 응답주는 쪽에서 기다렸다가 지연 응답을 주는 것
  • 작업 효율이 좋지 않다.


Async + blocking

  • 비효율적이다. Async + non-block 모델에서도 잘못된 코드로 인해 이와 같이 동작할 수 있다.

    e.g) Nodejs + Mysql. (mysql 드라이버는 blocking 방식이므로 이와 같은 문제 발생) 환경에서 쿼리 결과를 기다린다면 이러한 경우에 해당한다.

  • 다중 I/O 서버에서 각 커넥션의 입장에서는 Async + Blocking이라고 볼 수 있다.


Async + non-blocking

  • I/O 요청 후 return해 다른 작업을 수행.
  • 이벤트 루프 동작 방식: 완료시 이벤트가 발생하거나 미리 등록한 callback을 통해 이후 작업 진행.
  • HTTP 커넥션 입출력하는 웹 서버에서의 다중 I/O 서버를 생각해보면 된다. 이 때 모든 커넥션들은 각각 본인의 작업만 끝나면 client에게 응답메시지로 전송되고 커넥션은 종료된다. 물론, I/O를 처리해야하는 스레드는 같은 하나의 스레드이므로, 해당 스레드가 작업중일 때 다른 작업의 커넥션들은 run loop에서 Block되지만, 웹서버 입장에서는 스레드가 Async non blocking으로 잘 수행한다고 볼 수 있다.



Reference)

https://deveric.tistory.com/99

https://yorr.tistory.com/20

This post is licensed under CC BY 4.0 by the author.