일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- n과 m
- 백준
- 개발환경
- 파이싼
- REST API
- 15649
- 1002
- video retireval
- 재귀
- 4948
- 경사하강법
- 가상환경
- 1101
- pyenv
- 티스토리챌린지
- 손실함수
- 파이썬
- BOJ
- 밑바닥부터 시작하는 딥러닝
- Python
- 기계학습
- 오블완
- N-Queen
- 9020
- 백트래킹
- end to end
- 신경망 학습
- streamlit
- Retrieval
- 그리디 알고리즘
- Today
- Total
파이톨치
[socket programming] 멀티 쓰레드 기반의 서버 구현 본문
쓰레드의 이론적 이해
쓰레드의 등장 배경
프로세스는 부담스럽다. 프로세스의 생성에는 많은 리소스가 소모된다.
일단 프로세스가 생성되면, 프로세스 간의 컨텍스트 스위칭으로 인해서 성능이 저하된다.
컨텍스트 스위칭은 프로세스의 정보를 하드디스크에 저장 및 복원하는 일이다.
데이터의 교환이 어렵다
프로세스간 메모리가 독립적으로 운영되기 때문에 프로세스간 데이터 공유 불가능!
따라서 운영체제가 별도로 제공하는 메모리 공간을 대상으로 별도의 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을 선언하면, 한 process가 critical section 안에 들어가 있는 상황에서는 다른 process가 그 critical section에 들어가지 못하게 하는 차단 매커니즘이 동작함
이 매커니즘을 특별한 명령어, 특별한변수, 또는 시스템 함수로 구현한다. (예) mutex, spinlock, semaphore(세마포어)
둘 이상의 쓰레드 동시 접근의 문제점
순차적으로 변수 num에 접근하면 문제가 발생하지 않는다. thread1과 thread2가 각각 1씩 증가시켰는데, 변수 num의 값은1만 증가 하였다.
임계영역
둘 이상의 쓰레드가 동시에 실행하면 문제를 일으키는 영역이다. 왼쪽에서 보이는 바와 같이, 서로 다른 문장임에도 불구하고 동시에 실행이 되는 상황에서도 문제는 발생할 수 있기 때문에 임계영역은 다양하게 구성이 된다.
쓰레드의 동기화
동기화의 두가지 측면과 동기화 기법
• 동일한메모리영역으로의동시접근이발생하는상황
• 동일한메모리영역에접근하는쓰레드의실행순서를지정해야하는상황. 즉, 동기화를통해서동시접근을막을수있고, 게다가접근의순서를지정하는것도가능하다.
뮤텍스(Mutex) 기반동기화
세마포어(Semaphore) 기반 동기화
세마포어는세마포어카운트값을통해서임계영역에동시접근가능한쓰레드의수를제한할수있다. 세마포어카운트가0이면진입불가, 0보다크면진입가능.
동기화는운영체제가제공하는기능이기때문에운영체제에따라서제공되는기법및적용의방법에차이가있다.
쓰레드의소멸
• pthread_join 함수의호출
• pthread_detach 함수의호출
쓰레드함수가반환을해도자동소멸되지않는다. 위의함수중하나를호출해서쓰레드의소멸을도와야한다.
pthread_join 함수의호출은블로킹상태에놓이게되니pthread_detach 함수를호출해서쓰레드의소멸을도와야한다.
쓰레드함수호출(handle_clnt)이완료되면자동으로쓰레드가소멸된다.
멀티쓰레드기반의다중접속서버의구현
위의반복문에서보이듯이클라이언트와연결되면, 쓰레드를생성하면서해당쓰레드에소켓을전달한다. 그래서쓰레드가클라이언트에게서비스를제공하는구조로서버를디자인한다. 수신된메시지를모든클라이언트에게전송하는코드이다. 소켓정보를참조하는코드가동기화되어있음에주목하자!소켓정보를참조하는동안소켓의추가및삭제(종료)를막겠다는의도이다. 데이터의송신과수신에각각쓰레드를할당하는형태로구현되었다.
'대학수업 > socket programming' 카테고리의 다른 글
[socket programming] IoT Network/Session layer protocol (0) | 2024.04.20 |
---|---|
[socket programming] IoT Datalink layer protocol (0) | 2024.04.20 |
[socket programming] IO multiplexing (1) | 2024.04.20 |
[socket programming] 멀티 프로세스 기반 다중 서버 (0) | 2024.04.19 |
[socket programming] Socket Options (2) | 2024.04.19 |