📌 프로그램과 프로세스
프로그램과 프로세스를 설명하기 전에, 사진과 함께 용어들을 간단하게 정리하고자 한다.
- Program: 컴퓨터가 실행할 수 있는 명령어들의 집합
- Proess: 컴퓨터에서 실행 중인 프로그램
- CPU(Central Processing Unit): 명령어를 실행하는 연산 장치
- Main Memory: 프로세스가 CPU에서 실행되기 위해 대기하는 곳
- PCB(Process Control Block): 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조
우리는 컴퓨터를 사용하면서 흔히 프로그램이라는 단어를 접하곤 한다. 하지만 컴퓨터 용어에 관심이 없거나 작업 관리자 창을 자세히 보지 않았을 경우 프로세스라는 단어는 다소 생소할 수 있다. 또한 프로그램과 어떤 관계가 있는지 모를 수 있다.
(부끄럽지만 필자의 경우 전공을 배우기 전까지 프로세스는 커녕 프로그램이라는 단어의 뜻도 생각해보지 않았다...)
프로그램과 프로세스는 다음과 같다.
- 프로그램(Program): 컴퓨터가 실행할 수 있는 명령어들의 집합
- 즉, 컴퓨터가 실행할 수 있는 파일을 말하며, 대표적으로 .exe가 있다.
- 프로그램은 동작되고 있지 않은 정적인 개체라고 볼 수 있다.
- 프로세스(Process): 컴퓨터에서 실행 중인 프로그램
- 각각의 프로세스는 독립된 메모리 공간을 할당받으며, 해당 메모리 공간에 명령어들과 데이터를 갖게 된다.
- 프로세스는 실행중인 프로그램을 뜻하기 때문에 동적인 개체라고 볼 수 있다.
위의 사진은 프로세스가 메모리를 할당 받으면 메모리에 생성되는 영역들을 나타낸다. 각 영역은 다음과 같은 데이터들이 저장된다.
- Code: 실행 명령을 포함하는 코드들
- Data: static 변수 혹은 전역 변수
- Heap: 동적 메모리 영억
- Stack: 지역 변수, 매개 변수, 반환 값... 등 일시적인 데이터
📌 단일 프로세스 시스템에서 멀티 코어까지의 과정
이 글의 핵심인 멀티 프로세스와 멀티 스레드를 말하기 전에, 어쩌다 멀티 프로세스가 나왔고 스레드와 멀티 스레드가 나왔는지를 살펴보고자 한다.
1. 단일 프로세스 시스템 - 초창기의 시스템
단일 프로세스 시스템은 말 그대로 한 번에 하나의 프로그램만 실행되는 시스템이다.
이러한 단일 프로세스 시스템의 치명적인 단점은 CPU 사용률이 좋지 않다는 점이다. 이는 아래의 사진을 통해 확인할 수 있다.
위의 사진과 같이 컴퓨터에 Program 1이라는 프로그램이 있다고 가정하자. Program1이 CPU에서 작업 중이라면 아무 문제가 없다.
하지만 Program 1이 I/O(Input/Output) 작업을 하러 가게 되면, Program 1이 돌아오기 전까지 CPU는 아무 것도 하지 않고 가만히 쉬게 된다. 그렇기 때문에 단일 프로세스 시스템은 CPU 사용률이 좋지 않다는 것이다.
이를 해결하기 위해 고안된 것이 '여러 개의 프로그램을 메모리에 올려 놓고 실행시키자' 는 것이였는데, 이것이 바로 멀티 프로그래밍이다.
2. 멀티 프로그래밍 (Multi-Programming)
멀티 프로그래밍은 여러 개의 프로그램을 메모리에 올려 놓고 동시에 실행시키는 방식이다.
즉, 이전에는 하나의 프로세스만 CPU에서 실행되었지만 멀티 프로그래밍은 CPU가 특정 프로세스의 I/O 작업 종료를 대기할 동안 다른 프로세스가 CPU에서 실행되는 것이다.
- 여기서 동시에라는 뜻은 두 개 이상의 프로세스가 진짜로 동시에 동작하는 것이 아니라 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것을 말한다. 이를 동시성(Concurrency)이라 한다.
- 동시성에 대한 설명은 뒤의 멀티 태스킹에서 설명할 예정이다.
- 미리 말하자면, 멀티 프로그래밍과 멀티 태스킹은 모두 동시성의 특징을 지니고 있다.
결국 멀티 프로그래밍은 기존의 단일 프로세스 시스템의 문제점인 CPU 사용률이 좋지 않다는 점을 개선하기 위해 나온 것이며, 그렇기 때문에 CPU 사용률을 극대화 시키는 것이 목적이다.
멀티 프로그래밍에도 단점이 존재하는데, 이는 바로 CPU 사용 시간이 길어지면 다른 프로세스는 계속 대기해야 된다는 것이다. 이는 아래의 사진을 통해 볼 수 있다.
이를 해결하기 위해 고안된 것이 프로세스는 한 번 CPU를 사용할 때 아주 짧은 시간만 CPU에서 실행되도록하는 것이였으며, 이것이 멀티 태스킹이다.
3. 멀티 태스킹 (Multi-Tasking)
멀티 태스킹은 앞에서 말했듯 프로세스가 한 번 CPU를 사용할 때 아주 짧은 시간만 CPU에서 실행되는 방식이다.
이는 아래의 사진을 통해 간단하게 확인할 수 있다.
이는 멀티 프로그래밍의 단점을 고안하기 위해 나왔으며, 그렇기 때문에 프로세스의 응답 시간을 최소화시키는데에 목적을 두고 있다.
또한 아주 짧은 시간동안 프로세스들이 번갈아 실행되기 때문에 사용자들은 마치 여러 프로그램이 동시에 실행되는 것처럼느껴진다.
- 앞에서 말했듯, 멀티 프로그래밍과 멀티 태스킹의 정의를 얘기할 때 '동시에' 라는 단어가 언급되는데, 이는 바로 동시성(Concurrency) 을 의미한다. 동시성의 개념은 다음과 같다.
- 동시성(Concurrency): 하나의 코어에서 하나 이상의 프로세스 또는 스레드가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것
멀티 태스킹의 단점은 하나의 프로세스가 동시에 여러 작업을 수행하지 못한다는 점이다.
물론 여러 프로세스를 만들어서 실행(=Multi-Processing)시킬 수 있지만, 이를 동작시키기에는 다음과 같은 단점들이 있다.
- 프로세스 간의 컨텍스트 스위칭은 무거운 작업이다.
- 컨텍스트 스위칭: CPU에서 실행되기 위해 어느 프로세스에서 다른 프로세스로 교체되는 것을 의미.
- 프로세스 간의 데이터 공유가 까다롭다.
- 앞에서 말했듯, 각각의 프로세스는 독립된 메모리 공간을 할당받는다. 그렇기 때문에 프로세스 간의 데이터 공유가 까다롭다는 것이다.
이를 해결하기 위해 나온 것이 스레드이다.
4. 스레드(Thread)와 멀티 스레드(Multi-Thread)
스레드는 프로세스내에서 실제로 작업하는 주체이자 실행되는 단위를 말한다. 스레드의 특징은 다음과 같다.
- 프로세스는 한 개 이상의 스레드를 가질 수 있다.
- 여기서 둘 이상의 스레드를 갖게 될 경우 멀티 스레드라 한다.
- 스레드는 CPU에서 실행되는 단위이다.
- 이전에는 프로세스가 CPU에서 실행되는 단위였다.
- 같은 프로세스의 스레드들끼리 컨텍스트 스위칭이 가볍다.
- 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유한다.
- 스레드는 메모리 영역 중 Code, Data, Heap 영역을 공통된 자원으로 사용하고, Stack 부분만을 따로 가지고 있다.
- 스레드들은 메모리 영역을 서로 공유하기 때문에 같은 프로세스 안의 스레드들 끼리는 데이터 공유가 쉽다.
멀티 스레드는 하나의 프로세스가 동시에 여러 작업을 실행하는 데에 목적을 두고 있다. 즉, 스레드들을 통해 여러 작업이 실행되는 것이다.
TMI로, 인터넷 익스플로러와 크롬의 멀티 탭 기능은 각각 멀티 스레드, 멀티 태스킹으로 구현되어 있다. 이는 아래의 표를 통해 쉽게 확인할 수 있다.
웹 브라우저 | 인터넷 익스플로러 | 크롬 |
구현 방식 | 멀티 스레드 | 멀티 태스킹 |
장점 | 하나의 프로세스를 공유하는 스레드로 되어 있기 때문에 자원 활용의 효율성이 좋다. | 프로세스들은 각각 독립적이라는 성격을 띄기 때문에 한 화면에 문제가 생겨 종료될 경우 다른 화면에 영향을 덜 끼친다. |
단점 | 스레드에 문제가 생기면 전체 프로세스에 영향을 끼치기 때문에 한 화면에 문제가 생길 경우 전체가 종료된다. | 프로세스 여러 개를 사용하는 것은 비교적 효율성이 좋지 않다. |
5. 멀티 코어 (Multi-core) - 병렬 처리(Parallelism)
멀티 코어는 2개 이상의 프로세서가 부터 있는 집적 회로를 말한다. 멀티 프로세스와 멀티 스레드는 '처리 방식'의 일종이기 때문에 소프트웨어에 가깝다고 볼 수 있으나, 멀티 코어는 '집적 회로'이기 때문에 하드웨어에 가깝다고 볼 수 있다.
멀티 코어를 언급한 이유는 동시성(Concurrency)과 병렬 처리(Parallelism) 때문이다. 앞에서 보았던 멀티 프로그래밍과 멀티 태스킹은 동시성을, 현재 언급하고 있는 멀티 코어는 병렬 처리 방식을 보여준다.
이를 정리하자면 다음과 같다.
- 동시성(Concurrency): 싱글 코어에서 여러 개의 프로세스 혹은 스레드가 번갈아 실행되는 것.(동시에 실행되는 것처럼 보이지만 사실 번갈아가면서 실행된다.)
- 병렬 처리(Parallelism): 멀티 코어에서 하나 이상의 프로세스 혹은 스레드가 동시에 진행되는 것.
📌 멀티 프로세스 & 멀티 스레드 비교
우리는 앞에서 단일 프로세스 시스템부터 멀티코어까지를 살펴보았다.
그리고 우리는 이와 함께 멀티 프로그래밍과 멀티 태스킹을 통해 멀티 프로세스(Multi-process)를, 그리고 멀티 태스킹의 단점을 위해 등장한 스레드와 멀티 스레드(Multi-thread)를 확인할 수 있었다.
우선 멀티 프로세스는 다음과 같이 이루어져 있다.
1. 멀티 프로세스 (Multi-process)
(그림 7 출처: https://chaelin1211.github.io/study/2021/06/11/thread-and-process.html )
- 각 프로세스는 독립적이다.
- 프로세스 간 통신을 하기 위해 IPC를 사용한 통신을 한다.
- 왜냐하면 프로세스는 개별 독립적이기 때문에 프로세스 간 통신이 어렵기 때문이다.
- 프로세스마다 개별 메모리를 차지하기 때문에 자원 소모적이다.
- 컨텍스트 스위칭 비용이 크다.
- 동기화 작업이 필요하지 않다.
- 이 또한 프로세스는 개별 독립적이기 때문이다.
2. 멀티 스레드 (Multi-thread)
(그림 8 출처: https://chaelin1211.github.io/study/2021/06/11/thread-and-process.html )
- 스레드들 간에 긴밀하게 연결되어 있다.
- 그래서 그만큼 동기화에 신경을 써야 한다.
- 통신 비용 절감.
- 왜냐하면 스레드는 하나의 프로세스에서 공유된 자원을 사용하기 때문이다.
- 메모리가 효율적이다.
- 이 또한 하나의 프로세스에서 공유된 자원을 사용하기 때문이다.
- 컨텍스트 스위칭 비용이 적다.
- 공유 자원 관리를 해야 한다.
- 하나의 스레드에 문제가 생길 경우 전체 프로세스에 영향을 끼친다는 단점이 있다.
👀 Reference
2. https://www.youtube.com/watch?v=1grtWKqTn50&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC
3. https://www.youtube.com/watch?v=QmtYKZC0lMU&ab_channel=%EC%89%AC%EC%9A%B4%EC%BD%94%EB%93%9C
'Computer Science > Operating System' 카테고리의 다른 글
동기화 (Synchronization)문제와 해결 방안 (0) | 2023.03.06 |
---|---|
IPC - 프로세스 간 통신 방법 (0) | 2023.03.06 |