파이톨치

[socket programming] 멀티 쓰레드 기반의 서버 구현 본문

대학수업/socket programming

[socket programming] 멀티 쓰레드 기반의 서버 구현

파이톨치 2024. 4. 20. 02:34
728x90

쓰레드의 이론적 이해

쓰레드의 등장 배경

프로세스는 부담스럽다. 프로세스의 생성에는 많은 리소스가 소모된다.

일단 프로세스가 생성되면, 프로세스 간의 컨텍스트 스위칭으로 인해서 성능이 저하된다.

컨텍스트 스위칭은 프로세스의 정보를 하드디스크에 저장 복원하는 일이다.

 

데이터의 교환이 어렵다

프로세스간 메모리가 독립적으로 운영되기 때문에 프로세스간 데이터 공유 불가능!

따라서 운영체제가 별도로 제공하는 메모리 공간을 대상으로 별도의 IPC 기법 적용.

 

쓰레드 

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

 

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

프로세스는 서로 완전히 독립적이다. 프로세스는 운영체제 관점에서의 실행 흐름을 구성한다. 쓰레드는 프로세스 내에서의 실행흐름갖는다. 그리고 데이터 영역과 영역을 공유하기 때문에 컨텍스트 스위칭에 대한 담이 덜하다. 또한 공유하는 메모리 영역으로 인해서 쓰레드 간 데이터 교환이 매우 쉽게 이뤄진다. 

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


쓰레드의 생성 실행

pthread_create(&t_id, NULL, thread_main, (void*) &thread_param) != 0); 

thread_main 함수가 쓰레드의 main 함수이다. 따라이를 가리켜 쓰레드 한다. 쓰레드가 생성되면 생성된 쓰레드는 쓰레드 함수를 행한다. 쓰레드 함수의 실행이 완료되면 쓰레드는 종료된다

 

 

쓰레드의 종료를 대기

pthread_join(pthread_t thread, void ** status); 

번째 인자로 전달되는 ID쓰레드가 종료 될 때까지, 함수를 호출한 로세스(또는쓰레드)대기상태에 둔다. 

 

임계영역 내에서 호출이 가능한 함수

쓰레드에 안전한 함수, 쓰레드에 불안전한 함수

이상의 쓰레드가 동시에 호출하면 문제를 일으키는 함수가리켜 쓰레드에 불안전한 함수(Thread-unsafe function)한다.

이상의 쓰레드가 동시에 호출을 해도 문제를 일으키지 않는 함수를 가리켜 쓰레드에 안전한 함수(Thread-safe function)한다.

 

헤더 파일 선언 이전에 매크로 _REENTRANT정의하면, 쓰레드에 불안전한 함수의 출문을 쓰레드에 안전한 함수의 호출문으로 자동 변경 컴파일 된다.

 

워커(Worker) 쓰레드모델

쓰레드에게 일을시키고 결과를 취합하는 태의 쓰레드 구성 모델. 위의 실행결과에는 이상이 없지만, 이상의 쓰레드가 전역변수 sum동시에 접근하기 때문에 문제발생소지를 지니고 있는 상황이다.  


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

Inter-Process Communication (IPC)

예를 들어, 2개의 process (또는thread)공유변수를 사용하는 경우 process수행순서에 따라 수행 결과가 달라지는상황발생함 (이를 race condition이라 부름)

race condition해결하기 위해 공유변수를 사용하는 코드 영역critical section(임계영역)선언함

critical section선언하면, processcritical section 안에 들어가 있는 상황에서는 다른 processcritical section들어가지 못하게 하는 차단 매커니즘이 동작함

매커니즘을 특별한 명령어, 특별한변수, 또는 시스템 함수로 구현한다. () mutex, spinlock, semaphore(세마포어) 

 

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

순차적으로 변수 num접근하면 문제가 발생하지 않는다. thread1thread2각각 1증가시켰는데, 변수 num값은1증가 하였다. 

 

임계영역

이상의 쓰레드가 동시에 실행하면 문제를 일으키는 영역이다. 왼쪽에서 보이는 바와 같이, 서로 다른 문장임에도 불구하고 동시에 실행되는 상황에서도 문제는 발생할 있기 때문에 임계영역은 다양하게 구성이 된다.


쓰레드의 동기화

동기화의 가지 측면과 동기화 기법

동일한메모리영역으로의동시접근이발생하는상황

동일한메모리영역에접근하는쓰레드의실행순서를지정해야하는상황. , 동기화를통해서동시접근을막을있고, 게다가접근의순서를지정하는것도가능하다.

 

 뮤텍스(Mutex) 기반동기화

 

세마포어(Semaphore) 기반 동기화

세마포어는세마포어카운트통해서임계영역에동시접근가능한쓰레드의수를제한할있다. 세마포어카운트가0이면입불가, 0보다크면진입가능. 

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


쓰레드의소멸

• pthread_join 함수의호출

• pthread_detach 함수의호출

쓰레드함수가반환을해도자동소멸되지않는다. 위의함수하나를호출해쓰레드의소멸을도와야한다. 

pthread_join 함수의호출은블로킹태에놓이게되니pthread_detach 수를호출해서쓰레드의소멸을도와야한다

쓰레드함수호출(handle_clnt)완료되면자동으로쓰레드가소멸된다.

 


멀티쓰레드기반의다중접속서버의구현

 

위의반복문에서보이듯이클라이언트와연결되면, 쓰레드를생성하면서해당쓰레드에소켓을전달한다. 그래서쓰레드가클라이언트에게서비스를제공하구조로서버를디자인한다. 수신된메시지를모든클라이언트에전송하는코드이다. 소켓정보를참조하는코드가동기화되어있음에주목하자!소켓정보를참조하는동안소켓의추가삭제(종료)막겠다는의도이다. 데이터의송신과수신에각각쓰레드를할당하는형태로구현되었다. 

728x90