사용자 수준 스레드와 커널 스레드의 한 가지 차이점은 스케줄링 방식에 있다. 다대일 및 다대다 모델을 구현하는 시스템에서 스레드 라이브러리는 사용자 수준 스레드가 사용 가능한 LWP(Light-weight process) 에서 실행되도록 스케줄링한다. 이 방식은 동일한 프로세스에 속한 스레드 간에 CPU 경쟁이 일어나기 때문에 process contention scope(PCS)로 알려져 있다. (스레드 라이브러리가 사용자 스레드를 사용 가능한 LWP에 예약한다고 할 때, 운영 체제에서 LWP의 커널 스레드를 물리적 CPU 코어에 예약해야 하므로 스레드가 실제로 CPU에서 실행된다는 의미는 아니다.
CPU에 예약할 커널 수준 스레드를 결정하기 위해, 커널은 system-contention scope(SCS)를 사용한다. SCS 스케줄링을 통한 CPU 경쟁은 시스템의 모든 스레드 간에 발생한다. Windows 및 Linux와 같은 일대일 모델을 사용하는 시스템은 SCS만 사용하여 스레드를 스케줄링한다.
일반적으로 PCS는 우선순위에 따라 수행된다. 즉, 스케줄러는 가장 높은 우선순위를 가진 실행 가능한 스레드를 선택한다. 사용자 수준 스레드 우선순위는 프로그래머가 설정하고 스레드 라이브러리에서 조정하지 않지만, 일부 스레드 라이브러리는 프로그래머가 스레드의 우선순위를 변경할 수 있도록 허용할 수 있다. PCS는 일반적으로 현재 실행 중인 스레드를 우선순위가 더 높은 스레드로 우선시하지만, 우선순위가 같은 스레드 간에 time slicing이 보장되지 않는다.
Pthreads는 다음 contention scope 값을 식별한다.
PTHREAD_SCOPE_PROCESS는 PCS 스케줄링을 사용하여 스레드를 스케줄링한다. PTHREAD_SCOPE_SYSTEM은 SCS 스케줄링을 사용하여 스레드를 스케줄링한다.다대다 모델을 구현하는 시스템에서 PTHREAD_SCOPE_PROCESS 방법은 사용자 수준 스레드를 사용 가능한 LWP에 스케줄링한다. LWP의 수는 스레드 라이브러리에서 유지 관리하며, 아마도 스케줄러 활성화를 사용할 것이다. PTHREAD_SCOPE_SYSTEM 스케줄링 방법은 다대다 시스템에서 각 사용자 수준 스레드에 대한 LWP를 생성하고 바인딩하고, 일대일 방법을 사용하여 스레드를 효과적으로 매핑한다.
Pthread IPC(Interprocess Communication)은 다음 두 가지 기능을 제공한다(setting과 getting).
pthread_attr_setscope(pthread_attr_t *attr, int scope)pthread_attr_getscope(pthread_attr_t *attr, int **scope)두 함수의 첫 번째 매개변수에는 스레드의 속성 집합에 대한 포인터가 들어있다. pthread_attr_setscope() 함수의 두 번째 매개변수에는 PTHREAD_SCOPE_PROCESS 또는 PTHREAD_SCOPE_SYSTEM 값이 전달되어 contention scope를 설정하는 방법을 나타낸다. pthread_attr_getscope() 함수의 두 번째 매개변수에는 contention scope의 현재 값으로 설정된 int 값에 대한 포인터가 들어있다. 오류가 발생하면 이러한 함수는 각각 0이 아닌 값을 반환한다.
그림 5.10에서 Pthread 스케줄링 API를 보여준다. 프로그램은 먼저 기존 contention scope를 결정하고 PTHREAD_SCOPE_SYSTEM으로 설정한다. 그 다음 SCS 스케줄링 방법을 사용하여 실행되는 다섯 개의 별도 스레드를 만든다. 일부 시스템에서는 특정 contention scope 값만 허용된다. 예를 들어 Linux 및 macOS 시스템은 PTHREAD_SCOPE_SYSTEM만 허용한다.
