2013년 7월 18일 목요일





쓰레드
cpu이용의 기본 단위로 쓰레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성된다. 

새로운 작업이 있을 때마다 새로운 프로세스를 생성하기 보다는 프로세스 안에 여러 쓰레드를 만드는 것이 더욱 효율적이다. 


다중 쓰레드의 장점
- 응답성 : 한 쓰레드가 작업중이라도 다른 쓰레드가 응답할 수 있다.
- 자원 공유 : 쓰레드가 속한 프로세스의 자원과 메모리를 공유한다.
- 경제성 : 쓰레드는 자신이 속한 프로세스 자원을 공유하기 때문에 쓰레드 문맥교환보다 효과적이다
- 다중처리구조의 활용 : 다중 처리기 구조에서는 각각의 쓰레드가 다른 처리기에서 병렬 수행이 가능하다.


다중 쓰레드 모델 
- 다대일 모델 : 많은 사용자 수준 쓰레드를 하나의 커널 쓰레드에 사상한다 Solaris(GreenThread), GNU(PortableThread) 
- 일대일 모델 : 각 사용자 쓰레드를 각각 하나의 커널 쓰레드로 사상한다. Windos시리즈, Linux 
- 다대다 모델 : 여러 개의 사용자 수준 쓰레드를 그보다 작은 혹은 같은 수의 커널 쓰레드로 다중화 한다. IREX(HP_UX), Tru64(UNIX)


쓰레드 라이브러리
프로그래머에게 쓰레드를 생성하고 관리하기 위한 API를 제공하는 것 
1. 커널의 지원없이 완전히 사용자 공간에서만 라이브러리를 제공 
2. 운영체제에 의해 지원되는 커널 수준 라이브러리를 구현

ex) Win32 Thread
CreateThread() : 생성하며 보안정보, 스택의 크기, 쓰레드 보류상태, 상태 플러그 등의 정보가 포함된다.
WaitForSingleObject() 합 쓰레드가 종료될 때까지 생성 쓰레드가 봉쇄 되도록 한다.



쓰레드 관련 문제 
- Fork() 및 Exec() 시스템 호출 Fork()은 모든 쓰레드를 복사하는 것과 시스템을 호출한 쓰레드만 복사하는 2가지 버전이 있다. 
- Exec()은 시스템 호출을 하면 exec()매개변수로 지정된 프로그램이 모든 쓰레드를 포함한 전체 프로세스를 대체한다.
- 취소 : 쓰레드가 끝나기 전에 그것을 강제로 종료시키는 작업
    비동기식 취소(한 쓰레드가 즉시 목적 쓰레드 강제 종료) 
    지연 취소(목적 쓰레드가 주기적으로 자신이 강제 종료될지 체크한다.)


신호 처리(Signal Handling) 
프로세스에게 어떤 사건이 일어났음을 알려주기 위해 사용되며 두가지 처리기가 있다. 
- 디폴트 신호 처리기 : 모든 신호마다 커널에 의해 실행
- 사용자 정의 신호 처리기 : 디폴트 신호 처리기의 대체로 사용 

Window는 신호를 명시적으로 지원하지는 않지만 비동기식 프로시저 호출(APC)를 사용해서 이를 대리 실행할 수 있다. APC는 사용자 쓰레드들이 특정 사건의 발생을 전달받았을 때 호출될 함수를 지정한다.



쓰레드 풀(Thread Pool)
다중 쓰레드는 여러 문제가 있는데 서비스할 때마다 쓰레드를 생성하는데 소요되는 시간이다. 모든 요청 때마다 새 쓰레드를 생성해 서비스 한다면 시스템에서 동시에 실행할 수 있는 최대 쓰레드 수가 몇 개가 한계인지 정해야 한다. 쓰레드 풀은 프로세스를 시작할 때 아예 일정한 수이 쓰레드들을 미리 풀로 만들어, 처리할 작업이 들어오면 이 풀에서 한 쓰레드에 그것을 할당한다.
장점
1. 새 쓰레드 생성보다 기존 쓰레드로 서비스 하는 것이 더욱 빠르다 
2. 쓰레드 풀은 임의 시각에 존재할 쓰레드 개수에 제핸을 둔다. 이러한 제한은 많은 수의 쓰레드를 병렬 처리할 수 없는 시스템에 도움이 된다.



스케줄러 액티베이션(Scheduler Activation)
사용자 쓰레드 라이브러리와 커널 쓰레드 간의 통신방법으로 커널은 응용에게 가상 처리기(LWP)의 집합을 제공하고 응용은 사용자 쓰레드를 가용한 가상 처리기로 스케줄한다. 커널은 응용에게 특정 사건에 대한 정보를 제공하는데 이것을 upcall이라 한다.


Windows XP Thread 
일반적인 쓰레드의 구성요소
 - 쓰레드 ID
 - 처리기의 상태를 나타내는 레지스터 집합 
 - 사용자 모드에서 실행될 때 필요한 사용자 스택, 커널모드에서 필요한 커널 스택
 - 실행 시간 라이브러리와 동적 링크 라이브러리
레지스터 집합, 스택, 개별 자료 저장 영역들은 그 쓰레드의 문맥이라 한다.

쓰레드의 자료 구조
ETHREAD _ 실행 쓰레드 블록(executive thread block) 쓰레드가 속한 프로세스를 가리키는 포인터, 실행을 시작해야 할 루틴의 주소 KTHREAD 포인터를 가짐
KTHREAD _ 커널 쓰레드 블록(kernel thread block) 쓰레드의 스케줄링 및 동기화 정보, 커널 스택, TEB의 포인터를 가짐
TEB - 쓰레드 환경 블록(thread environment block) 사용자 공간 자료구조로 쓰레드 식별자, 사용자 모드 스택 및 쓰레드별 자료를 저장하기 위한 배열을 가진다.



0 개의 댓글:

댓글 쓰기