관련 용어 정리
- 프로그램(program): 컴퓨터가 실행할 수 있는 명령어들의 집합
- 프로세스(process): 컴퓨터가 실행 중인 프로그램.
- 각각의 프로세스는 독립된 메모리 공간을 할당받는다.
- 그리고 할당받은 메모리 공간에 각각의 명령어들과 데이터를 가진다.
- CPU (Central Processing Unit): 명령어를 실행하는 연산 장치
- 메인 메모리(main memory): 프로세스가 CPU에서 실행되기 위해 대기하는 곳.
- 프로세스의 명령어와 실행중인 데이터도 위치한다.
- IO(input/output): 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것.
- 혹은 입출력 장치와 데이터를 주고받는 것을 의미한다.
단일 프로세스 시스템
- 단일 프로세스 시스템
- 가장 초창기 시스템의 형태.
- 한 번에 하나의 프로그램만 실행된다. 또 다른 프로그램의 실행을 원하는 경우 먼저 실행중이던 프로그램을 종료하고 다른 프로그램을 시랭해야 한다.
단점
- CPU 사용률이 좋지 않다.
- 예를들어, CPU와 I/O 작업을 동시에 수행하는 프로그램이 있을 때, I/O 작업을 수행하는동안 CPU는 작업을 종료하고 놀고있게 된다. (= CPU 사용률이 좋지않다.)
해결책
- 해결책: 멀티 프로그래밍
- 단일 프로세스의 단점을 극복하고자, '여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자!'는 아이디어가 도출됨.
- 현재 실행중인 프로세스에서 I/O 작업이 발생하는 경우 다른 프로세스가 CPU에서 실행된다.
멀티 프로그래밍
- 멀티 프로그래밍(multiprogramming)
- CPU에서 프로세스를 실행시키던 와중 IO 작업이 실행되는 경우 다른 프로세스를 실행하는 방식으로 진행시킨다.
- CPU사용률을 극대화시키는데 목적이 있다.

단점
- CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기
- 그림에서처럼 P1의 작업시간이 너무 길어지면 P2는 아주 오랜시간 P1의 작업을 계속 기다려야 한다.

해결책
- 멀티태스킹
- 프로세스는 한번 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하자!
- CPU가 실행되는 시간을 아주 작게(ms단위만큼 작게) 쪼개서 프로세스들이 번갈아가며 작업을 수행하도록 한다. 그리고 이 짧은 타임 슬롯 사이에서만 각 프로세스들이 시행되도록 제한한다.
멀티태스킹
- 멀티태스킹(multitasking)
- 프로세스는 한번 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하자!

- CPU가 실행되는 시간을 아주 짧게(ms단위만큼 작게) 쪼개서 프로세스들이 번갈아가며 작업을 수행하도록 한다. 그리고 이 짧은 타임 슬롯 사이에서만 각 프로세스들이 시행되도록 제한한다.
- 동시에 여러 프로그램을 실행한다는 점에서 멀티 프로그래밍과 유사하다. 그러나 CPU타임을 아주 짧게 쪼갰다는 점에서 차이가 있다.
- 목적: 프로세스의 응답시간을 최소화 시키는 것.
- 사용자 입장에서는 여러 프로그램이 동시에 실행된다는 느낌을 받게 된다.
아쉬움
- 하나의 프로세스가 동시에 여러 작업을 수행하지는 못한다.
- 여러 프로세스를 실행시키는 것이 가능하긴 하지만, 컨텍스 스위칭 비용 등으로 시도가 힘들다.
- 프로세스의 컨텍스트 스위칭은 무거운 작업이다.
- 컨텍스트 스위칭: CPU에서 실행되기 위해 어느 한 프로세스에서 다른 프로세스로 교체되는 것.
- 프로세스끼리 데이터 공유가 까다롭다.
- 2개의 프로그램을 동시에 실행할 때 각 프로세스가 독립적인 공간을 가지므로 서로의 데이터를 공유할 수 없다.

- 듀얼 코어가 등장했는데, 이것을 잘 활용하려는 시도가 생겨났다.
- 하나의 CPU 성능을 계속 발전시키는것이 발열 등의 문제로 한계가 있어, 하나의 성능을 개선하기 보다는 하나의 CPU에 2개의 코어를 둬 전체적 성능을 향상시키는 방향으로 전환한다.
- 2000년대 초 중반부터 듀얼코어 제품이 나왔는데, 이것을 잘 활용하려는 시도가 나타났다.
해결책
- 이 아쉬움들을 해결하고자 스레드(Thread) 가 도입되었다.
스레드(Thread)
- 프로세스는 한 개 이상의 스레드를 가질 수 있다.
- 스레드라는 개념의 등장 배경이 '한 프로세스 안에서 여러개의 작업을 동시에 실행하기 위함'이다. 여러 개의 작업들을 동시에 실행하기 위해서는 여러 개의 작업 하나하나를 맡아줄 존재가 필요하고, 스레드가 바로 이 작업을 수행해줄 단일 개체가 되어준다.
- CPU에서 실행되는 단위(unit of execution)
- 예전에는 프로세스가 CPU에서 실행되는 단위였다면, 이제 프로세스 대신에 스레드가 CPU에서 실행되는 단위가 되었다. 또한 스레드가 CPU에서 실행되는 단위가 되었기 때문에, 프로세스는 필수적으로 하나의 스레드를 가지게 된다.
- 같은 프로세스의 스레드들끼리 컨텍스트 스위칭이 가볍다.
- 스레드가 나오면서 같은 프로세스에 소속된 스레드끼리의 컨텍스트 스위칭은 훨씬 쉬워진다.
- 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유한다.
- 효과1. 같은 프로세스에 속한 스레드끼리는 컨텍스트 스위칭이 가볍다.
- 효과2. 메모리 영역을 공유하므로 같은 프로세스안의 스레드끼리는 데이터 공유가 쉽다.
메모리 구조 비교 (싱글스레드 vs 멀티스레드)

- 좌측은 싱글스레드일때의 메모리 구조, 우측은 멀티스레드일때의 메모리 구조이다.
- 싱글스레드
- 프로세스에 할당된 메모리 영역을 보여준다.
- stack, heap, stack pointer, program counter를 확인할 수 있다.
- 멀티스레드
- 멀티스레드들이 소속된 프로세스의 메모리영역을 보여준다.
- 공유되는 메모리 영역: Heap
- 같은 프로세스에 속한 스레드들이 해당 프로세스의 메모리영역을 공유하는데, Heap 영역을 공유한다.
- 각 스레드들이 개별적으로 가지는 고유한 메모리 영역: Stack
- 그러나 스레드들이 같은 프로세스의 메모리 영역안에 있어도 자신만의 고유한 영역을 가지는데, 이를 stack이라 부른다.
Stack pointer for thread
: 각각의 스레드가 자신의 스택을 가리키는 포인터를 개별적으로 가진다.
PC for thread
: 각 스레드가 자신의 프로그램 카운터를 가진다.
- Program Counter(프로그램 카운터): 이 다음번에 실행돼야 할 명령어가 있는 메모리 주소를 가리킨다.
같은 프로세스에 속한 스레드들은 그 프로세스의 메모리 영역을 공유한다. 그러나 동시에 각 스레드들은 자신들만의 고유한 영역 역시 가지고 있다.
실제 작동 예제
- 하나의 CPU, 2개의 Thread를 가지는 프로그램이 있는 경우
- 이때는 멀티테스킹 방식처럼 동작한다.
- 시간을 짧게 쪼개고 각 쓰레드들이 아주 짧은 시간 타임을 서로 나눠서 실행하게 된다.

- 코어가 2개인 CPU, 2개의 Thread를 가지는 프로그램이 있는 경우
- 각 코어가 각각의 스레드를 실행한다.
- 진정으로 동시에, 병렬로 스레드가 실행되게 된다.
- 이런 종류의 시스템을 멀티스레딩(multithreading)이라 한다.

멀티스레딩(multithreading)
- 하나의 프로세스가 동시에 여러 작업을 실행하는 것이 목적.
확장된 멀티태스킹 개념
- 기존에는 '프로세스끼리의 아주 짧은 시간 안에서의 스위칭'이었다면, 이제는 '여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU time을 나눠 갖는 것'으로 그 개념이 확장되었다.
멀티프로세싱(multiprocessing): 두 개 이상의 프로세서나 코어를 활용하는 시스템
예제로 살펴보는 개념들
- 몇 가지 예제를 통해 예제들이 멀티태스킹, 멀티스레딩, 멀티프로세싱인지 확인해보자.
- 멀티태스킹(multitasking): 여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU time을 나눠 갖는 것.
- 멀티스레딩(multithreading): 하나의 프로세스가 동시에 여러 작업을 실행하는 것.
- 멀티프로세싱(multiprocessing): 두 개 이상의 프로세서나 코어를 활용하는 시스템.
예제1. 싱글코어 CPU에 싱글-스레드 프로세스 2개

- 멀티태스킹 O : 하나의 CPU가 두개의 프로세스를 나누어서 실행한다.
- 멀티스레딩 X :싱글=스레드이므로 멀티스레드가 아니다.
- 멀티프로세싱 X: 두 개 이상의 프로세서나 코어가 있어야 멀티프로세싱. 현재 하나의 코어를 가지는 한개의 CPU를 가지므로 멀티프로세싱이 아니다.
예제2. 싱글코어 CPU에 듀얼-스레드 프로세스 1개

- 멀티태스킹 O : CPU하나로 스레드가 나누어 사용하므로 멀티스레딩이 맞다.
- 멀티스레딩 O : '듀얼스레드'이므로 멀티스레딩도 맞다.
- 멀티프로세싱 X : CPU가 하나이므로 멀티프로세싱은 아니다.
예제3. 듀얼코어 CPU에 싱글-스레드 프로세스 2개

- 멀티태스킹 X : 각각의 코어가 각각의 프로세스를 실행한다. 코어를 가지고 경합하는 것이 없으므로 머리테스킹이 없다.
- 멀티스레딩 X : 싱글스레드이므로 멀티스레딩도 아니다.
- 멀티프로세싱 O : 코어가 2개이므로 멀티프로세싱은 맞다.
예제4. 듀얼코어 CPU에 듀얼-스레드 프로세스 1개

- 멀티태스킹 X : 각각의 코어가 하나의 스레드를 맡아 코어별 경합이 없으므로 멀티태스킹이 아니다.
- 멀티스레딩 O : 하나의 프로세스에 두개의 스레드가 있으므로 멀티스레딩이 맞다.
- 멀티프로세싱 O : 코어가 두개이므로 멀티 프로세싱도 맞다.
예제5. 듀얼코어 CPU에 듀얼-스레드 프로세스 2개
- 가장 현실에 근접한 예시이다. 이 예제에서는 2가지 경우의 수가 발생할 수 있다.


- 멀티태스킹 O : 발생할 수 있는 2가지 경우 모두에서 코어의 경합이 발생한다.
- 멀티스레딩 O : 각각의 프로세스가 2개 이상의 스레드를 가진다.
- 멀티프로세싱 O : 코어가 2개이다.
이 게시글에서 언급된 스레드는 OS(운영체제) 레벨의 스레드이다.
Reference