스레드(Thread): 프로세스 안의 실행 단위
- 1. 스레드란?
- 2. 왜 스레드를 사용할까?
- 3. 스레드의 구성 요소
- 4. 스레드의 상태 변화
- 5. 스레드의 종류
- 6. 스레드 생성 (C POSIX pthread)
- 7. 스레드 사용 시 주의할 점
- 8. 스레드와 프로세스 비교
- 9. 활용 예시
- 10. 더 알아보기
1. 스레드란?
스레드(Thread)는 프로세스(Process) 내에서 실제로 작업을 수행하는 실행 단위다.
- 하나의 프로세스는 최소 하나 이상의 스레드를 가진다
- 스레드들은 프로세스의 메모리 공간(코드·데이터·힙·파일 디스크립터 등)을 공유한다
- 하지만 각 스레드는 자신의 레지스터 집합과 스택을 별도로 가진다
정리하면, 프로세스는 리소스를 가진 실행 단위이고, 스레드는 그 안에서 실행 흐름을 가진 실행 단위다.
2. 왜 스레드를 사용할까?
| 이유 | 설명 |
|---|---|
| 성능 개선 (병렬성) | CPU 코어가 여러 개면 여러 스레드를 동시에 실행해 작업 속도를 높인다 |
| 리소스 공유 | 같은 프로세스 내 스레드는 메모리를 공유하므로, IPC보다 가볍고 빠른 통신이 가능하다 |
| 응답성 향상 | 메인 스레드는 입력을 받고 다른 스레드가 처리를 맡으면 시스템 응답성이 좋아진다 |
3. 스레드의 구성 요소
각 스레드는 다음을 가진다.
| 구성 요소 | 설명 |
|---|---|
| Thread ID | 스레드를 식별하는 고유 ID |
| Program Counter | 다음에 실행할 명령어의 주소 |
| Registers | 현재 작업에 필요한 데이터 저장 |
| Stack | 함수 호출 정보, 지역 변수 저장 |
| State | 실행 상태 (Running, Ready, Blocked 등) |
참고로 코드 영역·데이터 영역·열린 파일들은 같은 프로세스 내 스레드끼리 공유한다.
4. 스레드의 상태 변화
스레드는 다음 순서로 상태가 바뀐다.
New → Ready → Running → (Blocked 또는 Terminated)
↑ ↓
(Unblocked, I/O 완료 시)
| 상태 | 의미 |
|---|---|
| New | 생성됨 |
| Ready | CPU를 기다림 |
| Running | CPU를 점유해 실행 중 |
| Blocked | 입출력 등으로 대기 |
| Terminated | 작업을 완료하고 종료 |
Running 상태에서 I/O를 만나면 Blocked가 되고, I/O가 끝나면(Unblocked) 다시 Ready로 돌아간다.
5. 스레드의 종류
| 종류 | 관리 주체 | 특징 |
|---|---|---|
| 사용자 수준 (ULT) | 사용자 라이브러리(예: pthread) | 커널이 존재를 모름. 컨텍스트 스위칭이 빠르지만(커널 호출 없음), 하나가 Block되면 전체가 Block될 수 있음 |
| 커널 수준 (KLT) | 커널 | 하나가 Block돼도 다른 스레드는 계속 실행 가능. 단, 스케줄링마다 커널모드 진입/탈출이 필요해 느릴 수 있음 |
| 하이브리드 (2-Level) | ULT + KLT 조합 | 두 방식의 장점을 살림 |
6. 스레드 생성 (C POSIX pthread)
#include <pthread.h>
#include <stdio.h>
void *myThreadFunc(void *arg) {
printf("Thread 실행 중\n");
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, myThreadFunc, NULL);
pthread_join(tid, NULL); // main 스레드가 tid 스레드 종료를 기다림
return 0;
}
pthread_create: 새로운 스레드 생성pthread_join: 생성된 스레드가 끝날 때까지 대기
7. 스레드 사용 시 주의할 점
| 문제 | 설명 | 해결 방법 |
|---|---|---|
| 경쟁 조건 (Race Condition) | 여러 스레드가 동시에 같은 데이터를 수정할 때 발생하는 오류 | 뮤텍스, 세마포어, 락 사용 |
| 데드락 (Deadlock) | 둘 이상의 스레드가 서로 자원을 기다리며 영원히 멈춤 | 자원 할당 순서 지정, 타임아웃 적용 |
| 기아 (Starvation) | 한 스레드가 자원을 독점해 다른 스레드가 기회를 못 얻음 | 공정성 보장 스케줄링 |
8. 스레드와 프로세스 비교
| 항목 | 프로세스 | 스레드 |
|---|---|---|
| 메모리 | 각각 독립 | 공유 |
| 생성 비용 | 크다 | 작다 |
| 통신 비용 | IPC (느림) | 메모리 공유 (빠름) |
| 오류 전파 | 프로세스끼리 독립 | 하나가 죽으면 전체 프로세스에 영향 가능 |
9. 활용 예시
- 웹 서버: 요청마다 스레드 하나 생성
- 게임 엔진: 물리·렌더링·네트워크 처리를 각각 다른 스레드에서 수행
- 멀티미디어 앱: 음악 재생, 동영상 디코딩, 자막 처리를 별도 스레드로 처리
한 프로세스 안에 여러 스레드가 존재하며, 이들은 같은 메모리·열린 파일을 공유한다. “프로세스는 자원을 가진 집, 스레드는 집 안에서 일하는 사람” 으로 이해하면 좋다.
10. 더 알아보기
더 깊은 내용은 스레드(Thread) 심화에서 다룬다.