블럭킹 | 논블럭킹 | 동기 | 비동기
Blocking | Non Blocking | Sync | Async 에 대해 알아보자
Last updated
Was this helpful?
Blocking | Non Blocking | Sync | Async 에 대해 알아보자
Last updated
Was this helpful?
블럭킹과 논블럭킹은 대기큐
와 호출 결과 시점
으로 구분할 수 있다. 설명하기 쉽게 프로그램 A와 B가 있다고 가정하겠다. 프로세스는 프로그램 A에서 B를 호출하는 순서로 진행한다.
프로그램 A 에서는 프로그램 B 로직이 수행 완료될 때 까지 대기큐에 들어가 로직이 완료된 이후에나 대기큐에서 프로그램 A가 반환되어 이후 로직을 수행할 수 있다.
프로그램 B는 호출 결과를 로직 수행 완료 이후에 프로그램 A에게 돌려주게 된다.
프로그램 A는 프로그램 B를 호출한 이후에도 제어권을 가지고 있어 대기큐에 들어가지 않고 다른 로직을 수행할 수 있다.
프로그램 B가 호출된 순간 호출되었다는 결과만 프로그램 A에게 돌려준다.
동기와 비동기는 호출한 결과의 완료 여부를 확인 하는가
에 따라 구분할 수 있다. 이번에도 이전과 동일하게 프로그램 A,B로 가정하겠다. 프로세스도 동일하다.
프로그램 B가 완료할 때까지 프로그램 A는 기다리게 되므로 아무런 로직도 수행하지 못한다.
프로그램 B를 호출한 이후에 프로그램 A는 프로그램 B의 완료 여부를 기다리지 않고 다음 로직을 수행한다.
애플리케이션에서 커널로 작업을 요청한다.
커널은 요청 받은 작업을 수행한다.
애플리케이션은 커널 작업이 완료될 때까지 대기한다.
커널의 작업이 완료되면 결과값을 리턴해준다.
애플리케이션은 커널의 결과를 확인하고 이후 로직을 수행한다.
애플리케이션은 커널에 작업을 요청한다.
커널은 작업을 수행한다.
커널 작업 중간에 애플리케이션에 제어권을 넘겨 준다.
애플리케이션은 제어권을 위임 받았으므로 나머지 작업을 수행한다.
애플리케이션은 작업 중간에 커널에 작업 제어권을 다시 넘겨준다.
서로 제어권을 위임하며 번갈아 수행하며 작업을 완료한다.
애플리케이션은 커널에 작업을 요청한다.
커널은 작업을 수행한다.
애플리케이션은 커널에 작업 요청 이후에 바로 다른 작업을 수행한다.
애플리케이션은 커널의 작업이 완료 되었는지 확인하기 위해 기다린다.
커널이 작업이 완료되면 결과값을 리턴한다.
애플리케이션은 기다리다 작업이 완료되어 결과값을 전달 받으면 나머지 로직을 수행할 수 있다.
애플리케이션은 커널의 작업을 요청한다.
커널은 작업을 수행한다.
애플리케이션은 커널에 요청 후 나머지 작업을 수행한다.
커널은 작업 완료 후 전달받은 콜백함수를 호출하거나 종료한다.
애플리케이션은 커널의 작업 여부 또는 결과값에 상관없이 본인의 작업을 완료한 이후에 종료한다.
사실 블럭킹 여부와 동기 여부는 상호 반대되는 개념이 아니다. 두 개는 기준이 다르고 의미도 전혀 다르기 때문에 상호 대응될 수 없는 개념이다. 동기는 호출자의 입장에서 바라보는 개념이고, 블럭킹은 제어권(또는 쓰레드) 관점에서 바라보는 개념이라고 할 수 있다.
Blocking : 호출에 대한 결과를 로직 수행 완료된 이후에 반환한다.
NonBlocking : 호출에 대한 결과를 로직 수행 완료 여부와 무관하게 결과를 반환한다.
Sync : 호출한 로직의 결과값을 확인한다.
ASync : 호출한 로직의 결과값은 수행한 쪽에서 콜백으로 반환한다. (호출한 쪽에서는 더 이상 신경쓰지 않는다)