프로세스와 스레드의 차이 정리
시스템 프로그래밍을 하다 보면 자주 마주치는 개념이 바로 프로세스(Process) 와 스레드(Thread) 이다. 두 개념은 모두 실행의 단위이지만, 메모리 구조와 데이터 공유 측면에서 큰 차이가 있다. 이 글에서는 이 둘의 차이를 명확히 정리한다.
1. 프로세스란?
프로세스는 실행 중인 프로그램을 의미하며, 운영체제에서 독립적인 메모리 공간을 갖는 단위이다. 각각의 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역을 가지며, 이 메모리 공간은 다른 프로세스와 완전히 분리되어 있다. 이러한 격리 덕분에 하나의 프로세스에서 발생한 오류나 충돌이 다른 프로세스에 영향을 미치지 않는다.
하지만 동시에 이 말은 기본적으로 프로세스 간에는 데이터를 직접 공유할 수 없다는 뜻이기도 하다. 만약 데이터를 주고받아야 한다면, 별도의 통신 방식(IPC, Inter-Process Communication)을 사용해야 한다.
2. 스레드란?
스레드는 프로세스 내에서 실행되는 작업 흐름의 최소 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이들은 같은 프로세스의 메모리 공간을 공유한다. 구체적으로, 코드 영역, 데이터 영역, 힙 영역은 공유하지만, 스택 영역은 각 스레드가 독립적으로 가진다.
이러한 구조 덕분에 스레드 간에는 데이터를 주고받기 쉽고, 컨텍스트 스위칭 비용도 낮아 성능 측면에서 유리한 경우가 많다. 하지만 메모리를 공유하기 때문에 동기화 문제가 발생할 수 있으며, 이를 방지하기 위한 락(lock) 등의 메커니즘이 필요하다.
3. 비교 정리
항목 프로세스 스레드
메모리 공간 | 완전히 독립적 | 대부분 공유 (스택 제외) |
데이터 공유 | 불가능 (IPC 필요) | 기본적으로 가능 |
실행 단위 | 프로그램 단위 | 작업 흐름 단위 |
안정성 | 높음 (격리됨) | 낮음 (경쟁 조건 발생 가능) |
자원 소모 | 상대적으로 큼 | 상대적으로 적음 |
4. 임베디드 시스템에서 멀티 프로세싱의 한계
멀티프로세싱이란?
여러 개의 독립된 프로세스를 동시에 실행하는 구조를 말합니다. 일반적인 데스크탑/서버 운영체제에서는 흔한 구조지만, 임베디드 시스템에서는 제한적으로 사용되거나 아예 사용되지 않는 경우도 많습니다.
주요 이유: 자원의 제약
1. 메모리 제한
- 임베디드 시스템은 RAM이 수 MB, 심하면 수십 KB 수준으로 매우 적을 수 있습니다.
- 각각의 프로세스는 고유의 메모리 공간(코드, 힙, 스택 등)을 요구하기 때문에, 여러 개의 프로세스를 동시에 운영하면 메모리 부족 문제가 쉽게 발생합니다.
2. CPU 성능 한계
- 싱글코어 CPU이거나, 클럭이 낮은 저전력 CPU가 대부분입니다.
- 멀티프로세스를 운영할 만큼의 연산 여유가 없습니다.
3. 스토리지 제약
- 많은 임베디드 장치는 플래시 기반의 제한된 저장공간을 사용하며, 가상메모리나 스왑을 활용한 운영이 어렵습니다.
4. 리소스 충돌과 관리 복잡성
- 여러 프로세스가 동시에 I/O 자원(예: GPIO, SPI, UART)을 사용할 경우 충돌이 발생할 수 있고, 이를 관리하려면 커널 수준에서 복잡한 동기화가 필요합니다.
5. RTOS 또는 단일 루프 기반 운영
- 많은 임베디드 시스템은 멀티프로세스를 전제로 하지 않는 RTOS(실시간 운영체제)나 단일 메인 루프 구조로 설계됩니다. 이 구조는 응답성과 예측 가능성을 우선시하며, 멀티프로세싱보다는 멀티스레딩이나 상태 기반 처리로 대체됩니다.
5. 마무리
- 프로세스는 독립적이고 안정적인 실행 단위이며, 기본적으로는 서로 데이터를 공유하지 않는다.
- 프로세스 간 데이터를 공유하기 위해서는 IPC(Inter Proccess Communication) 방식을 사용해야 한다.
- 스레드는 같은 프로세스 내에서 동작하는 실행 흐름 단위로, 메모리를 공유해 효율적으로 협업할 수 있지만, 동시에 동기화 문제가 생길 수 있다.
- 실제 시스템 설계 시에는 성능과 안정성, 구현 난이도를 고려하여 프로세스와 스레드를 적절히 선택해야 한다.
이해를 돕기 위해 향후에는 실습 예제와 함께 각각을 다뤄볼 예정이다.
'Linux > Kernel' 카테고리의 다른 글
Kernel) QEMU와 Buildroot로 ftrace 실습 환경 만들기 (1) | 2025.05.24 |
---|---|
Kernel) 디버깅을 연습을 위한 환경 셋팅(x86 환경) (0) | 2025.05.19 |
Kernel) 커널 동기화 (0) | 2025.05.15 |
Kernel) Interrupt, Interrupt handler, Interrupt context (0) | 2025.05.15 |
Kernel) Context와 Context Switch란 무엇인가 (0) | 2025.05.14 |