CS

Blocking/Non-Blocking(블로킹/논블로킹), Sync/Async(동기/비동기), Concurrent/Parallel(동시/병렬)

bokshiri 2024. 10. 11. 17:23

이번 글의 목표는 Blocking/Non-Blocking(블로킹/논블로킹), Sync/Async(동기/비동기), 그리고 Sync/Async를 이해하는 데 필요한 Concurrent/Parallel(동시/병렬) 이 세 가지를 이해하는 것이다.

Sync/Async는 자바스크립트에서 비동기 통신을 사용하며 자주 접하였던 내용이다. 하지만 Blocking/Non-Blocking은 Webflux 관련 자료를 찾는 과정에서 처음 알게되었다. Webflux는 Async, Non-Blocking을 사용한다고 하는데, Blocking과 Non-Blocking의 개념을 모르니 이해를 하는 데 어려움이 있었다. 처음에는 단순히 Sync == Blocking, Async == Non-Blocking 으로 이해했지만 이는 잘못된 것이며, 두 가지의 개념은 결합하여 논의되어야만 한다. 두 가지 개념을 종합하여 살펴보자.


Blocking / Non-Blocking & Sync / Async Image

망나니 개발자님이 Github에 정리해주신 게시물 에 실려 있는 이미지다. 원본 출처는 HomoEfficio님의 게시물 이다.

사실 이미지만 봐서는 도대체 무슨 의미인지 잘 모르겠다. Sync-Blocking의 경우에는 동기 처리이니 호출 후 처리가 완료될 때까지 대기하였다가 이후의 처리를 이어서 진행하는 것 같은데, Async-Blocking 부터는 비동기와 블로킹이 도무지 연결이 되지 않는다. 먼저 각 단어의 개념 정리가 필요할 것 같다.

 

Blocking / Non-Blocking (블로킹 / 논블로킹)

Blocking과 Non-Blocking은 함수 실행에 관한 제어권을 누가 갖느냐를 기준으로 나누어진다.

# 임의의 함수 A와 B가 존재한다.
# 함수 A는 내부 로직안에서 함수 B를 호출한다.

Blocking: 함수 A로부터 호출받은 함수 B가 제어권을 갖는다. 함수 A는 함수 B가 모든 동작을 완료하여 제어권을 넘겨주면, 남은 작업을 이어서 진행한다.
Non-Blocking: 함수 A는 함수 B를 호출하지만, 함수 B는 제어권을 A에게 넘겨준다. 함수 B가 수행되는 동안에도 함수 A는 자신의 작업을 이어서 진행한다.

 

Sync / Async (동기 / 비동기)

Sync와 Async는 동시에 수행되는 두 함수의 동시성과 연관이 있다. 호출하는 함수가 호출되는 함수의 동작을 관찰하고 확인하는지 여부에 따라 동기와 비동기로 나뉘게 된다.

# 임의의 함수 A와 B가 존재한다.
# 함수 A는 내부 로직안에서 함수 B를 호출한다.

Synchronous: 호출하는 함수 A는 호출되는 함수 B의 수행 과정 또는 결과에 관심을 가지고 상태를 확인한다.
Asynchronous: 호출하는 함수 A는 호출되는 함수 B의 작업에 관심을 갖지 않는다. B는 자신의 작업을 진행한다.

Sync는 호출된 함수에서 응답이 오면 호출한 함수가 해당 값을 받아 다음 작업을 진행하며,

Async는 호출한 함수가 Callback을 전달하여 호출된 함수가 종료된 후 이 Callback 함수를 수행할 수 있도록 한다. 호출한 함수는 호출된 함수의 동작 및 결과에 관심을 갖지 않기 때문에, 함수 호출 후에도 계속해서 자신의 작업을 이어갈 수 있다.

 

Concurrency / Parallelism (동시성 / 병렬성)

Concurrency(동시성)이란 싱글코어 CPU 환경에서 멀티 스레드를 동작시켜 동시에 실행되는 것처럼 보이는 것을 의미한다. 이것은 CPU의 Context Switch를 통해 수행된다.

자바스크립트 비동기 통신의 동작과 유사한 원리이다. 싱글 스레드이므로 멀티 스레딩이 불가능하나, 내부적인 메모리 관리를 통해 마치 두 가지 작업이 동시에 수행되는 것처럼 보이는 것이다.

병렬성(Parallelism)이란 멀티코어 CPU 환경에서 멀티 스레드를 동작시켜 실제로 여러 작업이 동시에 이루어지는 것을 의미한다.

 

Context-Switch란?

-> 동시에 실행 가능한 프로세스의 수는 CPU의 Core 개수에 비례한다. CPU는 Scheduling을 통해 작업에 자원을 할당하게 되는데 이 때 실행중인 Context를 중지하고 다른 Context에 자원을 할당하여 실행하는 것을 의미한다.

- 프로세서(CPU)가 실행중인 프로세스 A를 중지시키고 프로세스 B를 실행하는 것을 Process Context Switching 이라고 한다.

- 한 개의 프로세스 내에서 멀티 스레드 환경을 구성한 경우 스레드 A의 작업을 중지시키고 스레드 B를 실행하는 것을 Thread Context Switching 이라고 한다.

 

정리

Sync / Blocking, Async / Non-Blocking은 수행 결과를 기준으로 이야기하면 동일한 의미로 보아도 될 것 같다. 하지만 개념적, 의미론적으로는 차이를 가진다.

Sync / Async : 두 함수가 존재할 때, 호출되는 함수의 진행 상태 또는 결과를 관찰 및 체크하는지 여부

Blocking / Non-Blocking : 두 함수가 존재할 때, 제어권을 누가 가지고 있는가

 

바라보는 관점의 차이로 인해 의미론적으로 구분된 것이지, 수행 과정 및 결과는 동일하다 정도로 정리할 수 있겠다.

 

Reference

https://github.com/MangKyu/tech-interview-for-developer/blob/master/Computer%20Science/Network/%5BNetwork%5D%20Blocking%2CNon-blocking%20%26%20Synchronous%2CAsynchronous.md

 

tech-interview-for-developer/Computer Science/Network/[Network] Blocking,Non-blocking & Synchronous,Asynchronous.md at master ·

👶🏻 신입 개발자 전공 지식 & 기술 면접 백과사전 📖. Contribute to MangKyu/tech-interview-for-developer development by creating an account on GitHub.

github.com

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

 

Blocking-NonBlocking-Synchronous-Asynchronous

꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면

homoefficio.github.io

https://velog.io/@dyllis/%EB%8F%99%EC%8B%9C%EC%84%B1%EC%9D%B4-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

 

동시성이 무엇일까

소개 이 글을 작성하게 된 이유는 사전면접이나 기술면접에서 항상 등장하는 프로세스와 스레드 차이, 동시성에 대해서 설명해주세요라고 했을 때 제대로 설명하지 못하는 나의 모습을 보고 정

velog.io

https://velog.io/@curiosity806/Context-Switching%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-process%EC%99%80-thread

 

Context Switching 이란?

Processor가 수행하고 있는 Task(Process, Thread)의 context를 저장하고 다음 진행할 Task의 context를 읽어 수행하는 과정을 Context Switching이라고 부른다. 자세히 알아보자.

velog.io

 

'CS' 카테고리의 다른 글

[AMQP] RabbitMQ와 DLX/DLQ  (0) 2025.03.24