컴퓨터에서 프로그램을 실행하면 프로그램은 OS로부터 실행에 필요한 메모리를 할당받아 프로세스(process)가 됨.
프로세스가 가진 자원(데이터, 메모리 등)을 활용해 실제로 작업을 수행하는 것이 쓰레드(thread)
모든 프로세스에는 1개 이상의 쓰레드가 존재
2개 이상의 쓰레드를 가진 프로세스를 멀티 쓰레드 프로세스(multi-threaded process)라고 부름.
프로세스가 점유하고 있는 메모리 안에서 각 쓰레드에게 개별 메모리 공간(호출 스택)을 주기 때문에,
프로세스의 메모리 한도 내에서는 쓰레드의 개수 제한은 없음.
Windows
와 Unix
, Linux
등 현대 OS는 한번에 여러 개의 프로세스를 동시에 실행할 수 있음. 이를 멀티 태스킹이라고 함.
하나의 프로세스가 여러 가지 작업을 여러 개의 쓰레드(실행 흐름)로 나누어 동시에 처리하는 것을 멀티 쓰레딩이라고 함.
💡 정말로 "동시에" 처리할까?
CPU에게 있어서 작업의 최소 단위는 쓰레드. (OS의 작업 최소 단위는 프로세스)
CPU의 코어는 한 번에 한 가지 일만 수행할 수 있으므로 한 시점에 처리되고 있는 쓰레드의 최대 개수는 코어의 개수와 일치함.
그러나 실제 처리할 쓰레드의 개수는 코어의 개수보다 훨씬 많기 때문에 코어는 아주 짧은 시간 동안 여러 가지 작업들을 번갈아가며 수행하고, 우리 눈에는 수많은 작업들이 동시에 처리되는 것처럼 보임.
CPU의 사용률 향상
자원의 공유를 통한 효율적 자원 활용
사용자에 대한 응답성 향상
작업의 분리로 인한 코드의 간결화
여러 사용자의 요청에 대응해야하는 서버 프로그램의 경우, 멀티 쓰레딩이 가능하게 코드를 작성해서 각 쓰레드가 사용자의 요청을 1대1로 처리하게끔 해야함.
싱글 쓰레드인 경우에는 사용자의 요청마다 새 프로세스를 생성해야 하는데, 프로세스를 생성하는데에 드는 시간과 메모리가 쓰레드를 생성하는 것에 비해 훨씬 크기 때문에 비효율적.
단점은 다수의 쓰레드 간의 자원 공유로 인해 동기화(synchronization)나 교착 상태(dead lock) 같은 이슈를 손봐줘야 한다는 것.