티스토리 뷰

개발계발/Study

Sync와 Async, 그리고 Blocking과 Non-Blocking

개발계발 주인장 2023. 6. 30. 17:26

우리가 기본적으로 접하는 동기, 비동기 개념은 관점에 따라 설명을 달리 할 수 있다. 여기서 살펴볼 관점은 함수의 제어권과 반환된 결과에 따른 처리이다. 관점에 따라 아래의 도표와 같이 sync/async, blocking/non-blocking으로 나누어 진다.

설명에 앞서, A 함수가 B 함수를 호출한다고 가정하자. 가령 이런 것이다.

def A():
	...
	B()
	...

def B():
	...

blocking/non-blocking

blocking과 non-blocking을 나누는 기준은 제어권을 언제 반납하느냐 하는 것이다. 여기서 제어권이란 함수의 실행 흐름을 제어하는 것으로, 쉽게 말해 제어권이 있어야 함수 내 코드를 계속 실행할 수 있다.

blocking 방식은 A 함수가 B 함수 호출 시에 제어권을 넘겨주면, B함수는 자신의 코드를 다 실행한 후에 결과값과 함께 제어권을 반납한다. 이 때 A 함수는 제어권을 넘겨 받을 때까지 다른 일을 하지 않고 대기하는 것이다.

non-blocking 방식은 B 함수 호출 후 제어권을 바로 돌려받는다. 제어권을 돌려받은 A함수는 대기하지 않고 다른 작업을 이어가게 된다.

sync/async

sync, asnyc는 반환되는 결과를 누가 처리하느냐 하는 것이다. 종료된 함수의 결과를 호출한 함수가 처리하면 sync, 스스로 처리하면(callback) async이다.

sync/async + blocking/non-blocking

우리가 소위 말하는 동기는 sync+blocking 개념이고, 비동기는 async+non-blocking 개념이다. 다시 말해 동기는 호출한 함수가 제어권을 돌려줄 때까지 다른 작업을 하지 않고 대기하며(blocking), 반환되는 결과를 호출한 함수가 처리(sync)한다. 비동기는 호출한 함수의 제어권을 돌려받아 함수가 실행되는 동안 다른 일을 처리할 수 있으며(non-blocking) 반환되는 결과는 callback으로 처리(async)한다.

 

그렇다면 나머지 sync+non-blocking과 async+blocking 조합은 무엇일까?

sync+non-blocking은 제어권을 돌려받아 다른 작업을 할 수 있음에도 호출한 함수의 완료 여부를 계속해서 확인하는 경우이다. polling같은 방식이다.

async+blocking은 호출된 함수의 결과에는 관심이 없지만 제어권이 없기 때문에 작업이 완료될 때까지 대기하는 경우이다. 호출된 함수의 작업이 끝나 callback이 호출된 이후에야 대기하고 있던 함수는 다음 작업을 수행할 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함