안녕하세요, 503입니다.
이번 발표스터디 3주차 주제로 Process와 Thread에 대해 정리해보려고 합니다.
먼저, Process와 Thread가 무엇인지 간단하게 설명해보면 아래와 같습니다.
프로세스(Process)는 운영체제로부터 자원을 할당받는 작업의 단위로 일반적으로 컴퓨터에서 실행중인 프로그램을 의미합니다. 독립적으로 Memory를 할당받으며, Data를 가집니다.
일반적인 프로그램은 프로세스 단위로 메모리에 적재가 되서 적재된 메모리를 사용자의 요청이 생길때마다 CPU가 가져가서 작업을 수행합니다.
초기의 컴퓨터에서 CPU에서 1개의 프로그램만 실행하며, 2개 이상의 프로그램을 실행하지 못했습니다. 즉, 다른 프로그램을 실행하기 위해서는 기존에 사용 중이던 프로그램 종료해야합니다.
한 컴퓨터에서 오직 한 프로그램만 실행이 가능하다니, 너무나도 비효율적이지 않습니까?
맞습니다. Single Process System
에서는 CPU에서 실행중인 프로세스가 IO(Input/Output) 작업을 하게 되면, CPU는 그 프로세스의 IO작업이 종료되기 전까지 오로지 대기합니다. 그리고 그 대기시간동안 CPU는 Resource(자원)를 낭비하게 되는 것입니다.
우리는 Single Process System
에서 낭비하는 CPU 자원을 막기 위해, IO 작업이 생길 경우 다른 프로세스를 CPU에 실행시켜 CPU의 대기시간을 줄이기로 합니다. 바로 멀티 프로그래밍(Multi Programming
)으로요!
멀티 프로그래밍은 CPU에서 실행중인 프로세스가 IO 작업이 생기면 그 동안 다른 프로세스를 CPU에서 실행시키는 방법을 의미합니다.
이를 통해 CPU의 대기 시간이 줄어들게 되고, CPU 자원의 낭비를 줄일 수 있게 되는 것입니다.
1개의 프로세스가 IO 작업 없이 CPU에서 계속 실행되고 있으면, 다른 프로세스는 실행되지 못하고 대기해야 하기 때문입니다. 이 경우 위의 Single Process System
과 크게 다르지 않음을 알 수 있습니다.
멀티 프로그래밍은 자원 낭비 문제를 개선하기도 했지만, 우리가 원하는 '동시에' 실행 시키는 방법과는 거리가 멀었습니다.
멀티 태스킹(
Multi Tasking
)은 CPU의 사용 시간을 굉장히 짧은 시간 단위(Time Slot
)로 분할하는 방법입니다.
task
는 어떤 정해진 일을 수행하기 위한 명령어의 집합으로 프로세스의 개념보다 조금 확장된 개념으로 볼 수 있습니다. 이러한 task가 하나의 CPU에서 운영체제의 스케줄링에 따라 조금씩 번갈아 가면서 수행되는 것이 멀티 태스킹(Multi Tasking
)입니다.
예시를 들어보겠습니다.
500ms씩 점유하는 2개의 프로세스가 있고, 1개의
Time Slot
을 10ms 라고 가정하겠습니다.
각 프로세스는 CPU에서 실행될 때 10ms의 단위로 반복해서 실행됩니다. 이는 멀티 프로그래밍(Multi Programming
)에 비해 프로세스의 실행시간이 체감상 느려졌지만, 2개의 Process가 '동시에' 실행되는 것처럼 느낄 수 있습니다.
각 프로세스는 최소한의 실행 시간을 보장하게되고, 1개의 프로세스만 CPU를 독점하는 상황을 방지하게 됩니다.
한 CPU를 여러 프로세스가 교대로 수행해야하기 떄문에, 이 시기의 프로그램들은 응답시간을 최소화시키는 것을 목적으로 하고 개발되었습니다.
여기까지의 내용을 정리해보면 하기와 같습니다.
즉, 멀티 프로그래밍(
Multi Programming
)은Single Process System
의 문제인 CPU 자원 낭비를 최소화하기 위해 교대로 실행하는 것이고, 멀티 태스킹(Multi Tasking
)은 한 프로세스의 독점을 막기 위해 정해진 시간동안 교대로 task를 수행하는 방법인 것입니다.
이처럼 우리는 1개의 코어로 멀티 태스킹(Multi Tasking
)을 이용하여 극단적으로 CPU를 활용해 여러 프로세스를 실행할 수 있게 되었습니다.
1개의 코어에서는 1개의 프로세스만 실행할 수 있고, 멀티 프로세스는 각 프로세스가 독립적인 메모리를 가지고 별도로 실행됩니다.
1개의 프로세스는 여러 작업을 수행하지 못합니다. 때문에 멀티 프로그래밍이나 멀티 태스킹에서 여러 작업을 수행하기 위해 1개의 CPU에서 프로세스를 교체하는 컨텍스트 스위칭(Context Switching
)이 일어나게 됩니다.
컨텍스트 스위칭(
Context Switching
)이란? 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 의미합니다.
프로세스는 독립적인 Memory를 할당받기 떄문에 프로세스간 데이터 공유가 까다로운 단점을 가지고 있습니다. 떄문에 컨텍스트 스위칭이 자주 일어나 주소 공간의 공유가 잦아지면 오버헤드가 발생하고, CPU에 부하가 가게 되어 성능이 저하됩니다. 하나의 코어에 여러 프로세스가 올라갔을 때, 계속적으로 읽어야하는 메모리 영역이 스위칭되니까 cost가 부담되는 것입니다. 또한, 하드웨어적인 문제(발열)도 발생하기 시작합니다.
아니 그러면 여러 작업을 처리할 수 있게 CPU나 코어를 늘리면 되지 않습니까?
이처럼 많은 작업을 하나의 CPU가 처리하려고 하니 많은 시간이 걸립니다. 따라서 빠른 시간안에 많은 작업을 처리하기 위해서는 여러 개의 CPU가 하나의 작업을 '병렬처리'하는 것이 효율적입니다.
멀티 프로세싱(
Multi Processing
)은 단어 그대로 하나 이상의 프로세서(CPU)가 하나 이상의 작업을 처리하는 것을 가리킵니다.
보통 하나의 프로세서가 하나의 작업을 맡지만, 멀티 프로세싱은 다수의 프로세서가 다수의 작업을 함께 처리하는 것입니다. 물론 여러 개의 CPU가 하나의 컴퓨터에 있을 수도 있고, 여러 대의 컴퓨터가 있을 수도 있습니다. 따라서 멀티프로세싱의 개념은 컴퓨터로 나누기보다 여러 개의 CPU가 작업을 병렬(동시에) 처리하는 것으로 정의하는 것이 정확합니다.
멀티 프로세싱은 독립된 구조로 높은 안정성을 갖고 있으며, 한 프로세스에 문제가 생겨도 다른 Process에 영향을 주지 않습니다. 작업 속도가 느려질 수는 있으나 멈추는 현상은 발생하지 않습니다.
이렇게 Scale Up으로 구성된 CPU의 한계치를 극복하기 위해서 cale Out으로 개선을 하고자 멀티 코어(Dual Core
) 시스템이 나오게 됩니다. 이런 멀티코어 시스템에 맞춰서 단순 프로세스 개념에서 쓰레드(Thread
)라는 개념까지 등장하게 됩니다.
스레드(
Thread
)란? 프로세스가 할당받은 자원을 이용하는 실행의 단위입니다.
한 개의 프로세스 당 최소 1개 이상의 스레드를 가질 수 있습니다.
멀티 코어 시스템 개념이 등장하면서 여러 코어에서 작업 수행이 가능해졌기 때문에 1개의 코어로 작업을 수행할 때 가지는 단점들을 케어할 수 있게 되었습니다.
기존에는 1개의 프로세스에서 1개의 스레드만 사용하여 여러 작업을 수행하지 못했으나, 이제는 1개의 프로세스에서 멀티 스레드(Multi Thread
)를 사용하여 효율을 증가시켰습니다.
멀티 스레드(
multi thread
)란 하나의 프로세스 내에서 둘 이상의 스레드가 '동시에' 작업을 수행하는 것을 의미합니다.
이러한 멀티 스레드 환경이 개발되면서 CPU에서 실행되는 단위(unit of Execution
)가 프로세스에서 스레드로 변경되게 됩니다.
프로세스 간에는 데이터 공유가 까다로웠지만, 스레드는 메모리 영역을 공유하기 때문에 동일한 메모리 영역에 스레드만 스위칭하면서 cost를 낮출 수 있습니다.
프로세스는 메모리를 공유하지 않지만, 한 프로세스 내에 있는 멀티 스레드는 자신이 속한 프로세스의 메모리를 공유합니다. 스레드는 메모리에서 Core
, Data
, Heap
영역만 공유하며 Stack
영역은 스레드마다 고유의 영역을 가집니다.
즉, 프로세스 단위로 작업을 수행하는 것보다 스레드 단위로 코어에서 작업을 수행하면 자원을 더 아낄수 있게 됩니다.
Dual Core와 Multi Thread의 등장 덕분에 멀티 태스킹에 대한 개념이 확장되었고, 멀티 프로세스와 멀티 스레드가 짧은 단위의 시간으로 분할된 Time Slot
을 나눠서 사용하게 되었습니다.
위에서 언급했듯이 멀티 스레딩(Multi Threading
)은 1개의 프로세스에서 2개 이상의 스레드가 코어에게 할당되어 동작합니다.
멀티 스레딩은 '동시에' 여러 작업을 수행하는 것을 목적으로 가집니다.
2개 이상의 스레드가 1개의 코더에 할당되는 경우는 멀티 태스킹(Multi Tasking
)과 동작은 동일합니다. 하지만 여러 코어에서 '병렬적'으로 스레드가 실행되기 때문에 기존의 멀티 태스킹에 대한 단점(다중 작업 수행x, 컨택스트 스위칭, 발열 등)을 극복할 수 있게 되는 것입니다.
Multi Process와 Multi Thread로 구현한 프로그램을 비교해보면서 설명해보겠습니다.
각 Process는 독립적인 메모리를 가지고 별도로 실행됩니다.
때문에 멀티 프로세스로 구현한 프로그램은 프로그램 자체가 무거워지는 단점이 생기지만, 확실한 안정성을 보장합니다.
프로그램을 CPU에서 작업을 수행할 때, 코어에게 분산되서 수행하게 됩니다. (멀티 코어기준) 이 때, 부모 프로세스가 자식 프로세스를 여러 개 만들고, 각 프로세스마다 독립적으로 메모리를 포함한 독립적인 Resource
영역을 할당받고 실행하도록 만듭니다.
코어에 대한 분배는 OS가 CPU 코어를 감시하면서 여유가 되는 코어에게 할당해주므로 각기 다른 CPU 코어에 분배되기도, 1개의 코어에 분배되어 작업을 수행하기도 합니다.
각 스레드는 자신이 속한 프로세스의 메모리를 공유합니다.
멀티 스레드로 구현된 프로그램은 낮은 자원을 요구하는 프로그램이기 때문에 안정성보다는 속도와 경량화를 중시합니다.
프로세스 1개가 Resource
영역을 갖고 있으며, 다른 채팅방을 열더라도 별도의 Resource
를 할당하지 않습니다.
멀티 스레딩으로 구현된 프로세스의 경우 1개의 코어에 몰리는 경우가 있지만 개발하기 나름입니다.
물론, 각 프로그램마다 특성이 있기 때문에 특성에 맞춰 Multi Processing / Multi Threading을 효율적으로 사용하는 것이 중요합니다.
Multi Programming(멀티 프로그래밍)
- 1개의 CPU에서 여러 Process를 교대로 수행
- 자원 낭비를 최소화하지만 구조적인 단점으로 Single Process와 크게 다르지 못함
Multi Tasking(멀티 테스킹)
- 1개의 CPU에서 여러 task를 정해진 시간(
Time Slot
) 동안 교대로 수행 (동시에 실행되는 것처럼 느낌)- 1개의 프로세스만 CPU를 독점하는 상황을 방지
- 다중 작업을 수행x, 컨택스트 스위칭에 의한 부하나 하드웨어 문제(발열)가 발생
- ex. 카톡을 켜놓고 동시에 youtube로 음악을 들으면서 온라인 뱅킹 업무를 함
Multi Processing(멀티 프로세싱)
- 여러 개의 CPU에서 1개 이상의 작업을 병렬 처리 (동시에 수행)
- 독립된 구조로 작업 속도가 느려지는 단점이 있지만 높은 안정성 보장
- 여러 개의 완전한 처리 장치들을 포함
- ex. 다수의 송금거래를 동시에 처리하는 은행전산 시스템
Multi Threading(멀티 스레딩)
- 하나의 Process 내에서 2개 이상의 Thread가 core에 할당되어 동작
- 동시에 여러 작업을 수행하는데 목적을 가짐.
- 스레드 수준 뿐 아니라 명령어 수준의 병렬처리에 신경을 쓰면서 하나의 코어에 대한 이용성을 증가
- ex. 프로그램 안에서 실행되는 코드 흐름이 여러개
멀티 스레딩은 프로그램 안에서 병렬 처리의 이점이 있지만, 멀티 프로세싱은 여러개의 프로그램들을 병렬로 처리할 수 있다.
- Thread 1개 => Multi Tasking
CPU의 분할된Time Slot
을 Process가 나눠서 사용- Thread 2개=> Multi Tasking, Multi Threading
CPU의 분할된Time Slot
을 Thread가 나눠서 사용
- Process 2개, Thread 1개 => Multi Processing
CPU의Time Slot
을 분할하지 않고, 각각의 Core에서 각각의 Process가 실행- Process 1개, Thread 2개 => Multi Processing, Multi Threading
CPU의Time Slot
을 분할하지 않고, 각각의 Core에서 각각의 Thread가 실행
- Process 2개, Thread 2개 => Multi Tasking, Multi Threading
2개 CPU의 총 4개의 Thread가 2개씩 각 Core에 할당되어 분할된Time Slot
을 나눠서 사용