# 동시성, 병렬, 비동기, 논블럭킹과 컨셉들

> Clean Markdown view of GeekNews topic #8127. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=8127](https://news.hada.io/topic?id=8127)
- GeekNews Markdown: [https://news.hada.io/topic/8127.md](https://news.hada.io/topic/8127.md)
- Type: news
- Author: [alstjr7375](https://news.hada.io/@alstjr7375)
- Published: 2022-12-28T18:06:23+09:00
- Updated: 2022-12-28T18:06:23+09:00
- Original source: [black7375.tistory.com](https://black7375.tistory.com/90)
- Points: 69
- Comments: 10

## Topic Body

간단한 용어정리부터 시작해 그래픽, 반도체까지 폭넓게 다루어보았습니다.  
1. 용어  
   - 동시성 / 병렬  
   - 비동기 / 논블로킹  
   - 선점형 / 비선점형  
2. 운영체제와 프로세서  
   - 운영체제  
   - 프로세서  
3. 코루틴과 파이버  
   - 파이버  
   - 코루틴  
4. 제네레이터, Async/Await, 컨티뉴에이션  
   - 제네레이터  
   - Async / Await  
   - 컨티뉴에이션  
5. Promise와 Future  
6. I/O 멀티플렉싱  
   - 멀티플렉싱  
   - 소켓  
   - I/O 모델들  
7. 링버퍼, 최신 I/O 모델, LMAX Distruptor  
   - 링버퍼  
   - 최신 I/O 모델  
   - LMAX Disruptor  
8. 동기화 프리미티브  
   - 필요성  
   - 스레드 안전  
   - 스핀락  
   - 뮤텍스  
   - 세마포어  
   - STM  
   - GIL  
9. 다른 스크립트 언어의 접근법과  Reactor/Proactor 패턴  
   - Ractor (루비)  
   - Node.js (Reactor 패턴)  
   - Proactor 패턴  
10. CSP와 액터  
    - CSP  
    - 액터  
11. 그린 쓰레드, 고루틴 그리고 최신 비동기 런타임 기술들  
    - 그린 쓰레드  
    - 최신 CSP 런타임  
    - 최신 액터 런타임  
12. 병렬  
    - SIMD와 파이프라이닝  
    - OpenMP & MPI  
    - 최신 병렬 기법  
    - 람다 아키텍처  
13. GPU  
    - 파이프라인과 쉐이더  
    - 모니터  
    - 버퍼링  
    - 수직동기화  
    - 프레임 페이싱과 빔 레이싱  
    - 컴포지터  
    - 그래픽  API / 라이브러리  
14. 기타 칩  
    - 개요  
    - DSP  
    - FPGA  
    - TPU  
15. 참고

## Comments



### Comment 13940

- Author: roxie
- Created: 2022-12-31T01:57:22+09:00
- Points: 1

> 동기와 비동기는 작업완료를 누가 확인하는가  
> 블로킹과 논블로킹은 제어권한이 있는가  
  
이 말을 수많은 블로그에서 똑같이 되풀이하고 있던데, 원 출처가 어딘지 궁금합니다.  
  
대부분의 블로그는 서로가 서로를 참조하기에 바빠서 원문을 짐작할 수가 없었고, 그나마 찾은 건 IBM 의 [AIO 문서](https://developer.ibm.com/articles/l-async/) 뿐인데, 이건 커널 io 에서만 한정지어서 얘기되는게 아닌가 싶어서요. 그리고 저 구분법도 그 자체로 논란이 있다고 들었습니다.  
  
공신력있는 판단 기준인지요?

### Comment 13941

- Author: alstjr7375
- Created: 2022-12-31T15:37:16+09:00
- Points: 1
- Parent comment: 13940
- Depth: 1

우선 동기/비동기는 회로쪽 기반으로 하면 될 것 같습니다.  
동기회로는 타이밍을 위해 클럭을 이용하고, 비동기는 이벤트나 다른 입력에 의해 트리거되는 방식이죠.  
즉,  비동기 API는 동일하게 콜백등에 의해 트리거되는 방식이라고 정의해도 무리는 없을 듯 합니다.  
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests  
  
블로킹/논블럭킹 API는 작업을 반드시 기다려야 하는가 여부가 정의로서 적절합니다.  
다만, 기다리지 않기 위해서 호출한 함수가 제어권을 가지는 구현이 있어야 하기 때문에 그렇게 많이 설명하는 경향이 큰 것 같네요.  
https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/  
  
간략히 넘어가고자 생략했었는데 이 내용을 추가적으로 넣어보도록 하겠습니다.

### Comment 13944

- Author: roxie
- Created: 2023-01-01T19:01:13+09:00
- Points: 1
- Parent comment: 13941
- Depth: 2

적어주신 말씀에 모두 동의합니다. 그러나 이 두 기준축을 사분면으로 한 단면에 그려야 하는가, 그릴 수 있는가, 적절하게 구분되는가에 대해선 여전히 확신을 가지기 어렵네요. 제겐 Blocking과 Sync가 개념적으로 90%의 맥락을 같이 하는 느낌입니다. Non-Blocking&Async도 마찬가지입니다.

### Comment 13945

- Author: alstjr7375
- Created: 2023-01-01T21:12:36+09:00
- Points: 2
- Parent comment: 13944
- Depth: 3

Blocking-Sync와 Non-Blocking-Async가 함께 쓰이는 경우가 많지만 구분이 필요한 경우들이 있습니다.  
- Blocking-Async: Select같은 I/O 멀티플렉싱  
- Non-Blocking-Sync: 데이터 폴링(polling)  
  
때문에 저는 오히려 구분해 사용하는게 맞다고 생각합니다.

### Comment 13953

- Author: roxie
- Created: 2023-01-02T14:09:12+09:00
- Points: 1
- Parent comment: 13945
- Depth: 4

말씀주신 예시들에 대한 이해가 거의 없어서 더 공감이 잘 안되는 것 같네요.   
  
[https://incredible-larva.tistory.com/entry/IO-Multiplexing-톺아보기-1부](https://incredible-larva.tistory.com/entry/IO-Multiplexing-%ED%86%BA%EC%95%84%EB%B3%B4%EA%B8%B0-1%EB%B6%80) 이 글에선 아래와 같이 설명하고 있습니다:   
  
> 결국 select를 요청한 user process가 return 받은 값을 보고 후속 작업 유무를 판단하는 것이다. 예측할 수 없게 인입되는 여러 I/O 요청이 한 번에 관리 되고 있기에 Asynchronous하다고 보는 경우도 있지만 결국 실제 개별 I/O 동작은 Synchronous 한 동작을 보인다는 것.  
  
이에 대해선 어떤 의견을 가지고 계신지 궁금합니다. 사실 저는 이 시점에서, 더이상 이 2x2 구분법이 무의미하다고 느껴졌습니다. 도메인마다, 관점마다 해석이 분분한 것 같아서요.

### Comment 13960

- Author: alstjr7375
- Created: 2023-01-02T22:03:20+09:00
- Points: 1
- Parent comment: 13953
- Depth: 5

> 이어서, kernel의 응답을 기다리다보면 kernel에서 결과 값이 준비되었다는 callback 신호가 오고 user process는 자신의 buffer로 데이터를 복사해오는 모습을 보여준다.  
  
이 부분이 위에서 동의하신 콜백에 의한 트리거 방식이기 때문에 굳이 구분/정의해야 한다면 Blocking-Async라고 부르는게 맞는 것 같구요.  
관점에 따라 애매하기 보이는 경우가 있을수도 있다고 생각합니다.  
  
다만, 폴링이 확실한 예제인데요,  
https://en.wikipedia.org/wiki/Polling_(computer_science)  
  
폴링의 경우 데이터가 준비되었는지를 반복적으로 확인하기 때문에 Sync-Blocking의 적절한 예제입니다.

### Comment 13916

- Author: wonkwh
- Created: 2022-12-29T13:45:38+09:00
- Points: 1

와우 좋은자료 감사합니다.

### Comment 13906

- Author: kayws426
- Created: 2022-12-29T03:35:44+09:00
- Points: 1

잘 읽었습니다!

### Comment 13905

- Author: bus710
- Created: 2022-12-28T21:04:32+09:00
- Points: 1

스크롤이 끝이 없네요 ㄷㄷ  
유사한 주제를 다루는 "7가지 동시성 모델"이란 도서가 한번쯤 읽어볼만 한 것 같습니다.

### Comment 13911

- Author: alstjr7375
- Created: 2022-12-29T11:57:26+09:00
- Points: 1
- Parent comment: 13905
- Depth: 1

목차 비교해보니 비슷하네요  
좋은책 같습니다
