이번에는 프로세스와 관련된 내용들을 정리해보려고 한다.
이미 어느 정도 알고는 있지만,
이번 기회에 정리를 통해 명확하게 다시 한번 짚고 넘어가려 한다.
그렇기에 우선, 프로세스에 대해 알아보기 전에
알아야 하는 내용들을 먼저 짚고 넘어가려고 한다.
사전 지식
프로그램(program)
컴퓨터가 실행할 수 있는 명령어들의 집합이다.
프로세스(process)
컴퓨터에서 실행 중인 프로그램을 말한다.
프로세스의 주요 특징은
각각의 프로세스는 독립된 메모리 공간을 할당 받고,
독립된 메모리 공간에 명령어들과 데이터를 가지게 된다.
CPU(Central Processing Unit)
명령어를 실행하는 연산 장치
메인 메모리(Main memory)
흔히 메모리라고 부른다.
프로세스가 CPU에서 실행되기 위해 대기하는 곳이다.
물론, 메인 메모리에 프로세스의 명령어들과 실행 중인 데이터가 있기도 한다.
I/O (input/output)
파일을 읽고(read) 쓰거나(write)
네트워크의 어딘가와 데이터를 주고 받는 것,
입출력 장치(ex. 마우스, 키보드, 모니터)와 데이터를 주고 받는 것을 의미하기도 한다.
단일 프로세스 시스템
완전 초창기에 시스템은 단일 프로세스 시스템이었다.
즉, 한 번에 하나의 프로그램만 실행시킬 수 있었다.
그래서 하나의 프로그램이 실행 중인데, 다음 프로그램을 실행하고 싶다면?
실행 중인 프로그램은 종료시켜야만 다음 프로그램을 실행 시킬 수 있었다.
단일 프로세스 시스템의 단점
단일 프로세스 시스템의 가장 큰 단점은
CPU 사용률이 좋지 않다는 점이었다.
Program1(P1)은 CPU를 쓰기도 하고 I/O 작업을 하기도 한다고 가정해보자.
P1을 실행시키는 CPU(노란색)가 있다.
P1을 CPU로 실행 중일 때는 당연히 프로세스를 사용해서 처리를 한다.
하지만 I/O 작업 시에는 CPU는 아무 일을 하지 않고 놀고 있는 상태가 된다.
즉, 실행 중인 프로세스가 I/O 작업을 하는 동안에는
CPU가 아무것도 하지 않지 않고 가만히 있는 상태가 생겨 CPU 사용률이 좋지 않게 되는 것이다.
해결책
이를 해결하기 위해
여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자! 라는 아이디어가 나온다.
그러면 실행 중인 프로세스는 언제 다른 프로세스로 바뀌게 될까?
당연히 현재 실행 중인 프로세스에서 I/O 작업이 발생하면 다른 프로세스가 CPU에서 실행된다.
이런 종류의 시스템을 멀티프로그래밍(multiprogramming)이라고 한다.
멀티프로그래밍
멀티프로그래밍의 목적은 CPU 사용률을 극대화시키는데 있다.
멀티프로그래밍의 단점
근데 또 멀티프로그래밍도 단점이 있다.
CPU 사용시간이 길어지면 다른 프로세스는 계속 대기해야한다는 점이다.
P1 프로그램이 오랫동안 CPU를 사용하게 된다면
P2는 P1의 CPU 사용 작업이 끝날 때까지 기다렸다가 그 이후에 실행할 수 있다.
해결책
프로세스는 한번 CPU를 사용할 때
아주 짧은 시간(quantum)만 CPU에서 실행시키자! 라는 아이디어가 나온다.
이렇게 아주 짧은 시간동안만 각 프로세스들이 최대한 CPU를 사용할 수 있게 하는 것이다.
이런 종류의 시스템을 멀티태스킹(multitasking)이라고 한다.
멀티태스킹
멀티프로그래밍과 멀티태스킹의 차이
멀티태스킹은 멀티프로그래밍처럼 여러 프로그램을 실행시킨다는 점에서 유사하지만,
추가로 CPU 시간을 아주 짧게 쪼개서 해당 프로세스들이 번갈아가면서 실행시키도록 했다는 차이가 있다.
그렇기에 멀티태스킹의 목적은 프로세스의 응답 시간을 최소화시키는데 있다.
응답 시간을 최소화시켰다는 것은 즉각 반응하도록하여
일반 사용자가 느끼기에 여러 프로그램을 동시에 실행시키는 것처럼 느끼게 해준다.
멀티태스킹으로 아직 해결하지 못한 것들
여러 프로세스가 동시에 실행되는 것은 시스템 차원에서 지원을 하는데,
하나의 프로세스가 동시에 여러 작업을 수행하지는 못한다.
물론 여러 프로세스를 통해서 동시에 실행시킬 수 있지만,
여러 프로세스를 만들어서 실행시키면 여러 단점이 있다.
우선, 프로세스의 컨텍스트 스위칭은 무겁다.
컨텍스트 스위칭이란?
CPU에서 실행되기 위해서 어느 한 프로세스에서 다른 프로세스로 교체되는 것을 말한다.
또한 앞서 말했듯이 프로세스는 독립적인 메모리 공간을 가진다고 했다.
그렇기에 프로세스끼리 데이터 공유가 까다롭다.
마지막으로
듀얼 코어가 등장했는데 이를 잘 활용하고 싶었다.
이런 곳들을 해결하고자 등장한 것이 바로 스레드다.
스레드
스레드의 등장 배경이 한 프로세스 내에서 여러 개의 작업을 하기 위해서였고,
여러 개의 작업을 맡아서 해줄 녀석이 바로 스레드다.
그렇기에 스레드의 특징은
- 당연히 프로세스는 한 개 이상의 스레드를 가질 수 있다.
- CPU에서 실행되는 단위다.(unit of execution) 프로세스 -> 스레드로 변경되었다.
- 같은 프로세스의 스레드들끼리의 컨텍스트 스위칭 훨씬 가볍다.
- 자신들이 속한 프로세스의 메모리 영역을 공유한다.(이로 인해 컨텍스트 스위칭 가볍고, 메모리 공유가 쉬워졌다.)
싱글 스레드 vs 멀티 스레드 (메모리 구조 비교)
싱글 스레드(프로세스)
- 프로세스의 메모리 영역을 보여준다.
- Stack, Heap, Stack pointer, Program counter
멀티 스레드
- 멀티스레드가 있는 프로세스의 메모리 영역을 보여준다.
- 앞서 같은 프로세스에 있는 스레드들은 메모리를 공유한다고 했는데 그 영역이 Heap 영역을 공유한다.
- 스레드가 서로 공유하지 않고 자신만의 영역을 가지는데, 그곳이 Stack 영역이다.
- 그렇기에 각각의 stack 가리키는 stack pointer들이 있다.
- 각각의 스레드들에 대한 program counter들이 따로 있다.
Program Counter란?
다음 번에 실행되어야 할 명령어가 있는 메모리 주소를 가리킨다.
멀티스레딩
멀티스레딩의 목적은 하나의 프로세스가 동시에 여러 작업을 실행하는데 있다.
스레드의 등장으로 멀티태스킹의 개념이 확장됐다.
기존에는 프로세스끼리의 아주 짧은 시간 안에서의 스위칭이었지만,
이제는 여러 프로세스와 여러 스레드가 아주 짧게 쪼개진 CPU time을 나눠 갖는 것으로 확장되었다.
멀티프로세싱
두 개 이상의 프로세서나 코어를 활용하는 시스템을 멀티프로세싱이라고 한다.
상황별 맞춰보기
앞서 설명한 것들을 바탕으로 여러 상황에서 각각 멀티태스킹, 멀티스레딩, 멀티프로세싱인지를 확인해보자.
상황1. 싱글코어 CPU에 싱글-스레드 프로세스 2개인 경우
프로세스끼리의 경합을 한다. 멀티태스킹 O
하지만, 싱글스레드이기에 멀티스레딩 X
CPU 코어가 한 개이므로 멀티프로세싱 X
상황2) 싱글코어 CPU에 듀얼-스레드 프로세스 1개인 경우
멀티태스킹이 확장되면서 프로세스뿐만 아니라 스레드끼리의 스위칭도 포함되었다. 멀티 태스킹 O
한 개의 CPU를 가지고 두 개의 스레드가 경합을 하기에 멀티스레딩 O
하지만 싱글코어이기에 멀티프로세싱 X
상황3) 듀얼코어 CPU에 싱글-스레드 프로세스 2개인 경우
코어가 두 개여서 각각의 코어에 프로세스가 1개씩 붙는다. 따라서 멀티태스킹 X
싱글 스레드 당연히 멀티스레딩 X
하지만 코어가 2개이기에 멀티프로세싱 O
상황4) 듀얼코어 CPU에 듀얼-스레드 프로세스 1개인 경우
코어와 스레드가 일대일로 매핑되기에 경합하는게 없다. 멀티태스킹 X
하나의 프로세스 안에 2개의 스레드가 있기에 멀티스레딩 O
코어가 2개기 때문에 멀티프로세싱 O
상황5) 듀얼코어 CPU에 듀얼-스레드 프로세스 2개인 경우 (여러 경우가 존재)
한 프로세스의 스레드들은 한쪽 코어에 몰리는 경우
코어마다 스레드가 경합하고 있기에 멀티태스킹 O
한 프로세스의 2개의 스레드가 있다. 멀티스레딩 O
듀얼코어이기에 멀티프로세싱 O
코어가 각각의 프로세스의 스레드를 한 개씩 처리하는 경우
코어 하나당 2개의 스레드가 경합하고 있기 때문에 멀티태스킹 O
하나의 프로세스가 각각 2개의 스레드로 동작하고 있기에 멀티스레딩 O
듀얼코어 따라서 멀티프로세싱 O
참고
앞서 언급했던 스레드들은 User level 스레드가 아닌 OS level 스레드라는 점을 유의해주세요!
'운영체제' 카테고리의 다른 글
[운영체제] 왜 스레드 컨텍스트 스위칭이 더 빠른걸까? (feat. 프로세스 컨텍스트 스위칭) (1) | 2024.04.18 |
---|---|
[운영체제] 뭐만 하면 Asynchronous(비동기)를 붙이는데.. 그래서 비동기가 정확하게 어떤 의미일까? (feat. multi-threads, non-block I/O) (0) | 2024.04.18 |