01. 프로세스/스레드
유튜버 쉬운코드 님의 운영체제 강의를 정리한 내용
# 프로세스/스레드
# 기초용어
프로그램 (program)
- 컴퓨터가 실행할 수 있는 명령어들의 집합
프로세스 (process)
- 컴퓨터에서 실행 중인 프로그램
- 각각의 프로세스는 독립된 메모리 공간을 할당 받음
- 명령어들과 데이터를 가짐
CPU (Central Processing Unit)
- 명령어를 실행하는 연산 장치
- 프로세스의 명령어를 해석하고 실행하는 장치
메인 메모리 (Main Memory)
- 프로세스가 CPU에서 실행되기 위해 대기하는 곳
IO (Input / Output)
- 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고 받는 것
- 입출력 장치와 데이터를 주거나 받는 것
# 단일 프로세스
단일 프로세스 시스템
- 한 번에 하나의 프로그램만 실행되는 시스템
- 다른 프로그램을 실행하려면 먼저 실행 중인 프로그램을 종료시키고 그 다음 프로그램을 실행해야함
- 아주 초창기의 시스템 모델
- 단점 : CPU 사용률이 좋지 ❌
- 어떤 프로그램 P1은 CPU을 사용하기도 하고 IO 작업을 하기도 함
- P1이 IO 작업을 하는 동안 CPU는 그냥 놀고있음
- 이게 단일 프로세스 시스템의 단점
- 실행 중에 있는 프로세스가 IO 작업을 하는 동안 CPU가 아무것도 안하고 노는 것
- 해결책 : 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자!
- IO 작업이 발생하면 다른 프로세스가 CPU에서 실행됨
멀티 프로그래밍 (Multi Programming)
- 여러 개의 프로그램이 동시에 실행되는 것
- CPU 사용률을 극대화 시키는데 목적
- 단점 : CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기
- 해결책 : 프로세스는 한 번 CPU를 사용할 때 아주 짧은 시간(=quantum)만 CPU에서 실행되도록 하자 !!
# 멀티태스킹
멀티태스킹 (multitasking)
- 멀티 프로그래밍과 유사하지만, CPU 타임을 아주 짧게 쪼개서, 그 CPU 타임 안에서 프로세스들이 번갈아 CPU를 사용할 수 있게 만들었다는 점에서 차이가 있음
- 아주 짧은 시간(=quantum)은 ms 단위까지 time slot이 아주아주 짧게 구분됨
- time slot 시간 안에서만 각 프로세스들이 CPU를 최대한 사용할 수 있게 됨
- 멀티태스킹은 프로세스의 응답 시간을 최소화 시키는데 목적
- 일반 사용자가 느끼기에는 마치 여러 프로그램이 동시에 실행되는 것처럼 느끼게 함
멀티태스킹의 아쉬움
- 하나의 프로세스가 동시에 여러 작업을 수행하지는 ❌
- 여러 프로세스를 만들어서 실행시킬 수 있겠지만, 프로세스를 여러 개 만들어서 실행시키기에는 컨택스트 스위칭 같은 단점이 있음
- 프로세스의 컨택스트 스위칭은 무거운 작업
- 컨택스트 스위칭은 CPU에서 실행되기 위해서 어느 한 프로세스에서 다른 프로세스로 교체되는 것을 의미
- 프로세스끼리 데이터 공유가 까다로움
- 프로세스는 독립적인 메모리 공간을 가지기 때문
- 듀얼 코어가 등장했는데, 잘 쓰기 어려움
→ 이런 멀티태스킹 아쉬움 문제의 해결책이 바로 스레드(Thread)
# 스레드
스레드(Thread)
- 프로세스는 한 개 이상의 스레드를 가질 수 있음
- 스레드는 CPU에서 실행되는 단위이다. (unit of execution)
- 같은 프로세스의 스레드들끼리 컨택스트 스위칭은 가볍다.
- 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유함
지금 이야기 하는 것은 OS Level에서의 스레드
User Level에서의 스레드도 있음
오늘날의 프로세스는 기본적으로 최소 1개의 스레드를 가짐
스레드가 CPU/코어에서의 실행되는 기본 단위이기 때문
메모리 구조 비교 (싱글 스레드 vs 멀티 스레드)
- 지금 보이는 메모리 구조가 1개의 프로세스가 할당받은 메모리 영역
- 같은 프로세스에 속한 스레드들은 그 프로세스의 메모리 영역을 공유
- Heap 영역은 공유 🟢
- 자신만의 고유한 영역인 Stack은 공유 ❌
- 각각의 스택을 가리키는 stack pointer, PC는 공유 ❌
- PC (Program Counter)는 다음번에 실행되어야 할 명령어가 있는 메모리 주소를 가리킴
ex) CPU 코어 1개의 경우
- 기존의 멀티태스킹 시스템처럼 쪼갠 시간만큼 조금씩 실행
ex) CPU 멀티 코어의 경우
- 병렬적으로 스레드가 실행되는 진정한 의미의 동시성
# 멀티스레딩
멀티스레딩 (Multi Threading)
- 하나의 프로세스가 동시에 여러 작업을 실행하는데 목적
- 여러 작업은 스레드들을 통해서 동작되는 것을 의미
- 확장된 멀티태스킹의 개념
- 여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 cpu time을 나눠갖는 것
멀티프로세싱 (Multi Processing)
- 두 개 이상의 프로세스나 코어를 활용하는 시스템
# 종합 예제
ex) 싱글코어 CPU에 싱글-스레드 프로세스가 2개
ex) 싱글코어 CPU에 듀얼-스레드 프로세스 1개
- CPU 코어 1개를 가지고 경합하기 때문에 멀티태스킹 🟢
- 듀얼-스레드니까 멀티스레딩 🟢
- CPU 1개니까 멀티프로세싱 ❌
ex) 듀얼코어 CPU에 싱글-스레드 프로세스 2개
- 코어 2개라서 헷갈리면 안됨. CPU 코어 1개를 가지고 경합하는 것이 없기 때문에 멀티태스킹 ❌
- 싱글-스레드니까 멀티스레딩 ❌
- 코어가 2개니까 멀티프로세싱 🟢
ex) 듀얼코어 CPU에 듀얼-스레드 프로세스 1개
- 각 코어별로 경합하는 것이 아니니까 역시 멀티태스킹 ❌
- 하나의 프로세스에 스레드가 2개니까 멀티스레딩 🟢
- 코어가 2개니까 멀티프로세싱 🟢
ex) 듀얼코어 CPU에 듀얼-스레드 프로세스 2개
- 각 코어마다 경합하는 것이 있으니까 멀티태스킹 🟢
- 듀얼-스레드니까 멀티스레딩 🟢
- 코어가 2개 + 프로세스 2개니까 멀티프로세싱 🟢
- 각 코어마다 경합하는 것이 있으니까 멀티태스킹 🟢
- 듀얼-스레드니까 멀티스레딩 🟢
- 코어가 2개 + 프로세스 2개니까 멀티프로세싱 🟢