안녕하딤니카?
이번 글에서는 저번 글에 이어서 프로세스를 이어서 작성할 건데
이번에는 좀 다르게 스레드의 개념을 정리하면서, 멀티스레드와 멀티프로세스가 어떻게 다른지를 중점적으로 정리해보고자 합니다.
눈이 많이 오는데 다들 미끄덩 조심하시고
그럼 시~~~작 (저도 피크민 하다가 미끄덩할뻔했어요 다들 조심

1. 스레드 (Thread)
먼저 스레드(Thread)는 프로세스를 구성하는 실행 흐름의 단위입니다. 하나의 프로세스는 하나 이상의 스레드를 가질 수 있고, 한 프로세스를 여러 개의 스레드로 동시에 실행할 수 있습니다.

실행 흐름이 하나인 프로세스를 단일 스레드 프로세스라고 부르고, 실행 흐름이 두 개 이상인 프로세스를 멀티 스레드 프로세스라고 합니다. 우리가 실행하는 프로그램은 대부분 멀티 스레드로 구현됩니다. 이 말인즉슨, 프로세스를 이루는 여러 명령어를 동시에 실행 가능하다라고 정리할 수 있습니다.
그러면 스레드가 어떻게 구성되어 있길래 멀티 스레드로 프로그램이 구현될까요?
1-1. 스레드의 구성 요소
스레드의 구성 요소를 정리해 보겠습니다. 하나의 스레드는 프로세스 내에서 각기 다른 값을 가지고 있는 스레드 ID, 프로그램 카운터를 비롯한 여러 가지 레지스터 값, 스택처럼 실행에 필요한 최소한의 정보를 가지고 있습니다.

여기서 중요한 점은, 하나의 프로세스를 이루는 스레드들은 프로세스의 자원을 공유하면서 실행된다는 점입니다. 예를 들어, 위의 그림처럼 스레드 1, 2, 3은 모두 똑같은 코드 영역을 공유하고 있습니다. 데이터 영역, 힙 영역, 스택 영역도 마찬가지로 여러 개의 스레드가 이 영역을 공유하고 있습니다. 그리고 만약 이 프로세스가 어떤 파일을 열었다고 한다면, 그 프로세스의 모든 스레드들은 그 열린 파일에 접근할 수 있습니다.
리눅스 운영체제에서는 프로세스와 스레드를 구분해서 쓰지 않습니다. 프로세스와 스레드는 그냥 "실행의 문맥"일 뿐이라고 합니다. 이 둘을 합쳐서 태스크(Task)라는 용어를 사용합니다. 그리고 요즘에는 CPU한테 처리해야 될 작업을 전달할 때, 프로세스 단위로 전달하지 않고 스레드 단위로 전달한다고 합니다. (전공서 기준에서는 프로세스 단위로 처리해야 할 작업을 CPU에게 전달하는 것이 많지만, 실제로 운영체제를 들여다보면 스레드 단위로 전달하는 경우가 많다고 하네요. 그냥 참고!)
아무튼, 아직까지도 많은 운영체제에서는 프로세스와 스레드를 구분해서 사용합니다. 그래서 프로세스와 스레드가 어떻게 구분되는지, 스레드의 구성 요소에 대해서 알아둬야 합니다.
2. 멀티 프로세스와 멀티 스레드의 차이점
그러면 동일한 작업을 수행하는 단일 스레드의 프로세스가 여러 개 실행되는 것(멀티 프로세스)과, 하나의 프로세스를 여러 개의 스레드로 실행하는 것(멀티 스레드)은 어떤 차이가 있을까요?

위의 그림에서, 왼쪽이 멀티 프로세스 실행 상태고, 오른쪽이 멀티 스레드 실행 상태입니다. 실행 방식은 다르지만, 두 개의 실행 결과는 모두 "hello, os" 문자열이 3번 출력되는 동일한 결과가 될 것입니다. 결과는 같지만 이 두 실행 방식에는 아주 큰 차이가 있습니다.
기본적으로 다른 프로세스끼리는 남남처럼 자원을 공유하지 않습니다. 멀티 프로세스는 프로세스를 fork 하면 코드 / 데이터 / 힙 영역 등 모든 자원이 복제되어 저장됩니다. 이 상태는 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재되는 것입니다. 위처럼 멀티 프로세스로 3개의 프로세스가 병행 실행되게 하려면 fork를 3번 하는 것입니다.
(이렇게 하지 않으려면 쓰기 시 복사(copy on write) 기법을 사용하면 되는데, 이건 추후 페이징 기법 글에서 상세히 정리해보려고 합니다.)
반면 우측처럼 멀티 스레드 방식이라면 여러 개의 스레드는 한 프로세스 내의 자원을 공유합니다. 스레드 ID값은 서로 다르지만, 하나의 PID를 가지면서 같은 영역 안에서 필요한 정보를 저장하면서 프로세스 내의 자원을 공유합니다.
정리하자면, 프로세스끼리는 자원을 공유하지 않습니다. 남남처럼 독립적으로 실행됩니다. 반면, 스레드는 프로세스의 자원을 공유합니다. 그래서 협력과 통신에 유리합니다. 이렇게 보면 무조건 멀티 스레드 환경이 더 좋아 보이는데, 때로는 자원을 공유하는 것이 문제가 될 수도 있습니다. 멀티 프로세스 환경의 경우, 자원을 공유하지 않기 때문에 자원 하나가 문제가 생겨도 다른 프로세스의 실행에는 지장이 거의 없거나 적습니다. 하지만, 멀티 스레드 환경에서는 자원 하나가 문제가 발생된다면 전체 프로세스에 문제가 발생할 수 있습니다.
프로세스 간의 통신이 그럼 아예 불가능한 것인가는 또 아닙니다. 프로세스 간의 통신은 IPC(Inter Process Communication)을 통해 프로세스 간의 자원을 주고받을 수 있습니다. 대표적으로는 파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신이 있습니다.
3. 정리
이렇게 이번 글에서는 스레드의 개념, 스레드의 구성 요소, 멀티 프로세스와 멀티 스레드의 차이점에 대해서 정리해 봤습니다. 멀티 프로세스 프로그래밍과 멀티 스레드 프로그래밍 중 선택해야 할 때, 이러한 두 개의 환경의 특징을 알고 있어야 빠르게 선택할 수 있을 것입니다.
이번 글은 여기서 마무리하겠습니다. 그럼 20000~
[자료 출처]
강민철, 《혼자 공부하는 컴퓨터 구조+운영체제》, 한빛미디어, 2022
인프런 - 개발자를 위한 컴퓨터공학 1 : 혼자 공부하는 컴퓨터구조 + 운영체제
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
백엔드 개발자가 되고 싶어서 열심히 헤딩 중인 재영입니다 :-)
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Study > 컴퓨터구조, 운영체제' 카테고리의 다른 글
| 프로세스의 동기화, 동기화 기법에 대해 정리해보자 (0) | 2025.01.10 |
|---|---|
| CPU 스케줄링과 알고리즘을 정리해보자 (0) | 2025.01.08 |
| 프로세스 상태와 계층 구조에 대해 정리해보자 (0) | 2025.01.07 |
| 프로세스의 개요와 PCB, 메모리 영역에 대해 정리해보자 (0) | 2025.01.07 |
| RAID의 정의와 종류를 정리해보자 (0) | 2025.01.05 |