🌟 Coroutine 이해하기
헷갈릴 수 있는 concepts
https://velog.io/@raejoonee/프로세스와-스레드의-차이
https://jeonghwan-kim.github.io/2016/12/15/coroutine.html
Process & Thread
process는 Heap을 사용하며, thread는 process안에서 stack을 사용한다.

Concurrency & Parallelism
동시성과 병렬성의 개념을 명확히!
Concurrency ( 동시성 )
interleaving, 다수의 task들에 대해서 각각을 쪼개어서 조금씩 빠르게 실행하여
전체로 보았을때는 동시에 실행되고 있는 것처럼 보이도록 실행하는 것.

Parallelism ( 병렬성 )
parallelizing, 다수의 task들이 한번에 수행되는 것

Thread & Coroutine
두 개념 모두 Concurrency를 보장하기 위한 기술이다.
Thread - Thread의 효율성은 OS의 몫이다.
-
task의 단위 = Thread
- 다수의 작업 각각에 Thread를 할당함 .
- task는 stack 영역을 차지함.
-
OS level에서의 작업이 빈번함
- thread 하나가 task 하나를 담당하고 있기 때문에, task를 어떻게 쪼갤지(thread를 어떻게 쪼개서 사용할지)를 OS level에서 정해줘야한다, Preempting Scheduling.
- thread를 이동하며 concurrency를 성취하기 때문에, OS kernel을 이용한 Context Switching이 자주 발생한다.
-
Blocking 발생시, thread자체의 block을 의미함.
하나의 task를 blocking하고 다른 task가 수행되기까지 기다려야한다는 것은,
하나의 thread의 사용을 중지하고 새로운 thread를 운영하는 것과 같은 의미이다.

Coroutine - Coroutine의 효율성은 프로그래머의 몫이다.
- task의 단위 = Object
- 다수의 작업 각각에 Object를 할당함.
- task는 heap의 영역을 차지함
- OS level에서의 작업은 선택사항
- thread는 heap영역의 Object를 처리하는 도구라고 보며, task를 어떻게 쪼갤지는 programmer가 정하면 된다.
- 서로 다른 object(task)가 단일 thread에서 수행된다면, concurrency 성취를 위한 task전환은 단일 thread에서 벌어지기 때문에, context switching은 발생하지 않는다.
Coroutine, Thread 와의 차이와 그 특징
코루틴 개념 이해하기
c
const {spawnSync} = require('child_process');
JS에서의 Coroutine
https://brunch.co.kr/@kd4/155
☄️ JS-coroutine에 관하여,
3가지 핵심 Functionality
Process in parallel
보통, huge process들을 처리하기 위해서 worker thread가 사용된다. worker thread를 이용해서 데이터가 이동하는 것은 결함을 야기할 수 있다.
js-coroutine의 context switching 대안책
Collaborative multitasking를 통해 main thread를 sharing한다. (coroutine 개념, thread쪼개기)
- async 함수 안에서 js-coroutines의 모듈을 이용해서 사용가능하다
- js-coroutines는 해당 코드를 main thread의 idle time(CPU가 쉬는 시간)에 처리한다.
- 해당 작업을 제외한 나머지를 다 분배하고 난 후 남은 시간에 huge process를 실행한다.
⇒ Coroutine에 우선 순위를 두는 것! huge process는 후순위가 됨
⇒ Context switching은 일어나지 않음! main Thread만 사용
Imperative Animation (명령형 animation)