0. 개요
안녕하세요. 오늘은 여러 프로그래밍이 동시에 실행될 수 있는 원리에 대해서 알아보고자 합니다.
즉, 프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍...이라는 헷갈리는 것들에 대해서 알아볼게요.
1. 사전 지식
프로그램(Program) : 컴퓨터가 실행할 수 있는 명령어들의 집합
프로세스(Process) : 컴퓨터에서 실행 중인 프로그램. 각각의 프로세스는 독립된 메모리 공간을 할당 받음. 명령어들과 데이터를 가짐
CPU(central processing unit) : 명령어를 실행하는 연산 장치
메인 메모리(Main memory) : 프로세스가 CPU에서 실행되기 위해 대기하는 곳
IO(input / output) : 파일을 읽고 쓰거나 네트워크의 어딘가와 데이터를 주고받는 곳. 또한 입출력 장치와 데이터를 주거나 받는 것을 의미하기도 함
2. 단일 프로세스 시스템
한 번에 하나의 프로그램만 실행 되는 것을 의미
초창기의 시스템은 단일 프로세스 시스템이었습니다. 즉 한 번에 하나의 프로그램만 실행됩니다. 그래서, 다른 프로그램을 실행하려면 기존의 실행 중인 프로그램을 종료하고 실행시켰어야 합니다. 이러한 시스템의 단점은 CPU 사용률이 좋지 않다는 점이었습니다.
위의 사진과 같이, 프로세스가 실행되다가 I/O 작업이 발생하면 이 작업이 수행되는 동안 CPU는 놀고 있습니다. I/O 작업을 마친 뒤, 어느 순간 프로세스가 잠깐 실행되다가 또 CPU가 작업을 멈추고 I/O 작업이 발생하고.. 이러한 과정이 반복됩니다.
즉, I/O 작업이 일어나는 동안 CPU는 쉬게되고 이는 CPU 사용률을 좋지 못하게 만듭니다.
2. 멀티 프로그래밍
단일 프로세스의 CPU 사용률 문제를 해결하기 위해, 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키는 아이디어가 나오게 됩니다. I/O 작업이 발생하면 다른 프로세스가 CPU에서 실행되게 하는 거에요. 이를 멀티프로그래밍이라고 합니다.
위 사진을 설명해 보겠습니다. 먼저, P1이 실행됩니다. 그러다 I/O 작업이 발생하여 CPU에서의 P1 작업이 종료되고 P2가 실행이 됩니다. P2도 I/O 작업이 발생하였지만 P1의 I/O 작업이 끝나지 않아서 CPU는 기다리고 있습니다. 그 뒤에, P1의 I/O가 작업이 종료되어서 P1이 다시 실행됩니다.
이 멀티프로그래밍 방식은 CPU 사용률을 극대화하기 위해 고안되었고, 어느 정도 단일 프로세스 방식을 보완하였지만 단점이 존재합니다. CPU 사용 시간이 길어지면, 다른 프로세스는 계속해서 대기해야 한다는 점이에요.
3. 멀티 태스킹
멀티프로그래밍의 단점을 보완하기 위해서, 프로세스는 한 번 CPU를 사용할 때, 아주 짧은 시간(Quantum)만 CPU에서 실행되도록 하자는 멀티 태스킹이라는 개념이 등장합니다.
위의 사진처럼, P1과 P2가 번갈아가면서 짧은 시간만 CPU를 점유하는 방식입니다. 이렇게 하여 여러 프로세스가 동시에 실행되는 것처럼 보이게 함, 즉 프로세스의 응답 시간을 최소화시키는데 목적이 있습니다.
하지만, 여전히 아쉬운 부분이 있습니다.
1. 하나의 프로세스가 동시에 여러 작업을 수행하지는 못합니다.
2. 프로세스의 문맥 교환(Context Switching, CPU에서 실행되기 위해 어느 프로세스에서 다른 프로세스로 교체하는 작업) 은 무거운 작업입니다.
3. 프로세스는 서로 다른 메모리 공간을 가지고 있으므로 프로세스 간의 데이터 공유가 까다롭습니다.
4. 하나의 CPU 성능을 발전시키는 것이 발열 등의 이슈로 어려워져서, 듀얼 코어라는 개념이 등장했습니다.
4. 스레드
이런 멀티 태스킹의 아쉬운 부분을 해결하기 위해서, 스레드(Thread)라는 개념이 등장합니다. 스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말합니다. 이러한 스레드의 특징으로는
1. 프로세스는 한 개 이상의 스레드를 가질 수 있습니다.
2. CPU에서 실행되는 단위입니다. (unit of execution)
3. 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유합니다.
4. 따라서, 같은 프로세스의 스레드들끼리 문맥 교환(Context Switching)은 가볍고 데이터 공유가 쉽습니다.
왼쪽이 Single Thread(혹은, Thread가 등장하기 전 process의 메모리 구조), 오른쪽이 Multi Thread일 때의 메모리 구조입니다. 사진은 각각의 프로세스가 할당받은 메모리 영역입니다. 각각 스택과 힙이 존재하는데, 멀티 스레드 구조에서 힙 지역은 공유하고 스택 지역은 각각 할당받는다는 점만 알고 넘어가겠습니다. 스택처럼 PC(Program Counter, 다음에 실행할 명령어의 주소)도 스레드 별로 존재합니다.
이 사진에서 말씀드리고 싶은 부분은 '같은 프로세스에 속한 스레드들은 그 프로세스의 메모리 영역을 공유한다'와 그렇더라도 스레드 간의 고유한 영역도 있다입니다.
5. 멀티 스레딩
이제 스레드 2개를 가진 프로세스가, 2개의 코어를 가진 CPU에서 실행되면 각각 실행되게 됩니다. 이렇게 병렬적으로 실행되는 구조를 멀티스레딩(MultiThreading)이라고 하며, 이는 하나의 프로세스가 동시에 여러 작업을 실행하는데 목적을 두고 있습니다.
이런 멀티스레딩이 등장하면서, 위에서 언급한 멀티태스킹의 개념도 '여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU time을 나눠 갖는 것'으로 확장되었습니다.
또, 두 개 이상의 프로세서나 코어를 활용하는 시스템을 멀티프로세싱(MultiProcessing)이라고 합니다.
6. 예제
예제 1) 싱글코어 CPU에 싱글스레드 프로세스 2개
이 프로세스들이 번갈아 가면서 작업을 할 것이므로 멀티태스킹이지만, 싱글 스레드에 싱글 코어 CPU이므로 멀티스레딩과 멀티 프로세싱은 아닙니다.
멀티태스킹 : O
멀티스레딩: X
멀티프로세싱 : X
예제 2) 싱글코어 CPU에 듀얼스레드 프로세스 1개
CPU 하나를 가지고 스레드들이 경합을 해야 하므로 멀티태스킹이고, 듀얼스레드이기 때문에 멀티스레드도 맞습니다. 하지만 싱글코어 CPU이므로 멀티프로세싱은 아닙니다.
멀티태스킹 : O
멀티스레딩 : O
멀티프로세싱 : X
예제 3) 듀얼코어 CPU에 싱글스레드 프로세스 2개
코어를 가지고 경합하지 않으므로 멀티태스킹은 아닙니다. 싱글스레드 프로세스이기 때문에 멀티스레딩도 아닙니다. 단, 코어가 2개이기 때문에 멀티프로세싱은 맞습니다.
멀티태스킹 : X
멀티스레딩 : X
멀티프로세싱 : O
예제 4) 듀얼코어 CPU에 듀얼스레드 프로세스 1개
코어별 경합이 없기 때문에 멀티태스킹은 아닙니다. 듀얼스레드 프로세스이기 때문에 멀티스레딩은 맞습니다. 또한, 코어도 2개이기 때문에 멀티프로세싱입니다.
멀티태스킹 : X
멀티스레딩 : O
멀티프로세싱 : O
예제 5) 듀얼 코어 CPU에 듀얼스레드 프로세스 2개
상황 1. 위 사진에서 위쪽 프로세스의 스레드들은 위의 코어에, 아래쪽 프로세스의 스레드들은 아래의 코어로 몰린 상황
코어 간 스레드들이 경합하므로 멀티태스킹입니다. 또한 듀얼스레드 프로세스들이기 때문에 멀티스레딩입니다. 코어의 수도 2개이므로 멀티프로세싱입니다.
멀티태스킹 : O
멀티스레딩 : O
멀티프로세싱 : O
상황 2. 프로세스의 각각의 스레드들이 다른 코어에 교차하듯이 배치된 상황
코어간 스레드들이 경합하므로 멀티태스킹입니다. 듀얼스레드 프로세스들이기 때문에 멀티스레딩입니다. 코어의 수도 2개이므로 멀티프로세싱입니다. 이러한 상황이 오늘날의 컴퓨터랑 가장 비슷한 예제입니다.
멀티태스킹 : O
멀티스레딩 : O
멀티프로세싱 : O
참고자료 : https://www.youtube.com/watch?v=QmtYKZC0lMU
'운영체제' 카테고리의 다른 글
스핀락(Spinlock) 뮤텍스(Mutex) 세마포어(Semaphore) (1) | 2023.09.06 |
---|---|
컨텍스트 스위칭(Context Switching) (1) | 2023.09.02 |