귀염둥이의 메모

Blocking vs NonBlocking, Synchronous vs Asynchronous 본문

CS

Blocking vs NonBlocking, Synchronous vs Asynchronous

겸둥이xz 2021. 9. 25. 00:57
반응형

Blocking

  • 자신의 작업을 진행하다 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
  • 직접 제어할 수 없는 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것
  • ex) 호출하는 함수가 IO 요청을 했을 때 IO 처리가 완료될 때까지 아무 일도 하지 못한고 기다리는 것

Non-Blocking

  • 다른 주체의 작업에 관련 없이 자신의 작업을 하는 것
  • 직접 제어할 수 없는 대상의 작업 처리 여부와 상관이 없음
  • ex) 호출하는 함수가 IO 요청을 한 후 IO 처리 완료 여부와 상관없이 바로 자신의 작업을 하는 것

Blocking vs Non-Blocking

  • 다른 주체가 작업할 때 자신의 제어권이 있는지 없는지로 볼 수 있음
  • 제어의 관점에서 바라보는 것

 

Synchronous

작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미

  • A와 B가 시작 시간 또는 종료 시간이 일치하면 Sync
  • ex) A, B 쓰레드가 동시에 작업을 시작하는 경우

  • A가 끝나는 시간과 B가 시작하는 시간이 일치하면 Sync

Asynchronous

시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미
  • Sync와 반대로 대상이 서로 시간을 맞추지 않는 것을 말한다
  • 함수A가 호출되는 함수 B에게 작업을 맡겨놓고 완료 여부(결과)를 신경을 쓰지 않는 것

Synchronous vs Asynchronous

  • 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 아닌지로 판단할 수 있음
  • 순서와 결과 처리의 관점
Sync/Async와 Blockking/Non-Blocking은 비슷하지만 다른 관점을 갖고 서로 독립적으로 생각해야 한다

 

2:2 Matrix

Blocking/Sync

  • 결과를 기다리고, 끝나면 바로 처리
  • 제어권이 넘어가고, 작업이 완료될 때까지 기다린다 - Blocking
  • 제어권과 결과를 같이 받아서 처리 - Sync

 

Non-Blocking/Sync

 

  • 애플리케이션으로부터 요청을 받은 커널은 작업 완료 여부와 상관없이 제어권을 반환하여 애플리케이션에 넘겨준다
  • 중간중간마다 커널에게 결과가 나왔는지 계속 물어본다 => 안 나왔으면 다시 자신의 일을 한다 => 다시 물어본다...
  • 결과 완료되면 그 결과를 처리함

예시 : 게임에서 맵 이동할때 로딩창

Blocking/Async

  • 자신의 작업에 대한 제어권이 없고, 결과를 신경 쓰지 않음
  • 어차피 Blocking 되어 대기하는데 Blocking/Sync 방식과 성능 차이가 있을까...?
    • Blocking/Async는 별로 좋은 점이 없어서 이 방식을 사용할 필요가 없긴 하다
    • 의도하지 않게 Blocking/Async로 동작하는 경우가 있다고 한다
대표적인 케이스가 Node.js와 MySQL의 조합이 있다. Node.js 쪽에서 callback 지옥을 헤치면서 Async로 전진해와도, 결국 DB 작업 호출 시에는 MySQL에서 제공하는 드라이버를 호출하는데, 이 드라이버가 Blocking 방식이라고 한다.
NonBlocking/Async 방식을 쓰는데, 그 과정에 Blocking으로 동작하는 것이 포함되어 의도치 않게 Blocking/Async로 동작할 수 있다.

Non-Blocking/Async

  • 다른 작업이 시작되어도 자신의 작업은 멈추지 않음, 결과를 바로 처리하지 않아도 됨
  • ex) JavaScript에서 API 요청을 하고, 다른 작업을 하다가 callback을 통해서 추가적인 작업을 처리할 때

 


<참고자료>

https://www.youtube.com/watch?v=oEIoqGd-Sns 

http://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

https://velog.io/@codemcd/Sync-VS-Async-Blocking-VS-Non-Blocking-sak6d01fhx

반응형
Comments