Linux 환경에서의 스레드와 프로세스 간 통신

스레드 메커니즘 분석

스레드의 본질적 특성

스레드는 경량 프로세스로 프로세스 공간 내에 완전히 종속됩니다. 각 스레드는 독립적인 스택 영역(기본 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, "수집");

태그: POSIX 스레드동기화 프로세스통신 뮤텍스 세마포어

7월 16일 05:03에 게시됨