공부해요/운영체제

프로세스와 스레드(2)

yenas0 2024. 10. 3. 12:22
반응형

스레드의 개념과 특성

스레드는 프로세스 내에서 독립적으로 실행되는 가벼운 실행 단위임. 스레드는 동일한 프로세스 내에서 실행되며, 프로세스 자원을 공유함으로써 자원 사용이 효율적임. CPU 스케줄링에서 프로세스보다 더 가볍게 다뤄지며, 병렬 처리를 가능하게 함. 다수의 스레드가 같은 프로세스 내에서 동작하기 때문에 컨텍스트 전환이 빠르고, 메모리 사용이 절감됨.

 

 

스레드의 종류

  • 사용자 수준 스레드(User-level thread, n:1 모델): 커널에서 직접 인식되지 않고 사용자 영역에서만 관리됨. 커널 개입이 없으므로 전환이 빠르지만, 하나의 스레드가 블로킹되면 프로세스 전체가 블로킹될 수 있음.
  • 커널 수준 스레드(Kernel-level thread, 1:1 모델): 커널이 직접 스레드를 관리하고, 전환도 운영체제가 처리함. 스레드 간 전환 비용이 높지만, 시스템 자원을 보다 세밀하게 관리할 수 있음.
  • 다중 스레드(Multiplexed thread, n모델): n개의 사용자 스레드가 m개의 커널 스레드에 매핑되어 효율성을 극대화하는 모델임. 커널 개입이 최소화되어 있으면서도 커널 수준의 효율적인 관리가 가능함.

 

 

스레드 제어 블록 (TCB, Thread Control Block)

스레드는 TCB에 의해 관리됨. 여기에는 스레드의 실행 상태, 프로그램 카운터, 레지스터 값, 메모리 스택 정보 등이 저장됨. 이 블록을 통해 커널이나 라이브러리는 스레드의 상태를 추적하고, 필요한 경우 스레드를 멈추거나 재개함.

 

 

 

pthreads: POSIX 스레드 표준

pthreads는 POSIX에서 정의된 스레드 표준으로, 다양한 운영체제에서 사용됨. Linux, macOS 등에서 지원되며, 멀티스레드 프로그램에서 주로 사용됨.

  • 주요 함수:
    • pthread_create(): 새로운 스레드를 생성하는 함수로, 스레드의 실행 코드를 전달받아 실행함.
    • pthread_exit(): 스레드 실행을 종료함.
    • pthread_join(): 특정 스레드가 종료될 때까지 기다리는 함수.
    • pthread_yield(): 현재 스레드가 CPU를 다른 스레드에게 양보함.

 

 

스레드의 수명 주기

스레드는 생성, 실행, 대기, 종료의 수명 주기를 가짐. 이를 pthread_create(), pthread_join(), pthread_exit() 등을 사용하여 제어함. 스레드가 완료되면 종료되며, 자원이 해제됨.

 

 

 

Thread Local Storage (TLS)

TLS는 각 스레드가 고유한 데이터를 보유할 수 있는 스레드별 저장소임. 이를 통해 스레드 간 데이터를 공유하지 않고 독립적인 변수를 관리할 수 있음. 주로 멀티스레드 프로그램에서 스레드 간 데이터 경합을 방지하고, 안전하게 데이터를 처리할 수 있도록 도움을 줌.

 

 

 

프로세스 모델과 스레드 모델의 차이

  • 프로세스 모델: 각 프로세스는 독립된 메모리 공간을 가지며, 독립적인 실행 단위로서 다른 프로세스와 자원을 공유하지 않음. 안전하지만 메모리와 CPU 자원을 많이 사용함.
  • 스레드 모델: 여러 스레드가 동일한 프로세스 내에서 실행되며, 메모리를 공유함으로써 자원 사용이 효율적임. 그러나 동시성 문제로 인해 동기화가 필요할 수 있음.

 

 

 

스레드 풀(Thread Pool)

스레드 풀은 미리 일정 수의 스레드를 생성해두고, 작업 요청이 있을 때 이를 재사용하는 방식임. 이렇게 하면 스레드를 자주 생성하고 제거하는 비용을 줄일 수 있으며, 서버 환경에서 특히 유용함. 스레드 풀은 웹 서버, 데이터베이스 서버 등에서 성능 향상을 위해 많이 사용됨.

 

 

 

동기화와 자원 보호

멀티스레드 프로그램에서 스레드 간 자원 접근을 동기화하지 않으면 데이터 경합(Race Condition) 문제가 발생할 수 있음. 이를 해결하기 위해 상호 배제(Mutex), **세마포어(Semaphore)**와 같은 동기화 기법을 사용함. Mutex는 하나의 스레드만 특정 자원에 접근할 수 있도록 제한하며, 세마포어는 여러 스레드의 자원 접근을 제어하는 데 사용됨.

 

 

 

스레드 실행 모델의 확장

스레드는 다양한 환경에서 확장 가능한 모델로 사용됨. 특히 대규모 웹 서버나 데이터 처리 환경에서는 스레드 풀링을 통해 성능을 높임. 스레드 풀은 미리 생성된 스레드를 재사용함으로써 새로운 스레드를 생성하는 오버헤드를 줄임. 이를 통해 시스템 성능을 향상시킬 수 있음.

 

 

 

Thread Local Storage(TLS)의 활용

TLS는 멀티스레드 환경에서 각 스레드가 독립적인 데이터를 저장하고 관리할 수 있는 방법임. 주로 스레드가 서로 다른 데이터를 필요로 하는 상황에서 유용함. 예를 들어, 각 스레드가 고유한 사용자 세션 데이터를 처리하는 경우 TLS를 활용할 수 있음. 이를 통해 데이터 충돌을 방지하고, 안전한 데이터 처리가 가능함.

 

 

 

 

스레드와 TLS 사용

  • 스레드 예제: 스레드를 생성하고, 각 스레드가 특정 작업을 수행하도록 만드는 기본적인 C 코드 예시.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void* calcThread(void *param);
int sum = 0;

int main() {
    pthread_t tid;
    pthread_attr_t attr;

    pthread_attr_init(&attr);
    pthread_create(&tid, &attr, calcThread, "100");

    pthread_join(tid, NULL);
    printf("sum = %d\n", sum);
    return 0;
}

void* calcThread(void *param) {
    int i;
    int to = atoi(param);
    for (i = 1; i <= to; i++) {
        sum += i;
    }
    return NULL;
}

 

이 코드는 새로운 스레드를 생성하여 1부터 100까지의 합을 계산하는 프로그램임. pthread_create()로 스레드를 생성하고, pthread_join()으로 해당 스레드가 종료되기를 기다린 후 결과를 출력함.

 

 

  • TLS 예제: 각 스레드가 고유한 변수를 가지는 TLS를 사용한 예시 코드.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

static __thread int tsum = 5;  // TLS 사용

void* calcThread(void *param);
int total = 0;

int main() {
    pthread_t tid[2];
    pthread_attr_t attr[2];
    char *p[2] = {"100", "200"};

    for (int i = 0; i < 2; i++) {
        pthread_attr_init(&attr[i]);
        pthread_create(&tid[i], &attr[i], calcThread, p[i]);
    }

    for (int i = 0; i < 2; i++) {
        pthread_join(tid[i], NULL);
    }

    printf("total = %d\n", total);
    return 0;
}

void* calcThread(void *param) {
    int i;
    int sum = 0;
    int to = atoi(param);

    for (i = 1; i <= to; i++) {
        sum += i;
    }
    tsum = sum;
    total += sum;
    printf("Thread result: tsum = %d\n", tsum);
    return NULL;
}

 

이 코드는 각 스레드가 독립적인 tsum 값을 가지며, TLS를 사용하여 스레드마다 고유한 값을 저장함. 두 개의 스레드가 각각 100과 200까지의 합을 계산하고 이를 출력함.

반응형