네트워크

[네트워크] 쓰레드, 멀티 쓰레드

양원준 2023. 6. 11. 18:27
728x90

프로세스?

  • 프로세스의 생성에는 많은 리소스가 소모
  • 프로세스가 생성되면, 프로세스간의 컨텍스트 스위칭으로 인해 성능 저하
  • 컨텍스트 스위칭은 프로세스의 정보를 하드디스크에 저장 및 복원하는 일
  • 메모리가 독립적으로 운영되어 데이터 공유 불가능
  • 따라서 운영체제가 별도로 제공하는 메모리 공간을 대상으로 별도의 IPC기법 적용

 

쓰레드

  • 프로세스보다 가벼운, 경령화된 프로세스
  • 컨텍스트 스위칭이 빠름
  • 쓰레드 별로 메모리 공유가 가능하기 때문에 별도의 IPC 기법 불필요
  • 프로세스 내에서의 프로그램의 흐름 추가

 

쓰레드와 프로세스의 차이점

 

위와 같이 프로세스는 서로 완전히 독립적, 운영체제의 관점에서 실행흐름을 구성

 

 

 

 

반면, 쓰레드는 프로세스 내에서의 실행흐름, 데이터 영역과 힙영역을 공유하기 때문에 컨텍스트 스위칭에 대한 부담이 덜하고 공유하는 메모리 영역으로 인해 데이터 교환이 매우 쉽다

 

메모리 영역 관점에서

프로세스는 전역주소가 할당되는 데이터영역, 동적으로 메모리가 할당되는 힙영역, 함수의 실행을 위한 스택 영역들이 별도로 유지됨

 

반면 쓰레드는 스택영역만 독립적으로 운영되고 나머지는 공유

하나의 운영체제 내에서는 둘 이상의 프로세스가 생성되고, 하나의 프로세스 내에서는 둘 이상의 쓰레드가 생성

 

 

 

쓰레드 생성에 사용되는 함수

쓰레드 생성의 예시

 

 

thread_main 함수가 쓰레드의 main 함수, 따라서 이를 쓰레드 함수라 지칭

쓰레드가 생성되면 생성된 쓰레드는 쓰레드 함수를 실행

쓰레드 함수의 실행이 완료되면 쓰레드는 종료

 

sleep 함수로 프로그램의 흐름을 관리하는 데는 한계가 있음

프로세스가 종료되면, 해당 프로세스 내에서 생성된 쓰레드도 함께 소멸

 

따라서, 쓰레드의 종료를 대기시키는 무언가가 필요

 

 

쓰레드 종료 대기 함수

 

첫번째 인자로 전달되는 id의 쓰레드가 종료될 때까지, 이 함수를 호출한 프로세스나 쓰레드를 대기 상태에 둠

 

둘 이상의 쓰레드가 동시에 호출하면 문제를 일으키는 함수를 가리켜 쓰레드에 불안전한 함수라 함

둘 이상의 쓰레드가 동시에 호출을 해도 문제를 일으키지 않는 함수를 가르켜 쓰레드에 안전한 함수라 함

 

gcc -D_REENTRANT thread.c -o thread -lpthread

 

위와 같이 헤더파일 선언 전 매크로 _REENTRANT를 정의하면 쓰레드에 불안전한 함수의 호출문을 쓰레드에 안전한 함수의 호출문으로 자동 변경 컴파일됨

 

 

워커 쓰레드 모델

 

 

쓰레드에게 일을 시키고 그 결과를 취합하는 형태의 쓰레드 구성 모델

 

 

위와 같은 경우는 이상은 없지만, 둘 이상의 쓰레드가 전역변수 sum에 동시에 접근하기 때문에 문제의 발생소지는 있다

 

 

 

둘 이상의 쓰레드 동시접근의 문제점

 

순차적으로 접근하면 상관없음 근데,

 

이럼 각 쓰레드가 1씩 증가 시켰는데 변수의 값은 1만 증가

 

 

 

임계영역

 

임계영역은 둘 이상의 쓰레드가 동시에 실행하면 문제를 일으키는 영역

서로 다른 문장임에도 동시에 실행이 되는 상황에서도 문제가 발생할 수 있음

 

  • 동일한 메모리 영역으로의 동시접근이 발생하는 상황
  • 동일한 메모리 영역에 접근하는 쓰레드의 실행순서를 지정해야 하는 상황

에 동기화가 필요

 

즉, 동기화를 통해 동시접근을 막을 수 있고 접근 순서를 지정하는 것이 가능

동기화 기법에는

  • 뮤텍스 기반 동기화
  • 세마포어 기반 동기화

가 있고 동기화는 운영체제가 제공하는 기능이기 때문에 운영체제에 따라서 제공되는 기법 및 적용의 방법에 차이가 있다

 

 

뮤텍스 기반의 동기화

 

뮤텍스의 lock과 unlock의 함수호출 횟수는 최소화 하는게 성능에 유리

 

세마포어

 

 

 

 

쓰레드의 소멸

pthread_join 함수의 호출

pthread_detach 함수의 호출

 

pthread_join 함수의 호출은 블로킹 상태에 놓이게 됨

pthread_detach 함수를 호출하여 쓰레드의 소멸을 도와야함

 

 

 

 

 

 

728x90

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

[네트워크] DNS  (0) 2023.06.14
[네트워크] HTTP  (0) 2023.06.12
[네트워크] IO 멀티플렉싱  (0) 2023.06.11
[네트워크] 시그널 핸들링  (0) 2023.06.11
[네트워크] send&recv, readv&writev 입출력 함수  (0) 2022.11.29