ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 멀티쓰레드 기반의 서버구현
    IOT네트워크프로그래밍 2021. 10. 12. 20:01

    쓰레드

    '경량화된 프로세스'라고 생각하면 편하다.

    프로세스의 단점을 보안하기 위해 나왔다.

    리눅스 gcc 에서 쓰레드를 사용하려면, 컴파일 생성 명령어 맨 뒤에 -lpthread라고 해줘야 한다.

    프로세스와의 차이점

    • 스텍을 제외한 나머지 메모리 공간을 공유
    • 일부 메모리를 공유하므로 스레드간 통신이 편리하다.

    쓰레드를 생성하는 함수

    Pthread_create 함수

    #include <pthread.h>
    
    int pthread_create (pthead_t * thread,
                                pthread_attr-t * attr,
                                void * (* start_routine) (void *),
                                void * arg
    );  성공 시 0, 실패 시 이외의 값 리턴
    • thread : 생성된 쓰레드의 ID를 저장할 변수의 포인터를 인자로 전달
    • Attr : 생성하고자 하는 쓰레드의 특성(attribute)을 설정할 때 사용, 일반적으로 Null을 전달
    • Start_routine : 리턴타입과 인자가 void*인 함수를 가르키는 포인터
    • Arg : 쓰레드에 의해 호출되는 함수에 전달하고자 하는 인자값을 넘겨줌

    pthread_join 함수

    main 함수가 종료되면, 쓰레드도 함께 종료된다.

    이것을 방지하기 위해서 main 함수를 대기 상태로 만들어, 쓰레드가 종료될 때까지 기다리게 한다.

    #include <pthread.h>
    
    int pthread_join(pthead_t * th,  void **thread_return);
    
     성공 시 0, 실패 시 이외의 값 리턴
    • th : th에 인자로 들어오는 ID의 쓰레드가 종료할 때까지 실행 지연
    • thread_return : 쓰레드가 종료 시 반환하는 값에 접근할 수 있는 2차원포인터

    다중 쓰레드 생성하기

    임계영역(Critical Section)과 쓰레드에 안전한 함수의 호출

    임계영역

    두개 이상의 쓰레드에 의해서 동시에 실행되면 안 되는 영역

     

    불안전한 함수를 안전한 함수로 변경

    컴파일시 –D_REENTRANT를 옵션으로 넣어 주는 방식으로 매크로를 선언

    임계영역 & 쓰레드의 문제점

     

    계산 대로 안되고, 문제가 생긴다.

    임계영역(Critical Section)

    • 두개 이상의 쓰레드에 의해서 공유되는 메모리 공간에 접근하는 코드영역

    동기화 : 문제 해결 방법

    • 공유된 메모리에 둘 이상의 쓰레드가 동시 접근하는 것을 막는 방법

    기법

    • 뮤텍스, 세마포어

    뮤텍스 Mutex

    쓰레드들의 동시접근을 허용하지 않겠다는 의미

    Pthread_mutex_t 타입변수를 가르켜 흔히 뮤텍스라고 한다.

    기본원리

    임계영역에 들어갈 때 뮤텍스를 잠그고 들어감

    임계영역을 빠져 나올 때 뮤텍스를  풀고 나옴

    초기화 : pthread_mutex_init (pthread_mutex_t *mutex, 
                   const pthread_mutexattr_t *mutexattr)
    잠금 : pthread_mutex_lock (pthread_mutex_t *mutex)
    잠금 해제 : pthread_mutex_unlock (pthread_mutex_t *mutex)
    소멸 : pthread_mutex_destroy (pthread_mutex_t *mutex)

    세마포어 Semaphore

    sem_t 타입의 변수를 가르켜 흔히 세마포어라고

    기본원리

    정수를 가짐

    정수 값이 0 이면 실행 불가능

    세마포어가 1 이상이면 실행 가능

    세마포어는 0 미만은 될수 없고 1 이상은 가능

    초기화 : sem_init (sem_t *sem, int pshared, unsigned int value)
    소멸 : sem_destory (sem_t *sem)
    감소 : sem_wait (sem_t *sem)
    증가 : sem_post (sem_t *sem)

    'IOT네트워크프로그래밍' 카테고리의 다른 글

    멀티플렉싱 SELECT  (0) 2021.11.02
    멀티캐스트와 브로드 캐스트  (0) 2021.10.19
    다중 접속 서버  (0) 2021.10.05
    UDP기반의 Client/Server  (0) 2021.09.28
    TCP 기반의 Client / Server  (0) 2021.09.28

    댓글

Designed by Tistory.