Beeeam

Thread vs Coroutine 본문

Kotlin

Thread vs Coroutine

Beamjun 2023. 5. 1. 18:06

동기 vs 비동기

동기: 어떤 작업을 진행할 때 한 요청에 대한 응답이 올 때까지 기다린 후 다음 요청을 처리하는 것

비동기: 어떤 작업을 진행할 때 한 요청에 대한 응답이 올 때까지 기다리지 않고 다른 요청들을 처리하는 것

동시성 vs 병렬성

둘 다 여러 개의 작업을 처리할 때 사용하는 기법이다. 하지만 처리하는 방법이 다르다. (당연한 얘기)

 

동시성 (Concurrency)

여러 작업을 동시에 처리하는 것 처럼 보이게 하는 방법이다. 이는 시분할 기법을 활용하여 여러 작업을 조금씩 나눠서 번갈아가며 실행하는 것이다.

Context switching은 한 작업을 처리하다가 다른 작업을 처리하기 위해 변경하는 작업을 말한다.

병렬성 (Parallelism)

진짜 동시에 여러 작업을 처리하는 것이다. 이 방법에서 CPU코어는 동시성 처럼 번갈아가며 실행하는 것 없이 한 개의 작업만 처리한다.

그래서 병렬성은 CPU 코어가 여러 개인 경우에 가능하다.

 

What is Thread??

스레드를 알기 전에 먼저 프로세스부터 알아야 한다.

프로세스는 실행 중인 컴퓨터 프로그램을 의미한다. 그리고 스레드는 프로세스 내에서 수행되는 작업의 단위를 의미한다.

위의 그림은 프로세스와 스레드의 관계를 그림으로 표현한 것이다.

프로세스 내에서 스레드는 각각의 stack을 할당 받고, 각각의 스레드들은 code, data, heap 영역을 공유한다. 근데 stack은 공유하지 않는다.

스레드와 스택은 1:1 관계이다. (1 스레드 → 1 스택)

 

Thread vs Coroutine

스레드와 코루틴 둘 다 ‘동시성’을 구현하기 위한 방법이다.

스레드는 여러 작업을 동시에 수행해야 하는 경우 os가 스케쥴링을 통해서 어떤 작업을 먼저 할 지 정한다. 하지만 코루틴은 작업에 object를 할당하여 이 object들을 자유롭게 switching 하여 context switching 비용을 줄인다.

Thread

동시성 보장 수단: Context Switching

os를 통해서 context switching을 하여 동시성을 보장한다.

만약 스레드 A가 스레드 B의 결과가 나올 때까지 기다려야 한다면 스레드 A는 스레드 B의 결과가 나올 때까지 블로킹이 되어 해당 자원을 사용하지 못한다.

Coroutine

동시성 보장 수단: Programmer Switching

os가 아닌 개발자의 코드를 통해서 Switching 시점을 마음대로 정한다.

만약 object A가 object B의 결과가 나올 때까지 기다려야 한다면 object A는 suspend 되지만 object A를 실행하던 스레드는 사용될 수 있기 때문에(스레드가 블로킹 되지 않기 때문) object B도 object A가 실행되던 스레드에서 실행될 수 있다.

즉 코루틴은 스레드를 잘게 쪼개서 사용하는 개념이다.

하나의 스레드가 여러 코루틴을 다룰 수 있기 때문에 각각의 작업을 스레드에 할당하면서 생기던 메모리 낭비를 없애고, context switching 비용을 절감할 수 있다.

코루틴도 다중 스레드인데 스레드보다 성능이 좋은 이유

코루틴은 스레드와 달리 작업의 단위를 object로 줄여서 한 스레드에서 많은 코루틴을 다룰 수 있게 한다. 그리고 쉽게 예외 처리를 할 수 있게 하고, 블로킹 방식이 아닌 일시 중단하는 방식을 사용하여 비동기적 요청을 처리하기 때문에 성능이 더 뛰어나다.