기타 개발

Sync vs Async / Blocking vs Non-blocking

Junheehee 2022. 6. 15. 20:56

sync(동기)와 async(비동기)에 대하여 공부를 하다 보니 항상 따라오는게 있었다.

바로 blocking과 non-blocking이었다.

이 sync와 blocking, async와 non-blocking은 의미와 상황이 자주 혼동되지만 서로 다른 개념이다.

 

 

-Sync, Async

sync(동기)와 async(비동기)는 시간의 관점, 실행되는 함수의 관점에서 봐야한다.

동기는 말 그대로 동시에 일어나는 것이다. 하나가 끝나면 다른 하나가 동시에 시작된다.

즉 sync는 호출한 함수가 호출된 함수의 종류를 신경쓰는 것이다.

반면에 async는 호출된 함수가 끝나든 말든 신경쓰지 않는 것이다.

보통 async는 호출된 함수가 끝나면 callback을 통해 결과값을 처리한다.

 

 

- Blocking, Non-blocking

blocking과 non-blocking은 제어권, 함수를 처리하는 주체의 관점에서 봐야한다.

blocking은 단어 뜻 그대로 무언가 막힌 상태이다.

함수를 호출하면서 제어권이 넘어가고, 호출된 함수가 할 일을 다할 때까지 제어권을 주지 않아 멈춰있는 것이 blocking이다.

반면에 non-blocking은 호출된 함수가 할 일을 다 끝내지 않더라도 바로 제어권을 리턴하여 호출한 함수가 다른 일을 하는 것이다.

 

 

- AIO

상황이 비슷해 보였던 sync와 blocking, async와 non-blocking은 다른 개념인 것을 알 수 있었다.

그리고 이 두가지 개념을 크로스오버하면 4가지 상황을 만들 수 있다.

 

아래는 2006년도 당시 IBM에서 새로운 Linux 커널의 IO 모델을 설명한 글에 나온 그림이다.

IBM은 IO 모델을 syn와 async, blocking과 non-blocking을 각각 교차해서 설명했다.

이 글을 인용해서 4가지 상황을 하나씩 살펴보자.

 

2006 IBM Linux I/O 모델

 

 

- Sync & Blocking

Sync & Blocking

가장 기본적인 모델이다.

이 모델은 blocking이기 때문에 어플리케이션에서 시스템호출을 하면 제어권이 커널로 넘어가고 어플리케이션은 멈춰서 기다린다.

커널에서 작업이 끝나면 어플리케이션으로 응답한다.

sync여서 호출이 끝나기를 기다리던 어플리케이션은 응답을 받아 작업을 이어서 한다.

 

 

- Sync & Non-blocking

Sync & Non-blocking

이 모델은 non-blocking이기 때문에 시스템 호출시 제어권이 바로 어플리케이션에게 넘어온다.

하지만 sync이기 때문에 어플리케이션은 호출한 함수의 결과를 기다려야하므로, 다른 작업을 하는게 아니라 작업이 끝났는지 확인하기 위해 다시 호출을 한다.

이를 반복하다 커널에서 작업이 끝나면 그제서야 어플리케이션은 응답을 받고 하던 작업을 이어서 한다.

 

 

- Async & Blocking

Async & Blocking

이 모델은 척봐도 비효율적인 것 같다.

어플리케이션에서 시스템 호출시 blocking이어서 제어권이 넘어간다.

async여서 결과를 기다릴 필요가 없지만 제어권이 없기 때문에 자연스럽게 기다리게 된다.

 

 

- Async & Non-blocking

Async & Non-blocking

non-blocking이기 때문에 호출한 이후 제어권이 바로 어플리케이션으로 넘어온다.

그리고 async이기 때문에 어플리케이션은 커널을 기다리지 않고 다른 작업을 시작한다.

다른 작업을 하고 있다 커널에서 응답(콜백함수)이 오면 결과를 처리한다.

 

 

I/O뿐만 아니라 시간이 오래 걸리는 작업을 sync & blocking 으로 처리했다가는 굉장히 비효율적일 수 있다.

그래서 IBM이 2006년 당시 async & non-blocking I/O모델을 권장했었고 이는 많은 성능을 개선할 수 있다.

하지만 async & non-blocking을 사용할 때는 순서가 보장되지 않아 주의가 필요하다.

 

출처: https://developer.ibm.com/articles/l-async/

'기타 개발' 카테고리의 다른 글

C++ 개발 환경 세팅  (0) 2022.08.07
REST API  (2) 2022.05.25
웹소켓(Web Socket)  (4) 2022.05.18
쿠키, 세션과 JWT  (0) 2022.05.07
1. 인터넷은 무엇일까  (1) 2021.11.10