[운영체제] 현재 컴퓨터의 발전 변천사 (프로세스와 스레드)
컴퓨터를 하면, 노래를 들으면서 웹 서핑을 하는 것과 같이 동시에 여러 프로그램이 실행된다. (사실 실행되는 것처럼 보인다.) 어떻게 여러 프로그램들이 동시에 실행되는가?
그 원리를 알아보자!
📌 먼저 용어정리
프로그램 (Program)
컴퓨터가 실행할 수 있는 명령어들의 집합
프로세스 (Process)
컴퓨터에서 실행 중인 프로그램
- 각각의 프로세스는 독립적인 메모리 공간을 할당 받음
- 명령어들과 데이터를 가짐
CPU (Central Processing Unit)
명령어를 실행하는 연산 장치
메인 메모리 (Main Memory)
프로세스가 CPU에서 실행되기 위해 대기하는 곳
I/O (Input / Ouput)
파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것
입출력 장치(마우스, 모니터, 키보드 등)와 데이터를 주거나 받는 것
📌 어떻게 우리가 사용하는 컴퓨터 시스템이 어떻게 발전하기 시작했는지 알아보자
단일 프로세스 시스템
가장 초창기의 시스템은 단일 프로세스 시스템이였다.
단일 프로세스 시스템은 한 번에 하나의 프로그램만 실행된다.
→ 한 번에 하나의 프로그램만 실행되기 때문에 먼저 실행하던 프로그램이 끝나야 다른 프로그램을 실행시킬 수 있다.
단점 → CPU 사용률이 좋지 않다.
실행 중에 있는 프로세스가 I/O 작업을 하는 동안에 cpu가 아무 것도 하지 않는다.
(중간 중간 CPU가 다른 일을 하면 좋을텐데..)
이러한 단점을 해결하고자
여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자는 아이디어가 나오게 된다.
→ I/O 작업이 발생하면 cpu를 그냥 놀게 두는 것이 아니라 다른 프로세스가 CPU에서 실행되도록 하자!

이런 종류의 여러개의 프로그램이 동시에 실행되는 시스템을 멀티프로그래밍(multiprogramming)이라고 한다.
멀티프로그래밍 (multiprogramming)
멀티 프로그래밍은 CPU 사용량을 극대화 시키는 것이 목적이 있다. → cpu가 쉬도록 두는게 아니라 다른 프로세스도 같이 실행시켜 같이 실행시키자!
But 한 가지 단점은 : CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기하게 된다.

이를 해결하기 위해 프로세스는 한 번 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 한다.
퀀텀 (Quantum) : 운영체제(OS)에서 CPU를 한 프로세스(또는 스레드)가 점유할 수 있는 최대 시간

이런 종류의 시스템을 멀티 태스킹(multitasking)이라고 한다.
멀티 프로그램 vs 멀티 태스킹
동시에 여러 프로그램을 실행시킨다는 면에서는 유사하지만,
멀티 태스킹은 cpu 타임을 아주 짧게 쪼개서 cpu 타임 안에서 프로세스들이 서로 번갈아 가면서 실행될 수 있도록 했다는 차이가 있다.
멀티태스킹 (multitasking)
프로세스의 응답 시간을 최소화 시키는데 목적
응답 시간 최소화란?
: 일반 사용자가 느끼기에는 여러 프로그램이 동시에 실행되는 것처럼 느껴지게 만드는 것이다.
한 마디로 하나의 운영체제 안에서 여러 프로세스가 실행되어 여러 프로세스가 동시에 실행되는 것처럼 보이도록 하는 것이다.
그러나 아직 아쉬운 점은 하나의 프로세스가 동시에 여러 작업을 수행하지 못한다는 점이다.
그러면 여러 프로세스를 만들어서 실행시키면 되지 않느냐 하겠지만
프로세스를 여러 개 만들어 동작시키기에는 여러 단점이 있다.
- 하나의 프로세스가 동시에 여러 작업을 수행하지 못한다.
- 프로세스의 context switching은 무겁다.
context switching (문맥 교환) : cpu에서 실행되기 위해 어느 한 프로세스에서 다른 프로세스로 교체되는 것
3. 프로세스끼리 데이터 공유가 까다롭다.
→ 각 프로세스는 자체적인 메모리 공간(코드, 데이터, 힙, 스택)을 가져 다른 프로세스와 독립적으로 실행된다.
4. 듀얼 코어가 등장했는데 잘 사용하고 싶다.
듀얼 코어 : 한 cpu안에 2개의 코어
이러한 아쉬움들을 해결하기 위해서 스레드(thread)가 등장
스레드 (thread)
- 하나의 프로세스 안에서 여러 개의 동작을 실행시키기 위해 등장!
- 프로세서 활용의 기본 단위, 프로세스 내 동작되는 여러 실행의 흐름
- 프로세스는 한 개 이상의 스레드를 가질 수 있고, 스레드가 프로세스의 여러 개의 동작을 하나하나 맡아 줄 것이다.
- 같은 프로세스 내에서 여러 개의 스레드가 실행되어 병렬 처리(병행 실행)가 가능하다.
- CPU에서 실행되는 단위 (unit of execution) → 프로세스는 기본적으로 한 개의 스레드를 가진다.
- 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유
- 같은 프로세스의 스레드들끼리 컨텍스트 스위칭이 가볍다
- 메모리 영역을 공유하기 때문에 같은 프로세스 안의 스레드들은 데이터 공유가 쉽다.

스레드 메모리 구조
- 코드(Code) 영역: 프로세스와 공유
- 데이터(Data) 영역: 프로세스와 공유
- 힙(Heap) 영역: 프로세스와 공유
- 스택(Stack) 영역: 개별적으로 할당됨 (각 스레드의 지역 변수, 함수 호출 정보 저장)
멀티 스레드에서 코드, 데이터, 힙을 공유하고 스택만 자신만의 고유한 메모리를 가진다.
각각의 스택을 가리키는 포인터들이 스레드마다 있다. → 프로그램 카운터도 각각 있다.
프로그램 카운터 (programm counter, PC) : 다음 번에 실행되어야 될 명령어가 있는 메모리 주소를 가리킨다.
이때 같은 프로세스에 속한 스레드는 메모리 영역을 공유하기 때문에
하나의 스레드가 오류를 발생시키면 전체 프로세스가 영향을 받을 수 있다.
멀티스레딩 (multi threading)
하나의 프로세스가 동시에 여러 작업을 실행하는게 목적
여러 작업 → 스레드들을 통해 실행

하나의 CPU에 2개의 코어가 있고, 하나의 프로세스에 두 개의 스레드가 있으면 각 코어에 하나의 스레드가 실행되면 된다.
→ 병렬적으로 스레드 실행 ( 진정한 동시 )
스레드 등장으로 인한 확장된 멀티태스킹 개념
여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 cpu time을 나눠 갖는 것
멀티프로세싱 (multiprocessing)
두 개 이상의 프로세서나 코어를 활용하는 시스템
Example
ex 1) 싱글 코어 cpu 에 싱글-스레드 프로세스 두 개
멀티 태스킹 | v |
멀티 스레딩 | |
멀티 프로세싱 |
ex 2) 싱글 코어 CPU에 듀얼-스레드 프로세스 한 개
멀티 태스킹 | v |
멀티 스레딩 | v |
멀티 프로세싱 |
ex 3) 듀얼 코어 CPU에 싱글-스레드 프로세스 두 개
멀티 태스킹 | |
멀티 스레딩 | |
멀티 프로세싱 | v |
ex 4) 듀얼 코어 CPU에 듀얼-스레드 프로세스 한 개
멀티 태스킹 | |
멀티 스레딩 | v |
멀티 프로세싱 | v |
ex 5) 듀얼 코어 CPU에 듀얼-스레드 프로세스 두 개
멀티 태스킹 | v |
멀티 스레딩 | v |
멀티 프로세싱 | v |
reference