멀티 태스킹, 멀티 스레드, 멀티 프로세스는 무엇일까요?
각각의 정의는 아래와 같습니다.
멀티 프로세스: 하나의 프로그램을 다수의 프로세서가 다수의 프로세스를 동시에 처리하는 것
멀티 스레드: 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것
멀티 태스킹: 다수의 작업을 운영체제 스케줄링에 의해 번갈아가면서 처리하는 것
멀티 태스킹(Multi-tasking)
Task라는 개념은 프로세스의 개념보다 조금 확장된 개념입니다. 이러한 Task가 하나의 프로세서 상에서 운영체제의 스케줄링 방식에 따라 조금씩 번갈아가면서 수행되는 것이 멀티태스킹의 개념입니다.
그리고 멀티태스킹 환경에서 운영 체제는 프로세스 스케줄러를 사용하여 각 작업이 공정하게 CPU 시간을 할당받도록 하죠.
빠른 속도로 조금씩 번갈아 가면서 Task들을 조금씩 처리하다보면 유저가 느끼기에는 마치 '동시'에 처리되는 것처럼 보이기 때문에 붙은 이름입니다. 우리가 컴퓨터로 워드를 작성하면서 멜론 PC버전으로 노래를 들을 수 있는 것도 멀티 태스킹 때문이죠.
윈도우, macOS, 리눅스와 같은 현대 운영 체제는 모두 멀티태스킹을 지원합니다.
멀티 프로세스(Multi-process)
하나의 프로그램을 다수의 프로세서가 다수의 프로세스를 동시에 처리하는 것을 의미합니다.
장점
- 각 프로세스는 독립된 메모리 영역을 가지므로, 한 프로세스가 다른 프로세스의 메모리 영역을 침범하는 것을 OS 차원에서 방지할 수 있습니다.
- 각 프로세스는 독립된 메모리 공간을 가지고 있기 때문에, 여러 자식 프로세스 중 하나에 문제가 발생하더라도 다른 프로세스에는 영향을 미치지 않기 때문에 시스템의 안정성을 유지할 수 있습니다.
단점
- 각 프로세스가 독립된 메모리 영역 (Code, Data, Heap, Stack)을 가지고 있기 때문에 작업량이 많아지면 오버헤드가 발생함 문맥 전환(Context Switching) 시, CPU는 프로세스의 상태를 저장하고 복구하는 데 많은 시간을 소모하며, 이는 캐시 메모리 초기화 등 성능에 영향을 미칩니다.
- 프로세스 간의 통신은 IPC(Inter-Process Communication) 메커니즘을 통해 이루어지기 때문에 복잡하고 성능에 부정적인 영향을 미칠 수 있습니다.
💡 PCB (Process Control Block)
프로세스의 메타데이터들을 저장하는 블록으로, 각 프로세스별로 존재하는 자료 구조입니다. 프로세스의 상태, 프로세스 ID, 레지스터 정보, 메모리 관리 정보 등을 포함합니다.
💡 Context Switching?
CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 Context Switching이라 합니다.
구체적으로 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말합니다.
사용 예시
- 웹 브라우저(각 탭이 독립된 프로세스로 실행)
- 서버 애플리케이션(여러 작업을 독립된 프로세스로 실행).
웹 브라우저를 예로 들어볼 때 여러 개의 탭을 열어두었다고 가정해보겠습니다.
각 탭이 독립된 프로세스로 실행되면, 하나의 탭이 중단되거나 충돌하더라도 다른 탭에는 영향을 미치지 않습니다.
멀티스레드 (Multi thread)
멀티스레드는 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것을 의미합니다.
장점
- 스레드는 동일한 프로세스 내에서 메모리를 공유하므로, 전역 변수와 같은 자원에 접근이 용이하며, 통신 오버헤드가 적습니다.
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
이러한 장점이 멀티 프로세스 대신 멀티 스레드를 사용하는 이유이기도 합니다.
단점
- 주의 깊은 설계가 필요합니다.
- 디버깅이 까다롭습니다.
- 단일 프로세스 시스템의 경우 효과를 기대하기 어려울 뿐만 아니라 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있습니다.
- 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없기 때문에 스레드 간에 데이터를 안전하게 공유하기 위해서뮤텍스, 세마포어 등의 동기화 기법이 필요합니다.
- 다른 프로세스에서 스레드를 제어할 수 없습니다. (즉, 프로세스 밖에서 스레드 각각을 제어할 수 없어요.)
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받습니다.
프로세스 간의 Context-Switching 시에는 아래에서도 언급하겠지만 많은 자원 손실이 발생하게 됩니다.
그러나 스레드 간의 Context-Switching에서는 메모리를 공유하고 있는 만큼 부담을 덜 수 있죠.
멀티스레드의 장단점에서 꼭 짚고 넘어가야 할 점이 바로 Synchronization Issue라는 동기화 문제인데, 이에 대해 자세히 설명하면
멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될 지 그 순서를 알 수 없습니다.
만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있게 되죠.
이 처럼 여러 스레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 합니다.
스케줄링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하고, 디버깅 과정도 까다로워지므로 프로그래밍할 때 멀티스레드를 사용하려면 신중해야 합니다.
사용 예시
- 게임 엔진(그래픽 렌더링, 물리 계산 등을 병렬로 처리)
- 서버 애플리케이션(멀티 스레드로 클라이언트 요청 처리).
- Go 언어의 고루틴(Goroutine)
게임을 예로 들어보겠습니다. 게임에서는 그래픽 렌더링, 사용자 입력 처리, 네트워크 통신 등이 동시에 이루어져야 합니다.
멀티스레드를 사용하면 각 작업을 별도의 스레드에서 처리할 수 있습니다. 예를 들어, 한 스레드가 그래픽을 렌더링하는 동안 다른 스레드는 사용자 입력을 처리할 수 있습니다.
다른 프로세스의 정보에는 접근할 수 있을까요?
프로세스가 다른 프로세스의 정보에 접근하는 것은 가능합니다.
우리가 사용하는 대부분의 컴퓨터 프로그램을 생각해 보면 다른 프로그램에 있는 정보를 가져오는 경우는 심심치 않게 볼 수 있죠.
프로세스 간 정보를 공유하는 방법에는 다음과 같은 방법들이 있습니다만, 이 경우에는 단순히 CPU 레지스터 교체뿐만이 아니라 RAM과 CPU 사이의 캐시 메모리까지 초기화되기 때문에 앞서 말했듯 자원 부담이 커집니다.
- IPC(Inter-Process Communication)을 사용한다.
- LPC(Local inter-Process Communication)을 사용한다.
- 별도로 공유 메모리를 만들어서 정보를 주고받도록 설정해주면 된다.
멀티 프로세스와 멀티 스레드의 차이점
그럼 멀티 프로세스와 멀티 스레드에는 어떤 차이점이 있는지 알아봅시다.
멀티 프로세스: 독립적인 다수의 프로세스, 메모리 공간(코드, 데이터, 힙, 스택)을 공유하지 않음.
멀티 스레드: 하나의 프로세스 내에 존재하는 다수의 스레드, 메모리 공간(코드, 데이터, 힙)을 공유하지만, 스택 영역은 공유하지 않음
참조
https://goodmilktea.tistory.com/24
By I, Cburnett, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=2233446
b2connected
PaperCrafter
Heee's Development Blog
한국정보통신기술협회 IT 정보통신용어대사전
같이 보면 좋은 자료
'프로그래밍(Basic) > 이론' 카테고리의 다른 글
[바미] 자료구조 - Linked list (0) | 2024.07.08 |
---|---|
[바미] CPU 코어와 멀티태스킹, 멀티프로세스, 멀티스레드의 관계 (0) | 2024.06.30 |
[바미] 커널 (0) | 2024.06.28 |
[바미] CPU 스케줄링 알고리즘 (0) | 2024.06.13 |
[바미] 피터슨 알고리즘 (0) | 2024.06.12 |