[리눅스] 제 리눅스 프로세스와 스레드 (저급)

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

 

추천

출처www.cnblogs.com/vx-cg248805770/p/11653265.html