프로세스, 스레드, 코루틴, 동기, 비동기, 블로킹, 논블로킹, 동시성, 병렬성 한 판 정리
기술면접 단골문제로도 등장하고 매번 헷갈리는 프로세스, 스레드, 코루틴, 동기, 비동기, 블로킹, 논블로킹, 동시성, 병렬성에 대해서 한 눈에 보기 쉽도록 정리한다.
# 프로세스, 스레드, 코루틴
프로세스
실행 중인 프로그램
스레드
프로세스 내부에서 나뉘는 별도의 실행 단위
멀티스레드 : 한 프로세스 내부에서 여럿 스레드를 사용하는 것
- 하나의 프로세스 내부에서 여러개의 스레드가 실행 될 수 있다
코루틴
스레드 내부에서 나뉘는 별도의 실행 단위
- 하나의 스레드 내부에서 여러개의 코루틴이 실행 될 수 있다
- 코루틴은 코틀린 만의 개념이 아니라 동시성 프로그래밍의 패러다임이다
생성 비용
프로세스 > 스레드 > 코루틴
현실 예시)
음식점(서버 어플리케이션 = 프로세스)을 운영하고, 저녁 피크시간때 손님(트래픽)이 몰려왔다고 가정하자
손님들에게 병목없이 음식을 대접하기 위해 종업원(프로세스 내부의 스레드, 멀티스레드)을 많이 배치한다
한 손님 당 하나의 종업원을 배치하면 병목이 해소되지만, 종업원 수는 정해져있다. (스레드 생성 제한, 스레드 풀)
그래서 종업원이 일을 효율적으로 하도록 일잘알 종업원을 채용한다. (한 스레드가 논블로킹 방식으로 여럿 일을 효율적으로 수행 = 코루틴)
멀티 스레드 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
동기랑 블로킹이랑 같은 말 아닌가?
동기/비동기는 작업의 수행 순서에 대한 개념이고
블로킹/논블로킹은 작업을 대기하냐 안 하냐에 대한 개념