| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- jenkins
- intents
- layouts
- memcmp
- 문자형 디바이스 파일
- 환경 변수
- sscanf
- DMA
- ubuntu
- 멀티프로세싱
- 젠킨스
- fscanf
- 프레임버퍼
- usb2.0
- interrupt handler
- interrupt context
- context
- activities
- 속도저하
- Shared Folder
- 소캣
- fprintf
- 디스크립터
- makefile
- pagefile.sys
- 디스크 축소
- context switch
- HDR
- gparted
- sprintf
- Today
- Total
do{학습}while
Kernel) 프로세스 VS 스레드 본문
프로세스와 스레드의 차이 정리
시스템 프로그래밍을 하다 보면 자주 마주치는 개념이 바로 프로세스(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 |