tioon's Devlog

멀티 쓰레드(세마포어,뮤텍스) , 멀티플렉싱이란? 본문

네트워크

멀티 쓰레드(세마포어,뮤텍스) , 멀티플렉싱이란?

tioon 2023. 4. 11. 00:42
쓰레드란?

   ->쓰레드는 컴퓨터 프로그램에서 실행되는 일련의 작업 단위를 의미합니다.쓰레드는 프로세스 내에서 실행되는 여러개의 작업 흐름중하나로, 각각의 쓰레드는 실행이 될때 메모리에서 스택부분만 독립적으로 가지고 있고, 나머지 부분은 서로 공유를 하고있습니다.
반면에, 프로세스는 각각 독립적으로 실행이되어 메모리의 모든부분을 독립적으로 가지고 있습니다.
하나의 프로세스 내에서 여러개의 쓰레드를 생성하여 동시에 실행할 수 있으며, 이러한 방식으로 프로세스 내부에서 쓰레드를 활용해 병렬처리를 가능하게 할 수 있습니다.

즉, 

프로세스(물리적 독립성) => 모든부분이 독립적으로 실행

쓰레드(논리적 독립성) => stack영역만 독립적,그외 부분은 같이 공유

 

섹션 공유 (쓰레드) 공유(프로세스)
Code O X
Data O X
Heap O X
Stack X(독립적) X

 

 

단일 프로세스, 단일 쓰레드 (동그라미 -> 프로세스 , 선 -> 쓰레드입니다)

 

프로세스를 fork()로 나눈결과(새 프로세스 생성)

 

쓰레드를 생성한결과

 

 

쓰레드 함수

 

쓰레드 생성함수() (컴파일시 -lpthread옵션을 이용해 동적 링킹해야함)

 

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

  • thread -> 쓰레드의 ID값
  • attr -> 쓰레드의 특성을 저장하는 구조체값
  • start_routine -> 쓰레드가 실행할 함수의 포인터
  • arg -> start_routine함수에 들어갈 매개변수

 

 

 

쓰레드 대기 함수() (다른 쓰레드의 종료를 기다림, 기다리는동안은 중지 상)

 

int pthread_join (pthread_t thread , void ** retval);

  • thread -> 쓰레드의 ID값
  • retval -> thread 종료시 반환하는값 접근 포인터

 

 

 

쓰레드 분리함수() (해당 스레드함수 종료시점에 자동으로 운영체제에 메모리 반납하게 함) (자동삭제)

 

int pthread_detach (pthread_t thread); 

 

  • thread -> 분리할 쓰레드 ID값

 

 

 

 

 

 

 

 

 

세마포어란?

   - 세마포어는 프로세스나 쓰레드 간의 동기화를 위해 사용되는 개념으로 , 병렬처리과정에서 공유 메모리 자원에 대한 접근 제어를 하기위해 사용되는 동기화 기법중 하나입니다. 정수형 변수를 하나 사용해 공유자원의 사용 여부를 확인하고, 이값을 변경시켜 세마포어의 상태를 나타내어 프로세스, 스레드가 사용하고 있는 공유자원의 상태를 나타냅니다. 이때, 공유자원은 1~여러개가 동시에 사용할 수 있습니다.

 

 

세마포어의 종류
  • 이진 세마포어 (Binary Semaphore) - 세마포어 값을 0 또는 1만을 가지며 자원에 대한 동시접속을 막기 위해 사용되는 세마포어 입니다. 뮤텍스와 유사합니다.
  • 카운팅 세마포어 (Counting Semaphore) - 세마포어 값을 0보다 큰 정수를 가지며, 동시에 여러 개의 프로세스 또는 쓰레드가 접근하여 사용가능합니다.

 

 

 

세마포어 함수

 

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);   //세마포어 생성 하는 함수 (리턴값은 세미포어 포인터

  • name -> 세마포어의 이름 (이미 존재하는 세마포어라면 그 세마포어의 이름을 가져옴)
  • oflag -> 세마포어를 생성할때 옵션 (O_RDWR , O_RDONLY , O_CREAT , O_EXCL이 있음)
  • mode -> 생성할 세마포어의 권한을 지정 
  • value -> 세마포어의 초기값 지정

 

int sem_wait(sem_t *sem);   //세마포어의 값을 감소시키는 함수 (음수면 세마포어의 접근 블록함)

  • sem -> 변경할 세마포어를 가리키는 포인터

 

int sem_post(sem_t *sem);   //세마포어의 값을 증가시키는 함수 (세마포어의 접근을 오픈함) (0이 아닌 양수로 만듦)

  • sem -> 변경할 세마포어를 가리키는 포인터

 

int sem_unlink(const char *name);  // 세마포어를 제거하는 함수 (매개변수로 전달된 세마포어 제거)

 

  • name -> 제거할 세마포어를 가리키는 포인터

 

 

 

 

 

 

 

 

 

뮤텍스란?

   -세마포어와 마찬가지로 프로세스나 쓰레드 간의 공유 메모리 자원에 대한 접근 제어를 하기위해 사용되는 동기화 기법중 하나입니다.세마포어와는 다르게 오직 하나의 스레드만이 공유 자원에 접근할 수 있도록 보장하며, lock상태와 unlock 두가지 상태를 가져 공유 자원을 관리합니다.

 

 

 

 

int pthread_mutex_init (pthread_mutext_t *restrict mutex, const pthread_mutexattr_t *restrictattr);

 

  • mutex -> 관리할 뮤텍스 객체
  • attr -> 뮤텍스 속성 객체를 나타내는 포인터 (기본속성 = null)

 

int pthread_mutex_lock (pthread_mutex_t *mutex);

 

  • mutex -> 잠글 뮤텍스 객체

 

int pthread_mutex_unlock (pthread_mutex_t *mutex);

 

  • mutex -> 잠금을 해제할 뮤텍스 객체

 

pthread_mutex_destroy (pthread_mutex_t *mutex);

 

  • mutex -> 삭제할 뮤텍스 객체

 

 

 

 

멀티플렉싱(Multiplexing)이란?

-다수의 네트워크 연결요청을 동시에 처리하기 위한 기술, 위에서 멀티 쓰레드,프로세스를 이용해 동시 처리를 할 수 있지만, 해당 기술은 매우 불안정합니다. 따라서 멀티플렉싱은 하나의 프로세스에서 클라이언트들의 여러개의 소켓을 동시에 관리하여  네트워크의 안정성과 성능을 향상 시킬 수 있습니다. 이 기술은 select라는 시스템콜을 이용해 구현됩니다.

 

멀티플렉싱 과정
  1. 소켓 생성 및 바인딩 
    -소켓을 생성한후 바인딩하여 요청들어오는 소켓을 대기합니다.
  2. 소켓 감시 대기열 설정
    -파일 디스크립터 배열을 통해 요청이 들어올때 처리할 감시 대기열을 설정합니다. 여기서 감시 대기열에 설정된 파일디스크립터만 관찰을 하여, 데이터 입출력을 관찰합니다. 감시할 종류는 3가지로 나뉘는데, (읽기,쓰기,예외)가 있습니다.
  3. 감시 대기열 이벤트 발생 처리
    -감시중인 파일 디스크립터에서 입출력과 같은 이벤트가 발생하면, 해당 파일 디스크립터를 반환해 입출력을 처리합니다.
  4. 반복
    -이벤트 발생을 처리했으면 다시 대기상태로 돌아가 감시를 합니다.

 

int select( int nfds, fd_set *readfds , fd_set *writefds , fs_set *exceptfds , struct timeval *timeout);

 

  • nfds -> 파일 디스크립터중 제일 높은값 (0부터 관찰할 파일디스크립터 최대값)
  • readfds , writefds , exceptfds -> 파일디스크립터 집합 (읽기,쓰기,예외) 3개의 집합으로 나뉨.
  • timeout -> 관찰 과정에서 응답이 들어올때 까지 블로킹 상태가 생기는데 ,timeout(제한시간)으로 무한 블로킹상태를 막음

 

'네트워크' 카테고리의 다른 글

MAC주소와 ARP  (0) 2023.05.02
멀티플렉싱 개념(select,epoll)  (0) 2023.05.02
시그널(Signal)이란?  (0) 2023.04.03
UDP 통신이란?  (0) 2023.03.27
TCP 통신이란?  (0) 2023.03.27