스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위 - 위키피디아

 

 스레드는 한 프로세스 내에서 실행되는 작은 단위의 프로세스 정도라고 말하면 될 것 같다. 스레드의 목적은 멀티 프로세스의 오버헤드 감소 (문맥교환) 와 데이터 교환이 쉬워서 다중처리 서버를 구현하는 것이다. 먼저 멀티 프로세스의 가장 큰 문제는 문맥교환 (context switching) 이다.

context switching

 문맥교환 : 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업
[출처] 문맥 교환(context switch)|작성자 예비개발자

 

 즉, CPU의 다중 처리를 위해 현재 메모리에 올라와 있는 프로세스를 내리고 다른 프로세스를 올려 처리한다. 이 과정이 많이 반복될 수록 CPU의 오버헤드가 커지고 성능 저하에 큰 영향을 미친다.

 

 위의 이유로 인하여 다중처리 서버는 스레드가 보다 적합하다고 할 수 있다.

 

 프로세스와 스레드의 차이점은 메모리 공유 여부이다. 프로세스는 각각의 데이터영역과 힙, 스택영역을 갖고 있다. 하지만 스레드는 스택만 고유의 메모리를 할당받고 나머지 영역은 공유한다. 물론, 공유하다보니 동시에 어떤 변수에 접근한다면 문제가 발생할 수 있다. 이는 데이터의 기대값과 다른 결과값이 나올 수 있다. 하지만 스레드들이 공유하는 변수 영역을 임계영역으로 잡고 동기화 기법을 활용해 서버의 멀티스레드 기능을 수행할 수 있도록 한다.

thread

 프로그램이 실행되며 생성된 스레드들은 병렬로 동시에 처리가 된다. 아래는 스레드 10개를 생성하고 종료되는 프로그램의 출력 화면이다.

threads

 

 이렇게 메인 프로세스와 함께 실행되는 스레드를 활용하여 여러 클라이언트들의 요청을 스레드를 통해서 응답하고 처리가 가능하다. 아래는 위의 화면을 출력시킨 코드이다.

#include <stdio.h>
#include <pthread.h>
//#include <stdlib.h>
#include <unistd.h>

#define THREAD_NUM 10
void* thread_main(void * arg);

int main(){

    pthread_t tid_arr[THREAD_NUM];

    for(int i = 0; i < THREAD_NUM; i++){
        if(pthread_create(&tid_arr[i], NULL, thread_main, (void*)&i) != 0){
            puts("pthread create() error");
            return -1;
        }
    }

    sleep(20); puts("end of main");
    return 0;
}

void* thread_main(void * arg){
    int cnt = *((int *) arg);
    for(int i = 0; i < cnt; i++){
        printf("I'm [%d] thread\n", cnt);
        sleep(cnt);
    }
    return NULL;
}

'C' 카테고리의 다른 글

assert  (0) 2022.08.27
memset  (0) 2022.08.23
function pointer 함수 포인터  (0) 2022.06.27
[Socket] close()  (0) 2022.06.25
stack & heap in Visual Studio  (0) 2022.05.25

+ Recent posts