4. 리눅스 커널 수준 스레드와 사용자 수준 스레드
POSIX 쓰레드 스케줄링은 하이브리드 모델은 또한 커널 레벨 쓰레드 모두 사용자 수준의 지원을 지원합니다. 당신이 스레드 contentionscope 속성을 만들 때 설정할 수 있습니다 :
- PTHREAD_SCOPE_PROCESS. 그것은 과정에서 다른 스레드 등가 사용자 레벨 스레드와 경쟁 새로 만들어진 스레드 프로세서 리소스를 나타낸다.
- PTHREAD_SCOPE_SYSTEM. 커널 수준 스레드와 같은 설명 스레드가 새롭게 동일한 프로세서 시스템 전체의 범위 내에서 자원에 대한 경쟁을 만들었습니다.
(1) 커널 수준 스레드
- 스레드 생성, 탈퇴 및 핸드 오버, 우리는 스레드를 예약 할 수 있습니다 각 개체의 핵심 이해를 달성하기 위해 커널을 직접해야합니다.
- 이 스레드는 시스템에서 자원에 대한 경쟁이 될 수 있습니다.
- 스레드 제어 블록 (TCB에), 제어 블록에 기초하여, 커널을 제공 스레드의 존재를 감지하고, 커널 공간 커널 레벨 스레드들 각각에 대한 제어를 행한다.
- 사용자 모드 변환 스레드 스위칭 모드 커널은 커널에 의해 커널을 스위칭 제어한다. 사용자 모드에서 커널 모드로 전체 수익에서 전환, 멀티 코어 CPU를 사용하여, SMP의 좋은 사용, 즉 수 있습니다.
이 과정은 과정을 일정보다 조금 비싼 만들고, 어느 정도 유사하다. 누군가 1:10의 비용에 소요되는 시간보다 스레드와 프로세스를 만들 수있는 실험을했다. 커널 레벨 스레드 생성 코드는 다음과 같이 pthread_attr_t의 ATTR, pthread_attr_init (ATTR는) AcceptThread //는 (iAcceptThreadId를 스레드 RET =는 pthread_create 만들기, ATTR, (ATTR, PTHREAD_SCOPE_SYSTEM) 높은 응답 속도 pthread_attr_setscope을 얻기 위해 커널 레벨 쓰레드 세트 // , NULL);
(2) 사용자 레벨 스레드
이점
- 커널 리소스가 여전히 방법에 따라 할당 할당 각 사용자 스레드는 과정에서 자원에 대한 경쟁이 될 수 있습니다.
- 사용자 수준 스레드 스위칭 (쓰레드 스케줄링 매우 빠른하게 메모리 캐시를 새로 고침 할 필요가 없습니다, 핵심, 아니 컨텍스트 스위치로 분류 할 필요가 없습니다) 빠른 크기의 최소 주문보다 커널로 전환하는 등의 스레드로, 사용자 공간에서 발생 . 스레드 같은 스레드 관리의 비용으로 비용을 전환, 만들기 및 스레드를 파괴하는 과정과 절차는 로컬 프로 시저 호출이기 때문에 커널 스레드, 보존의 스레드 상태보다 훨씬 작습니다.
- 커널 및 사용자가 스레드를 볼 수 없습니다. -> 중요한 차이점
- 사용자 수준 스레드가 더 나은 확장 성을 가지고, 테이블 공간과 커널 수준 스레드보다 스택 공간을 활용할 수 스레드, 이것은 커널 스레드는 커널 공간에서 몇 가지 고정 된 테이블 공간과 스택 공간을 필요로하기 때문에 경우 커널 스레드 수 매우 큰 문제가있을 것입니다.
- 스레드를 지원하지 않는 운영 체제에서 구현 될 수있다.
- 각 프로세스를 허용하면 스레드 관리가보다 유연, 자신의 스케줄링 알고리즘을 사용자 정의합니다. 즉 자신의 관리 절차, 커널 스레드의 차이를 작성해야합니다.
- 스케줄링은 커널에 직접 관여 스레드, 간단한 제어를 필요로하지 않습니다.
단점 :
- 스레드가 차단 된 프로세스는 다른 모든 스레드를 차단합니다.
- 스레드가 실행되면, 그 과정에서 다른 스레드는 첫 번째 스레드 면제 CPU하지 않는 한 실행되지 않습니다. 이 때문에 한 번의 공정에서, 상기 클록을 중단하지 않고, 상기 스레드 스케줄링 모드, 멀티 코어 CPU의 안 좋은 사용 라운드 로빈 (회전)을 사용하지 않는다.
pthread_attr_init (ATTR를, pthread_attr_t의 ATTR : 사용자 수준 스레드는 다음과 같이 코드를 작성하는 //) , (ATTR, PTHREAD_SCOPE_PROCESS) 설정 사용자 수준 스레드 pthread_attr_setscope을 // 스레드 RET =는 pthread_create을 (iAcceptThreadId, 생성 ATTR, AcceptThread, NULL을); 하지만 리눅스 쓰레드 만 실현 PTHREAD_SCOPE_SYSTEM, 즉, 리눅스는 커널 수준 스레드를 제공합니다. 실행 다음 절차는 결과를 관찰 할 수있다. 이 프로그램은 4 개의 사용자 레벨 스레드 (0-3) 네 개인 커널 수준 스레드 (4-8), 그러나보기의 운영 결과, 거의 동일한 각 스레드 실행 시간을 만듭니다. 리눅스는 사용자 수준 스레드를 달성 할 경우, 스레드 (0-3) 구현은 더 많은 시간을 필요로한다. 리눅스 사용자 수준 스레드를 구현하지 않습니다 표시.
#INCLUDE <STDIO.H> #INCLUDE <stdlib.h> #INCLUDE <pthread.h를> 사용법 #include <unistd.h> #INCLUDE <time.h> INT N-; // 공유 변수는 공유 변수 뮤텍스해야 디자인을 단순화하기 위해, // 이 프로그램은 상호 배타적 인 문제로 간주되지 않습니다. (다른 상호 배제 메커니즘), 무효 * 펀 ( 공극 *의 ID) { int로 I, J, SUM = 0 , NUM은 = 0 ; time_t T, 시간 ( & T) 의 printf ( " T의 %의 S : 시작 ... \ N- " ( 숯 * ) ID) 에 대해 (I = 0 ; I는 < 100 ; I ++을 ) { 대한 (j = 0 ; j를 < 10000000 ; J ++ ) { 합계 + = 1 ; } } N ++ ; 의 printf ( " T % s의 시간 : % LD \ 없음 " , ( 숯불 *) ID, 시간 (NULL) - t); } 숯 TID [ 8 ] [ 2 ]; INT 본체 ( 무효 ) { 가 pthread_t를 t [ 8 ]; int로 난; pthread_attr_t의 ATTR; pthread_attr_init ( & ATTR); //설정 사용자 수준 스레드. pthread_attr_setscope ( 및 , ATTR하는 PTHREAD_SCOPE_PROCESS) 에 대해 (I = 0 ; I는 < 4. , I는 ++ ) { TID는 [I]는 [ 0 ] = 48 + I] 는 pthread_create ( & T [I], ATTR, 오락, TID [I]) ; } // 더 높은 응답 속도를 얻기 위해, 커널 레벨 쓰레드 세트 (pthread_attr_setscope을 & , ATTR PTHREAD_SCOPE_SYSTEM을) 에 대해 (= I . (4) , I는 < 8. , I는 ++ ) { TID는 [I]는 [ 0 ] = 48 + I; 는 pthread_create ( & T [I],ATTR, 재미 TID [I]); } 동안 (N! = 8 ); 반환 0 ; }
GCC test2.c -o TEST2 -lpthread
결과 :
xianchen $ ./ TEST2 T1은 ... 시작 ... 시작 : T5 ... 시작 : T2 ... 시작 : T7 ... 시작 : T0 ... 시작 : T4 ... 시작 : T6 T3 : 시작 ... T2 시간 : 2 T5 시간 : 3 T6 시간 : 3 T3 시간 : 3 T4 시간 : 3 T7 시간 : 3 T1 시간 : 3 T0 시간 : 3 T0 시간 : 3