Thread vs Coroutine

parkhyoungjunparkhyoungjun
2 min read

Process And Thread

일단 Thread라는 녀석이 정확히 뭔지부터 알고가자. 그러기 위해선 Process부터 알아야한다

Process

  • 보조 기억 장치의 ‘프로그램’이 메모리 상으로 적재되어 실행되면 프로세스가 된다고 한다

  • 게임하다가 강제로 끄고 싶을 때 작업 관리자 여는데 그 때 줄줄이 있는게 프로세스라고 한다

Thread

  • 동일한 Process 내에서 실행되는 여러 작업의 단위이다

    OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Process는 위와같이 Code, Data, Heap을 할당받고 그 안에서 Thread는 Stack을 할당 받는다

쓰레드는 Heap은 공유할 수 있지만, 각자의 Stack은 공유할 수 없다

한 쓰레드에서 다른 쓰레드로 전환 될 때 그거를 Context Switching이라고 하는거다

이게 발생하는 이유도 쓰레드 또한 동시성 프로그래밍을 위해 있기 때문이다. 즉, 코루틴, 쓰레드 둘 다 동시성 프로그래밍이라는 것

Thread VS Coroutine

  • Thread는 각 Task에 맞는 스택 메모리를 할당받고, OS가 여러 Task들을 동시에 수행할 때 어떤 쓰레드 작업을 먼저 수행할지, 어떻게 해야 효율적인지 스케줄링(선점 스케쥴링, Preempting Scheduling)한다

  • Coroutine경량 스레드(Lightweight Thread)라 불리우고 Task마다 쓰레드를 할당하는 것이 아니라 Object를 할당해주고, 이 Object를 자유롭게 스위칭한다

Thread

  • 작업 하나의 단위: Thread

  • 동시성 보장 수단: Context Switching

    • ThreadA가 ThreadB의 결과가 나올 때까지 기다려야 한다면, ThreadA는 Blocking

위의 그림을 보면 Thread A가 Task 1을 실행하다가 Task 2의 결과가 필요하기 때문에 Blocking되고, Thread B로 Context Switching! 그러고 Task 2가 실행되고 결과를 받으면 다시 Thread A에서 진행

Task 3, Task 4는 Thread C, Thread D로 할당이 되고, OS가 위의 쓰레드들을 스케쥴링하며 동시성을 보장한다. 별도로 할당하는 이유는 1개의 Thread는 1개의 Task만 실행 가능하기 때문!

Coroutine

  • 작업 하나하나의 단위 : Coroutine Object

    • 작업마다 Object 할당

    • Coroutine Object 도 객체이므로 Heap 적재

  • 동시성 보장 수단 : Programmer Switching (No-Context Switching)

    • 프로그래머의 코드를 통해 Switching 시점을 마음대로 정함 (OS 관여 X)

    • Suspend (Non-Blocking): Object 1이 Object 2의 결과를 기다려야 한다면, Object 1 은 Suspend 되지만, Object 1 을 수행하던 Thread는 그대로 유효하기 때문에 Object 2 도 Object 1 과 동일한 Thread 에서 실행될 수 있음

Thread와 달리 Task들을 HeapCoroutine Object 단위로 적재를 한다

그래서 Context Switching 없이 하나의 쓰레드에서 다른 Task를 실행하거나, 여러 Task를 동시에 실행 할 수도 있다

이렇기 때문에 Light-Weight Thread라고 불리운다.

하지만 Thread A와 C가 동시에 수행된다. 이러면 Thread가 다르기 때문에 Context Switching이 어쩔 수 없이 일어난다

단일 Thread에서 여러 Coroutine Object를 제어하는 것이 좋다고 한다

결론

어찌보면 Coroutine은 Thread와 완전 다른 개념이 아니라 개선된 것 같다

작업 1개마다 1개의 Thread만 할당하는 것이 아니라 작업의 단위를 Coroutine Object 단위로 축소하고, 여러개를 동시에 실행 가능한게 핵심인 것 같다

0
Subscribe to my newsletter

Read articles from parkhyoungjun directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

parkhyoungjun
parkhyoungjun