Synchronous/Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경쓰냐가 관심사다.
Non-blocking은 크게 보았을 때, 두 가지 의미
- Non-blocking algorithm(Non-blocking synchronization): 다른 쓰레드에게 영향을 끼치지 않도록 만드는 방법들
- 특정 공유 자원을 사용하는 부분(메모리, 파일 등)에서 뮤텍스나 세마포어 - 전통적 방법
- Non-blocking algorithm(Wait-freedom, Lock-freedom - 고급 언어 방법
- Non-blocking I/O(Asynchronous I/O 혹은 Non-sequential I/O)
- synchronous I/O 혹은 blocking I/O를 통해 I/O 작업을 진행하는 동안 프로그램의 진행을 멈추고(block) 기다리는 방식이 사용되었으나
- Non-blocking 외부에 I/O 작업을 하도록 요청한 후 즉시 다음 작업을 처리
Non-blocking I/O란, 입출력 처리를 기다리는 방법을 말한다
후속 작업이 프로세스를 멈추지 않도록 만들기 위해, I/O 작업이 완료된 이후 후속 작업을 이어서 진행할 수 있도록 별도의 약속(Polling, Callback function 등)을 한다.
물흐르듯 간다 이말씀
- Concurrency란 각 프로그램 조각들이 실행 순서와 무관하게 동작할 수 있도록 만들어 한 번에 여러 개의 작업을 처리할 수 있도록 만든 구조이다.
- Parallelism작업자를 물리적으로 여럿 둠으로써 같은 작업을 동시에 수행할 수 있도록 만드는 것이다.
Concurrency와 Parallelism은 혼동하기 쉬운 개념이지만, 서로 의존관계가 없이 분리되어 있는 개념이다.
Parallelism은 한 개의 프로세서에서는 확보할 수 없는 개념이다. 한 개의 프로세서가 같은 시간에 두 개의 작업을 수행하는 것은 물리적으로 불가능하기 때문이다.
한 개의 프로세서만 있다고 하더라도 동시성을 확보할 수 있다. 잘개 쪼갠 작업들이 서로 영향을 끼치지 않는다면, 하나의 작업자가 각 작업이 완료되지 않았더라도 번갈아가며 수행하는 것이 가능하다.
Concurrency는 작업을 처리하는 방식을 개선함으로써 효율화를 가져오는 것이 목적이며
Parallelism은 자원 자체를 늘림으로써 작업의 처리량을 늘리는 것이 목적이다.
I/O 작업을 멈추지 않고 기다리는 방식을 구체적으로 분류하면 Synchronous Non-blocking I/O와 Asynchronous blocking I/O 등으로 구분할 수 있기 때문에 이를 비교해보는 것은 의미가 있다.
Asynchronous Programming을 위한 재료로써 Concurrency를 확보하거나 혹은 Non-blocking I/O를 활용할 수 있으나, 이것이 Asynchronous Programming의 필수조건은 아니다.
예를 들어 Event-loop를 사용하여 동시성을 확보했으나, I/O 작업의 성격에 따라 그 처리를 위해 blocking I/O 모델을 사용할 수 있다. Blocking I/O를 사용했어도 이 부분이 별도의 채널을 통한 작업으로 이루어짐으로써 이 프로그램의 주 실행흐름(event-loop)을 막지 않았다면, 이 프로그램은 Asynchronous Programming이라고 부를 수 있다.
스레딩은 block, sync 아니면 다 쓸수 있는 내부적 구현법
Blocking-NonBlocking-Synchronous-Asynchronous
꽤 자주 접하는 용어다. 특히나 요즘들어 더 자주 접하게 되는데, 얼추 알고는 있고 알고 있는게 틀린 것도 아니지만, 막상 명확하게 구분해서 설명하라면 또 만만치가 않은.. 그래서 찾아보면 또 대충 뭔 소린지 알아들을 것 같다가도, 구분해서 설명하라면 머뭇거리게 되긴 마찬가지다. 자료마다 미세하나마 조금씩 차이가 있는 것들도 많아서, 정확하고 유일한 구분법
https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

Blocking/NonBlocking은 호출되는 함수가 바로 리턴하느냐 마느냐가 관심사
멈추지 않고 기다리기(Non-blocking)와 비동기(Asynchronous) 그리고 동시성(Concurrency)
코딩을 하며, 내가 만든 프로그램이 자원을 어떻게 더 효율적으로 사용하도록 만들 것인지, 어떻게하면 더 문제없는 프로그램을 만들 수 있는지는 항상 고민이 된다. 이에 대한 해결책 중 중요한 부분을 차지하고 있는 것이 비동기 프로그래밍이라는 패러다임이다. 그러나 '비동기'라는 단어를 둘러싸고 있는 비슷한, 혹은 반대편에 있는 여러 용어와 개념들은 항상 머릿속을 헷갈리게 만든다.
https://tech.peoplefund.co.kr/2017/08/02/non-blocking-asynchronous-concurrency.html

Good Explaination
백엔드 개발자들이 알아야할 동시성 2 — 블로킹과 논블로킹, 동기와 비동기
이번 포스팅에서는, 본격적인 이야기에 앞서 알아야할 두가지 개념에 대해서 더 알아보려고 합니다. 많은분들이 들어보셨을만한 블로킹과 논블로킹, 동기와 비동기의 개념에 대해서 이야기 해보겠습니다.
https://choi-geonu.medium.com/백엔드-개발자들이-알아야할-동시성-2-블로킹과-논블로킹-동기와-비동기-e11b3d01fdf8



Seonglae Cho