Nonblocking


**Synchronous/Asynchronous는 호출되는 함수의 작업 완료 여부를 누가 신경쓰냐가 관심사다.**
Non-blocking은 크게 보았을 때, 두 가지 의미
- Non-blocking algorithm(Non-blocking synchronization): 다른 쓰레드에게 영향을 끼치지 않도록 만드는 방법들
> - [특정 공유 자원을 사용하는 부분](https://en.wikipedia.org/wiki/Critical_section)(메모리, 파일 등)에서 [뮤텍스](https://en.wikipedia.org/wiki/Mutual_exclusion)나 [세마포어](https://en.wikipedia.org/wiki/Semaphore_(programming)) - 전통적 방법
> - Non-blocking algorithm([Wait-freedom](https://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom), [Lock-freedom](https://en.wikipedia.org/wiki/Non-blocking_algorithm#Lock-freedom) - 고급 언어 방법

- Non-blocking I/O(Asynchronous I/O 혹은 Non-sequential I/O)
> Non-blocking I/O란, 입출력 처리를 기다리는 방법을 말한다
> - synchronous I/O 혹은 blocking I/O를 통해 I/O 작업을 진행하는 동안 프로그램의 진행을 멈추고(block) 기다리는 방식이 사용되었으나
> - Non-blocking 외부에 I/O 작업을 하도록 요청한 후 즉시 다음 작업을 처리
>> 후속 작업이 프로세스를 멈추지 않도록 만들기 위해, I/O 작업이 완료된 이후 후속 작업을 이어서 진행할 수 있도록 별도의 약속([Polling](https://en.wikipedia.org/wiki/Asynchronous_I/O#Polling), [Callback function](https://en.wikipedia.org/wiki/Asynchronous_I/O#Callback_functions) 등)을 한다.

물흐르듯 간다 이말씀
- 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)





