멀티프로세스
멀티프로세스 기반의 단점은 초당 수천 번까지 일어나는 context switching에 따른 부담이다.
* Context Switching이란?
- 프로그램의 실행을 위해서는 해당 프로세스의 정보가 메인 메모리에 올라와야 한다. 때문에 현재 실행중인 A 프로세스의 뒤를 이어서 B 프로세스를 실행시키려면 A 프로세스 관련 데이터를 메인 메모리에서 내리고 B 프로세스 관련 데이터를 메인 메모리로 이동시키는 것 이 때 A 프로세스 관련 데이터는 하드디스크로 이동하기 때문에 컨텍스트 스위칭에는 오랜 시간이 걸리고 한계가 있다.
멀티쓰레드
멀티프로세스의 단점을 극복하기 위해 설계된 ‘경량화 된 프로세스’이다.
쓰레드의 생성 및 컨텍스트 스위칭은 프로세스의 생성 및 컨텍스트 스위칭보다 빠르다.
쓰레드 사이에서의 데이터 교환에는 특별한 기법이 필요치 않다.
쓰레드와 프로세스의 차이점
프로세스는 위의 그림과 같이 서로 완전히 독립적이다. 프로세스는 운영체제 관점에서의 실행흐름을 구성한다.
쓰레드는 프로세스 내에서의 실행흐름을 갖는다. 그리고 데이터 영역과 힙 영역을 공유하기 때문에 컨텍스트 스위칭에 대한 부담이 덜하다. 또한 공유하는 메모리 영역으로 인해서 쓰레드간 데이터 교환이 매우 쉽게 이뤄진다.
쓰레드의 생성
int pthread_create( ptrhread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
thread : 생성할 쓰레드의 ID 저장을 위한 변수의 주소 값 전달, 참고로 쓰레드는 프로세스와 마찬가지로 쓰레드의
구분을 위한 ID가 부여된다.
attr : 쓰레드에 부여할 특성 정보의 전달을 위한 매개변수, NULL 전달 시 기본적인 특성의 쓰레드가 생성된다.
start_routine : 쓰레드의 main함수 역할을 하는, 별도 실행흐름의 시작이 되는 함수의 주소값 전달
arg : 세 번째 인자를 통해 등록된 함수가 호출될 때 전달할 인자의 정보를 담고 있는 변수의 주소 값 전달.
-> 성공 시 0, 실패 시 0 이외의 값 반환
int pthread_join(pthread_t thread, void **status);
thread : 이 매개변수에 전달되는 ID의 쓰레드가 종료될 때까지 함수는 반환하지 않는다.
status : 쓰레드의 main함수가 반환하는 값이 저장될 포인터 변수의 주소 값을 전달한다.
-> 성공 시 0, 실패 시 0 이외의 값 반환위 함수의 첫 번째 인자로 전달되는 ID의 쓰레드가 종료될 때까지, 이 함수를 호출한 프로세스를 대기상태에 둔다. 또한, 쓰레드의 main 함수가 반환하는 값까지 얻을 수 있다.
즉 쓰레드보다 프로세스가 먼저 끝나서 쓰레드가 미리 종료되는 일이 없게 한다.
실행과 성능측정 (0) | 2016.12.17 |
---|---|
Chattting Project (0) | 2016.12.17 |
select 와 epoll (0) | 2016.12.16 |