본문 바로가기
CS/네트워크

[윤성우의 열혈 TCP/IP 소켓 프로그래밍] 멀티쓰레드 기반의 서버구현

by merona99 2019. 2. 9.
반응형

멀티쓰레드 기반의 서버구현

 

//시간상 잠깐 챕터를 많이 건너띄어야 겠다..

  프로세스는 나중에 공부하자 ㅠㅠ

 

 

<멀티프로세스의 단점>

  • 프로세스 생성이라는 부담스러운 작업과정을 거침
  • 두 프로세스 사이에서의 데이터 교환을 위해서는 별도의 ipc 기법을 적용해야 함
  • 컨텍스트 스위칭에 따른 부담

<쓰레드>

  • 쓰레드의 생성 및 컨텍스트 스위칭은 프로세스의 생성 및 컨텍스트 스위칭보다 빠름
  • 쓰레드 사이에서의 데이터 교환에는 특별한 기법이 필요x

프로세스 : 운영체제 관점에서 별도의 실행흐름을 구성하는 단위

쓰레드 : 프로세스 관점에서 별도의 실행흐름을 구성하는 단위

 

 

쓰레드의 메모리 구조

 

프로세스처럼 완전히 메모리 구조를 분리시킬 것이 아니라, 스택 영역만을 분리시킴

  • 컨텍스트 스위칭 시 데이터 영역과 힙은 올리고 내릴 필요x
  • 데이터 영역과 힙을 이용해서 데이터를 교환o

프로세스 : 하나의 운영체제 안에서 둘 이상의 실행흐름을 형셩하기 위한 도구

쓰레드 : 하나의 프로세스 내에서 둘 이상으 ㅣ실행흐름을 형성하기 위한 도구

 

 

 

*POSIX(UNIX  표준 API 규격)에 근거하여 코드 작성

 

 

<쓰레드 생성>

 

thread : 생성할 쓰레드의 ID 저장을 위한 변수의 주소 값 전달

attr : 쓰레드에 부여할 특성 정보의 전달을 위한 매개변수 (NULL전달 시 기본적인 특성의 쓰레드)

start_routine : 쓰레드의 main 함수 역할을 하는 함수의 주소 값(함수 포인터) 전달

arg : 세 번째 인자를 통해 등록된 함수가 호출될 때 전달할 인자의 정보를 담고 있는 변수의 주소 값 전달

 

 

쓰레드 기반 프로그래밍에서 쓰레드가 실행되기에 넉넉한 시간을 줘야함

 

따라서 아래 함수를 사용해줌

 

 

전달되는 ID의 쓰레드가 종료될 떄까지 해당함수를 호출한 프로세스(쓰레드)를 대기상태로 둠

sleep() 대신 효율적인 함수

 

 

보면 프로세스 실행이 일시적으로 정지 되었다가 쓰레드가 종료되면서 (쓰레드의 main 함수가 반환하면서) 다시 실행이 이어지고 있음

 

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

 

gcc -lpthread

쓰레드 라이브러리의 링크를 별도로 지시

 

gcc -D_REENTRANT

쓰레드에 안전한 함수로 자동화하여 바꿔주는것

 

 


참고문서 : 윤성우의 열혈 tcp/ip 소켓 프로그래밍

반응형

댓글