스레드 메커니즘 분석
스레드의 본질적 특성
스레드는 경량 프로세스로 프로세스 공간 내에 완전히 종속됩니다. 각 스레드는 독립적인 스택 영역(기본 8MB)을 가지며, 텍스트 세그먼트, 데이터 영역, 힙 영역은 동일 프로세스 내에서 공유됩니다. 이 공유 구조는 통신 효율성을 보장하지만 자원 경쟁 위험을 동반합니다.
프로세스와 스레드 비교
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 공간 독립성 | 완전 분리 | 부분 공유 |
| 시스템 오버헤드 | 물리 주소 매핑 필요 | 동일 공간 내 전환 |
| 통신 방식 | IPC 메커니즘 필수 | 공유 메모리 직접 접근 |
스레드 생명주기 제어
int pthread_create(pthread_t *id, const pthread_attr_t *config,
void *(*entry_point) (void *), void *params);
- id: 스레드 식별자 저장
- config: 스레드 속성 설정
- entry_point: 실행 시작 함수
스레드 속성 관리
pthread_attr_t attr_config; pthread_attr_init(&attr_config); pthread_attr_setdetachstate(&attr_config, PTHREAD_CREATE_DETACHED);
PTHREAD_CREATE_JOINABLE: 수동 리소스 회수, PTHREAD_CREATE_DETACHED: 자동 회수
동기화 메커니즘
상호 배제 잠금
pthread_mutex_t resource_lock; pthread_mutex_lock(&resource_lock); // 크리티컬 섹션 pthread_mutex_unlock(&resource_lock);
교착 상태 방지 전략
- 잠금 순서 표준화
- 비차단형 pthread_mutex_trylock() 활용
세마포어 동기화
sem_t counter; sem_init(&counter, 0, 5); // 초기값 5 sem_wait(&counter); // 자원 획득 sem_post(&counter); // 자원 반환
프로세스 간 통신(IPC)
IPC 방식 비교
| 방식 | 특징 |
|---|---|
| 파이프 | 단방향 데이터 스트림 |
| 공유 메모리 | 고속 전송, 동기화 필수 |
| 메시지 큐 | 구조화된 데이터 교환 |
파이프 통신
int channel[2]; pipe(channel); // channel[0]: 읽기, channel[1]: 쓰기
익명 파이프: 부모-자식 프로세스 전용, 명명된 파이프: 임의 프로세스 접근 가능
실습 예제: 다중 스레드 제어
// 주 스레드가 A/B/C/D 입력으로 작업 스레드 제어
void* task(void *arg) {
while(1) {
printf("%s 스레드 실행 중\n", (char*)arg);
sleep(*(int*)arg);
}
}
// 스레드 생성 예:
pthread_create(&tid, NULL, task, "수집");