Backend

프로세스, 스레드, 코루틴, 동기, 비동기, 블로킹, 논블로킹, 동시성, 병렬성 한 판 정리

mopil 2023. 11. 18. 17:42
반응형

기술면접 단골문제로도 등장하고 매번 헷갈리는 프로세스, 스레드, 코루틴, 동기, 비동기, 블로킹, 논블로킹, 동시성, 병렬성에 대해서 한 눈에 보기 쉽도록 정리한다.

 

# 프로세스, 스레드, 코루틴

프로세스

실행 중인 프로그램

 

스레드

프로세스 내부에서 나뉘는 별도의 실행 단위

멀티스레드 : 한 프로세스 내부에서 여럿 스레드를 사용하는 것

  • 하나의 프로세스 내부에서 여러개의 스레드가 실행 될 수 있다

 

코루틴

스레드 내부에서 나뉘는 별도의 실행 단위

  • 하나의 스레드 내부에서 여러개의 코루틴이 실행 될 수 있다
  • 코루틴은 코틀린 만의 개념이 아니라 동시성 프로그래밍의 패러다임이다

 

생성 비용

프로세스 > 스레드 > 코루틴

 

현실 예시)

음식점(서버 어플리케이션 = 프로세스)을 운영하고, 저녁 피크시간때 손님(트래픽)이 몰려왔다고 가정하자

손님들에게 병목없이 음식을 대접하기 위해 종업원(프로세스 내부의 스레드, 멀티스레드)을 많이 배치한다

한 손님 당 하나의 종업원을 배치하면 병목이 해소되지만, 종업원 수는 정해져있다. (스레드 생성 제한, 스레드 풀)

그래서 종업원이 일을 효율적으로 하도록 일잘알 종업원을 채용한다. (한 스레드가 논블로킹 방식으로 여럿 일을 효율적으로 수행 = 코루틴)

 

멀티 스레드 vs 코루틴

멀티스레딩, 코루틴 모두 동시성 실현이 가능하다. 다만 코루틴은 하나의 스레드가 대기 작업(블로킹)을 수행할 때 이를 블록하지 않고 다른일을 할 수 있도록 잠시 중단(suspend)하는 기능을 활용하여 스레드의 작업 처리 효율을 증가시킨다.

 

예시) 10초걸리는 A작업을 수행하고 B 작업이 들어왔을 때

스레드 : 나 이거 10초 기다려야하니까 다른 스레드한테 B 시켜~

코루틴 : 오키 이거 10초 기다리는동안 나 할 거 없으니까 내가 B 

 

즉, 스레드가 프로세스의 작업단위를 작게 쪼갠 개념인 만큼 코루틴도 스레드를 작게 쪼갠 개념 (그래서 코틀린 코루틴 공식문서에는 코루틴을 경량 스레드라고 표현한다.)

 

# 동시성, 병렬성

동시성

동시적으로 느껴지도록 수행하는 것 (실제로는 컨텍스트 스위칭을 하면서 순차적으로 실행)

 

병렬성

멀티 코어 (CPU)로 진짜 두 테스크를 동시에 실행하는 것

 

예시) A, B일을 한다고 가정했을 때

동시성 : 한 사람이 A하다가 B로 전환 -> A -> B -> A -> B (이 전환을 굉장히 빠르게 해서 실제로 동시에 수행되는 것처럼 느껴지게 함)

 

병렬성 : 두 사람이 각각 A, B를 실행

 

멀티 프로세스, 멀티 스레드, 코루틴 모두 동시성을 실현시키기 위한 방법임

이때 생성 비용이 프로세스 > 스레드 > 코루틴이므로, 동시성을 실현하고 싶으면 비용이 가장 적은 코루틴을 활용하는게 가장 합리적인 선택

 

# 동기, 비동기

동기

작업들을 순서대로 실행

A -> B -> C 순서대로 진행하고 B는 A의 작업완료를, C는 B의 작업완료를 기다려서 순서대로 수행 됨

 

비동기

작업들을 순서 상관없이 실행

A, B, C 순서 상관없이, 완료여부 상관없이 각각 수행 후 결과를 통보(콜백)받음

 

 

# 블로킹, 논블로킹

블로킹

해당 작업이 수행될 때 까지 스레드를 블록(정지, 대기)시킴

A(10초 소요) -> (대기O) -> B

 

논블로킹

해당 작업이 수행될 때 까지 스레드를 블록시키지 않음

A(10초 소요) -> (대기X) -> B

 

 

동기랑 블로킹이랑 같은 말 아닌가?

동기/비동기는 작업의 수행 순서에 대한 개념이고

블로킹/논블로킹은 작업을 대기하냐 안 하냐에 대한 개념

반응형