fork vs thread 차이점 및 thread 간단 사용방법

Posted by [하늘이]
2018. 12. 5. 21:10 IT/Linux
반응형




fork vs thread 차이점

■ fork에 의한 프로세스 생성

(거의) 동일한 프로세스를 복사. 즉, 데이터 영역과 스텍 영역 모두를 복사하여 생성함으로

시간적 오버헤드와 메모리 낭비 초래

프로세스 간의 공유 변수를 갖기 어렵기 때문에 운영체제가 제공하는 특수 구조체나 공유파일을 사용

(pipe, shared mem., signal, socket 등)


■ thread 사용

프로세스 문맥 중 레지스터와 스택만을 복사하고 데이터 영역은 쓰레드간에 공유 가능

쓰레드간 컨택스트 스위치(context switching)가 프로세스 간 컨택스트 스위치보다 훨씬 빠름

fork 의 경우 code를 제외하고 나머지는 각 프로세서들이 갖고 있어 변수 참조가 안된다.



Thread API 


■ 생성

int pthread_create (pthread_t *thread,const pthread_attr_t *attr,void *(*start)(void *),void *arg );


■ 종료

pthread_exit (void *value_ptr);


■ join

 어떤 쓰레드가 pthread_join 함수를 호출하면 API에 전달되는 thread ID 가 종료될때 까지 Block한다.

  자신이 만든 쓰레드의 종료시점과 동기화 시키고 싶은 경우 사용


Status = pthread_join(thread_id, &thread_result);


■ detach

Thread가 프로세스와 분리되어서, 종료가 된다면 자신이 사용했던 자원을 바로 반납한다는 의미

즉, 이 Thread를 다른 곳에서 더 이상 간접적으로 다룬다거나, 쓰레드의 리턴값을 알 필요가 없는 경우 사용


pthread_detach((pthread_self());




■ pthread 라이브러리를 링크해야 함


$gcc -o alarm alarm.c -lpthread


■ mutex : mutual exclution [동기화]

여러 스레드가 하나의 Global 변수를 참고하게 되는 경우 예기치 않은 값으로 변경되어 문제가 생기는 경우를 막기 위하여 사용한다.

mutex 시작부분 부터 종료부분까지 다른 스레드가 같은 공유 자원에 참조가 안되게 해주는 기능이라고 보면 된다.



■  mutex 사용 API


◆ 뮤텍스 생성

pthread_mutex_t 의 변수 선언으로 뮤텍스 생성

pthread_mutex_t mutex;


◆ 뮤텍스 초기화

변수를 초기화 하듯이 뮤텍스를 초기화

mutex = PTHREAD_MUTEX_INITIALIZER;


◆ 뮤텍스 생성 & 초기화

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


◆ 뮤텍스의 잠금

아래의 함수를 호출하여 뮤텍스를 잠그고, 공유 데이터를 이용하여 원하는 작업을 수행한다.

int pthread_mutex_lock(pthread_mutex_t *mutex);


◆ 잠금 해제

원하는작업을 수행한 후, 아래의 함수를 호출하여 뮤텍스의 잠금을 해제한다.

int pthread_mutex_unlock(pthread_mutex_t *mutex);



◆ Sample

#include <pthread.h>

int count; // 공유 변수

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 쓰레드 초기화


void* loop_1()

{

       int i;

       pthread_mutex_lock(&mutex); // 잠금

       for (i = 0; i < 10; i++)

       {

               printf("loop_1 : %d", count++);

               sleep(1);

       }

       pthread_mutex_unlock(&mutex); // 해제

}


void* loop_2()

{

       int i;

       pthread_mutex_lock(&mutex); // 잠금

       for (i = 0; i < 10; i++)

       {

               printf("loop_2 : %d", count++);

               sleep(1);

       }

       pthread_mutex_unlock(&mutex); // 해제

}



참고 사이트 및 정보 : http://olc.kr/

강의명 : [Linux System Programming] Linux System Programming   

강사명 : 김두현


반응형