-
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를 생성한다.
#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 value1부터 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
'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