[운영체제/OS] Blocking / NonBlocking, Sync / Async

kindof

·

2021. 12. 2. 20:54

0. 들어가면서

이번 포스팅에서는 Blocking/Non-Blocking(블록킹, 논블록킹)과 Sync/Async(동기, 비동기) 개념에 대해 정리해보고, 각각의 개념이 어떻게 쓰이는지를 정리해보려고 합니다.

아래 두 영상에서 이 개념들을 정말 잘 설명해주신 것 같아서 해당 영상을 참고해서 정리했습니다. 꼭 한 번 시청해보세요!

 

멍토의 Blocking vs Non-Blocking, Sync vs Async
우의 Block vs Non-Block & Sync vs Async

 

1. Blocking, Non-Blocking, Sync, Async

먼저 Blocking, Non-Blocking, Sync, Async 네 가지 개념에 대해 이해해보겠습니다.

Blocking: 다른 작업을 하는동안 자신의 작업에 대한 제어권이 없는 상태로, 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 방식을 말합니다.

아래와 같이 직원이 상사에게 서류를 제출하고, 상사가 서류를 다 읽을 때까지 자리에서 기다리는 상황으로 비유해볼 수 있습니다.

 

Blocking



Non-Blocking: 다른 주체의 작업에 관련없이 자신의 작업을 할 수 있는 상태, 즉 제어권을 위임하지 않는 방식을 말합니다. 비슷한 예시로 Non-Blocking은 직원이 상사에게 서류를 제출했지만, 상사가 서류를 다 읽어볼 동안 자리에 가서 자신의 일을 처리하는 상황으로 비유해볼 수 있습니다.

Non-Blocking

즉, Blocking과 Non-Blocking의 차이는 다른 주체가 작업할 때 자신에게 자신의 작업에 대한 제어권이 있는지 없는지로 볼 수 있습니다.


다음으로 Sync / Async에 대해 살펴보겠습니다.

Synchronous(동기): 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미합니다. 마찬가지로 아래 그림을 통해 Synchronous를 비유해보겠습니다.

Synchronous

Synchronous은 Blocking/Non-Blocking의 개념이 아니기 때문에 상사가 서류를 읽는동안 직원이 기다리든, 다른 일은 하든 아무런 상관이 없습니다. 단, 상사가 서류를 다 읽고 결과를 리턴해주면 직원은 바로 그 결과에 관심을 갖게 됩니다.


Asynchronous(비동기): 시작, 종료가 일치하지 않으며 끝나는 동시에 시작을 하지 않음을 의미합니다.

Asynchronous

위 그림처럼 Asynchronous에서는 상사가 리턴한 결과를 바로 처리할지, 나중에 처리할지를 결정할 수 있습니다. 결과가 자신의 작업을 결정짓는 것이 아닌 것이죠.

즉, Sync/Async의 차이점은 결과를 돌려주었을 때 순서와 결과에 관심이 있는지 없는지로 판단할 수 있는 것이죠. Sync는 결과에 관심이 있는 것이고, Async는 그 결과에 크게 관심이 없는 것입니다.


2. Blocking/Non-Blocking, Sync/Async의 조합

지금까지 설명한 내용을 살펴보면, Blocking/Non-Blocking과 Sync/Async 독립적인 개념임을 알 수 있습니다. 따라서 아래 표와 같이 Blocking/Non-Blocking, Sync/Async의 구분에 따라 네 가지 조합을 생각해볼 수 있게 되는데요. 이 각각의 조합에 대해 두 개념(블록킹과 동기)을 같이 고려해서 살펴보겠습니다.



2-1. Blocking / Sync

Blocking의 관점은 제어권에 있고, 다른 작업이 진행되는동안 자신의 작업을 처리하지 않습니다. 그리고 Sync의 관점은 결과의 처리에 있고, 다른 작업의 결과물을 바로 처리하는 것입니다.

이를 바탕으로 생각해볼 때, 아래 예시는 Blocking / Sync 작업을 보여주는데요.

Blocking/Sync 예시

Scanner를 통해 입력을 받는동안은 제어권이 넘어갔기 때문에 Blocking이고, 그 결과를 리턴받아서 다음의 작업을 바로 처리하고 있기 때문에 Sync 개념이라고 볼 수 있는 것입니다.

2-2. Non-Blocking / Sync

Non-Blocking은 다른 작업이 있어도 자신의 작업을 처리하는 개념이었고, Sync는 그 결과를 리턴받았을 때 바로 그 결과에 집중하는 개념이었습니다.

device = IO.open()
ready = False 
while not ready: 
    print("There is no data to read!") # 다른 작업을 처리할 수 있음 
    
    # while 문 내부의 다른 작업을 다 처리하면 데이터가 도착했는지 확인한다. 
    ready = IO.poll(device, IO.INPUT, 5) 
data = device.read() 
print(data) 

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

위와 같은 코드를 보면 while문 안에서 자신의 작업을 처리하면서, 결과가 리턴됐을 때는 while문을 빠져나가 device에서 값을 읽는 것을 볼 수 있습니다.

2-3. Blocking / Async

Blocking은 다른 작업이 진행되는동안 자신의 작업을 처리하지 않습니다. 그리고 Async는 결과를 바로 처리하지 않아도 되죠.

그런데 이 상황을 잘 생각해보면 아이러니한 부분이 있습니다. 예를 들어 직원이 상사에게 서류를 제출하고 그 서류 검토의 결과가 어찌됐든 자신은 그 결과를 바로 처리하지 않아도 되는데도 불구하고, 그 앞에서 결과가 나올 때까지 기다려야 하는 것이죠.

2-4. Non-Blocking / Async

Non-Blocking은 다른 작업이 진행되는 동안에도 자신의 작업을 처리합니다. 그리고 Async이기 때문에 다른 작업의 결과 역시도 바로 처리하지 않아도 되죠.

대표적인 예시로 자바스크립트에서 API 요청을 하고, 다른 작업을 하다가 콜백을 통해 추가적인 작업을 처리할 때 사용하는 것을 들 수 있습니다.

fetch('url', option) .then((response) => { 
    return response.json(); 
}) 
.then((data) => {
    doSomething(data); 
});

 

3. 정리

지금까지 Blocking / Non-Blocking, Sync / Async의 개념에 대해 설명을 했는데, 마지막으로 정리해보겠습니다.

Blocking/Sync 방식은 애플리케이션에서 커널로 작업을 요청하고, 작업이 끝날 때까지 기다린 다음 그 결과를 확인하고 이후 로직을 수행합니다. 대표적으로 Spring MVC 프레임워크가 이러한 Blocking / Sync 방식으로 동작합니다.

Blocking/Async 방식은 애플리케이션에서 커널로 작업을 요청하고, 커널은 자신의 작업을 수행하다가 중간에 애플리케이션에 제어권을 또 넘겨줍니다. 그리고 애플리케이션은 중간에 커널에 작업권을 다시 넘겨주는 식으로 서로 제어권을 위임하며 작업을 위임합니다. 자바 소켓 프로그래밍에서 매번 소켓의 데이터가 전달되었는지를 체크하며 다른 로직을 수행하는 케이스로 볼 수 있습니다.

Non-Blocking/Sync 방식은 애플리케이션에서 커널로 작업을 요청하고, 자신의 작업을 수행합니다. 그리고 커널의 작업이 완료되면 결과값을 받아서 나머지 로직을 수행합니다. 자바에서 Future 인스턴스는 호출 여부에 대한 결과만 보유하고 있고 결과값에 대한 여부는 확인하지 않습니다. 그러므로 Future를 사용하여 필요한 외부 로직을 요청하고 내부에선 다른 로직을 수행하다가 어느 정도 작업이 마무리되면 외부에 호출된 결과값을 확인하여 기다리다 나머지 로직을 수행할 수 있습니다.

Non-Blocking/Async 방식은 애플리케이션에서 커널로 작업을 요청하고, 자신의 작업을 수행합니다. 그리고 커널의 작업 여부나 결과에 상관없이 자신의 작업을 진행합니다. 자바스크립트나 Node.js가 위와 같은 방식으로 동작합니다.


Blocking, NonBlocking, Sync, Async는 여러 동영상을 참고하고 구글링을 해보았는데도 완벽히 이해하는 것이 좀 어려운 것 같습니다.

그래도 각 개념 자체가 무엇을 의미하는지 생각해보고 조금씩 궁금한 부분을 찾아보면서 공부해야겠습니다.

감사합니다.