2016년 5월 24일 화요일

뇌자극 TCP_IP 프로그래밍 14강 요약

1. 멀티 스레드 프로그래밍

운영체제의 최소 실행단위는 프로세스다.
멀티 태스킹이 프로세스를 스위칭 하는 방식이라면
멀티 스레드는 하나의 프로세스가 둘 이상의 코드를 서로 스위칭 하는 방식이다.

프로세스 코드의 일부를 문맥이라고 하고,
이 문맥을 포함한 프로세스의 흐름을 스레드라고 한다.

멀티 스레드란?
1) 두 개 이상의(문맥을 포함한) 스레드를 만들어서
2) 이 문맥을 스위칭함으로써
3) 멀티 태스킹 하는 기법

스레드는 동일한 프로세스에서 실행되므로 프로세스의 자원을 서로 공유할 수 있다.

2. 멀티 스레드 프로그램 개발

멀티 스레드 프로그램 흐름

1) 분기 시점에 프로세스가 fork 함수로 자식 프로세스를 생성하면
    스레드는 스레드 생성 함수로 새로운 스레드를 생성한다.
2) 원본 프로세스를 부모 프로세스라고 하고,
    새로 만든 프로세스를 자식 프로세스라고 한다
3) 원본 스레드를 메인 스레드라고 하고, 새로 만든 스레드를 워커 스레드라고 한다

4) fork 함수로 만들어진 프로세스는 독립적으로 주어진 일을 수행한다.
    스레드 생성 함수로 만들어진 스레드도 독립적으로 작업을 수행한다.
5) 부모 프로세스는 wait 함수로 자식 프로세스의 종료를 기다린다.
6) 메인 스레드는 스레드 대기 함수로 워커 스레드를 기다린다.

스레드 생성
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread attr_t *attr,
                            void* (*start_routine)(void *), void *arg);

thread : 스레드가 만들어지면 스레드를 가리키는 스레드 식별번호가 포인터로 반환된다.
attr : 만들어지는 스레드의 특성을 정의하기 위해 사용한다. 기본 특성은 NULL 이다.
start_routine : 만들고자 하는 스레드 함수의 포인터이다.
arg : 스레드 함수가 실행될 때 넘어갈 매개변수다.

스레드 대기 
#include <pthread.h>
int pthread_join(pthread_t th, void **thread_return);

th : 기다리고자 하는 스레드의 식별 번호다.
thread_return : 스레드의 종료 값을 가져온다.

스레드 분리
int pthread_detach(pthread_t th);

th : pthread_create 함수로 만든 워크 스레드의 식별번호로 ,
     th를 식별번호로 하는 워크 스레드를 분리 시킨다.

예제는 깃허브에 올렸다.
단, 주의할 점은 컴파일 할 때 pthread 라이브러리를 링크 시켜줘야 한다.

3. 멀티 스레드와 소켓 프로그래밍의 결합

멀티 스레드의 개념이 멀티 프로세스와 별반 다르지 않으므로 쉽게 응용할 수 있다.
멀티 프로세스 기반 소켓 프로그래밍의 호름을 그대로 따르면서
fork 함수와 wait 함수 대신 스레드 함수를 쓰면 된다.
소켓에 멀티 스레드 기술을 접못하는 이유는 다수 클라이언트를 처리하기 위해서다.

fork 함수 대신 pthread_create 함수를, wait함수 대신 pthread_join 함수를 사용한다.
두 개 이상의 워커 스레드를 다루려면 pthread_detach 함수로
워커 스레드의 종료를 기다리지 않다록 해야 한다.

4. 스레드 간 공유 자원 보호

멀티 스레드에서는 공유 자원을 보로하기 위해 뮤텍스를 사용한다.
단, 뮤텍스는 단일 프로세스에만 사용할 수 있다는 한계가 있다.
서로 다른 프로세스 간에 공유 자원을 보호할 목적이면 세마포어를 사용해야 한다.

뮤텍스 생성
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr *attr);

mutex : 초기화시킬 뮤텍스 객체
attr : 뮤텍스 객체를 attr 값으로 초기화 기본 설정을 사용하려면 NULL 을 이용한다.

뮤텍스 잠금
int pthread_mutex_lock(pthread_mutex_t *mutex);

mutex : 잠금에 사용할 뮤텍스 객체다.

뮤텍스 잠금 해제
int pthread_mutex_unlock(pthread_mutex_t *mutex);

mutex : 잠금 해제에 사용할 뮤텍스 객체다.

스레드 대기
여러 객체가 함께 움직이려고 하면 신호를 기다려야 일이 제대로 진행되는 때가 있다.
병렬 처리 프로그램이 대표적인 예이다.
여러 스레드를 동시에 실행 시켜야 할 때 조건 변수를 사용한다.

조건 변수 

조건 변수 객체 만들기
int pthread_cond_init(pthread_cond_t *cond, const pthread_cond_attr *attr);

cond : 조건 변수 객체이다.
attr : 조건 변수 객체의 특징을 지정한다. NULL이면 기본 특징을 사용한다.

조건 변수 제거하기
int pthread_cond_destroy(pthread_cond_t *cond);

cond : 조건 변수 객체이다.

스레드 기다리기
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,
                              pthread_mutex_t *mutex, const struct timespec *abstime);

cond : 조건 변수 객체
mutex : 뮤텍스 객체. 조건 변수와는 별 상관 없을 것 같은 뮤텍스 객체를 사용한 이유
abstime : pthread_cond_timedwait 함수에서 사용한다. 지정한 시간 만큼 기다린다.

스레드 깨우기
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

cond : 조건 변수 객체

5. 멀티 스레드 프로그램의 장점과 단점

-장점-

응답성 향상 : 스레드는 새로운 프로세스를 만들지 않고, 코드조각을 만들기에
                  프로세스 복사보다 훨씬 더 빠르고 효율적으로 작동한다.

자원의 효율적인 사용 : 멀티 스레딩 프로그램은 각각의 cpu가 스레드를 담당해서 효율성이 늘어난다.

손쉬운 자원의 공유 : 멀티 스레드는 단일 프로세스에서 실행되기에 자원 공유가 쉽다.

-단점-

안정성 : 멀티 프로세스는 독립되어 있어서 하나가 문제가 생겨도 영향을 받지 않지만
           멀티 스레드는 하나의 프로세스에서 실행되기 때문에
           특정 스레드에서 발생한 문제가 다른 스레드에까지 영향을 끼칠 수 있다.

난해한 프로그래밍 기술  : 코드의 흐름을 이해하고 결과를 예측하기가 까다롭다.

소스 코드 받기

댓글 없음:

댓글 쓰기