ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7.Posix thread(Pthread)
    CS/OS 2022. 5. 25. 20:42

    들어가기 전에 Process에 대해서 살펴보고 시작한다.

     

    Process / Thread


    일반적으로 Unix Process 는 Main() Function으로 부터 실행되는 Single Thread이다.

     

    앞서 말하였듯이 Fork()를 통해 Process가 생성됨으로 Memory 및 File Descriptor를 Copy-on-Write 방식으로 자식에게 복사하여준다.

     

    반면, Thread는 전역 Memory들은 서로 공유하고 있기 때문에 Process보다 속도가 빠르다.

    Thread = Semi Process = Light weight Process 라고 불린다.

     

    Posix Thread


    일반적으로 PThread로 불리며, Thread를 지원하기 위한 C 표준 라이브러리 셋을 사용하여 동작시켜야 한다.
    #Pthread Library Link
    gcc -o thread thread.c -lpthread

    동작되는 원리는 Main() -> Process(Single Thread) -> Master Thread -> Pthread_create() function 을 Call 함으로써, 새로운 Thread를 생성한다.

     

    Thread Process

     

    #include <stdio.h> 
    #include <unistd.h> 
    #include <pthread.h> 
    
    void* do_loop(void *data)
    {
        int i;
    
        int me = *((int *)data);
        for (i = 0; i < 10; i++)
        {
            printf("%d - Got %d\n", me, i);
            sleep(1);
        }
    }
    
    int main()
    {
        int       thr_id;
        pthread_t p_thread[3];
        int status;
        int a = 1;
        int b = 2;      
        int c = 3;      
    
        thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
        thr_id = pthread_create(&p_thread[1], NULL, do_loop, (void *)&b);
        thr_id = pthread_create(&p_thread[2], NULL, do_loop, (void *)&c);
    
        pthread_join(p_thread[0], (void **) &status);
        pthread_join(p_thread[1], (void **) &status);
        pthread_join(p_thread[2], (void **) &status);
    
        printf("programing is end\n");
        return 0;
    }
    

     

    위 코드를 살펴보면,  하나의 Process에서 총 3개의 Thread를 동작시키는 코드이다.

    큰 흐름으로 보게 되면

    1. pthread_create()를 호출함으로써 쓰레드가 생성된다.

    2. 각각의 Thread는 do_loop Function을 실행하게 된다.

    3. Thread의 작업이 종료되면, pthread_join을 통하여 다른 Thread가 종료되기 까지 대기

    4. 모두 종료되었다면 Main Thread(Master Thread)가 종료되고 Process는 끝이 난다.

    pthread_t 는 thread data 구조이다.

     

    pthread_create( arg1 , arg2 , arg3 , arg4 )

    arg1 = pthread_t 데이타 구조체
    arg2 = thread type ( default = NULL )
    arg3 = execute thread code
    arg4 = thread parameter value

     

    1부터 10까지 Print한 다음에 3개의 Thread가 종료되면 "programing is end" 후 Process exit() 될 것이다.

    Process exit() 시 자식 Process가 Kill되어야 Parent Process가 Kill 되듯이 Thread도 Master Thread 하위의 Thread가 종료되어야만 Kill이 가능하다.

     

    pthread_join

    Master Thread는 pthread_join 에 명시된 쓰레드가 종료할때까지 sleep 된다.
    모든 쓰레드가 종료하기 전에 부모쓰레드가 종료하는 사태를 막기 위해서 사용된다.

    후에 pthread_join을 wake하게 되면, Thread에 할당된 Resource들을 Free 시켜 준다.

     

     

     

     

     

    Reference

    http://tibero1.blogspot.com/2014/12/pthread.html

     

    쓰레드란?, pthread 예제

    쓰레드는 무엇이며, 왜 이용하는가 쓰레드는 세미(semi)프로세스, 혹은 Light Weight 프로세스라고 불리우며, 여러개의 클라이언트를 처리하는 서버/클라이언트 모델의 서버프로그래밍 작업을 위해

    tibero1.blogspot.com

     

    'CS > OS' 카테고리의 다른 글

    xv6 Test code  (0) 2022.06.02
    xv6 (linux Init)  (0) 2022.06.02
    5. Process_Scheduling  (0) 2022.05.19
    XV6 - 이론 정리_2  (0) 2022.05.13
    XV6 - 이론 정리_1  (0) 2022.05.13

    댓글

Designed by Tistory.