쓰레드 스케줄링이란?
- 대다수 운영체는 커널 수준 쓰레드도 스케쥴의 대상으로 포함.
- 사용자 수준 쓰레드와 커널 수준 쓰레드의 스케쥴링에 대한 쟁점을 보자.
경쟁 범위
다대일 모델과 다대다 모델
- 쓰레드 라이브러리는 사용자 수준 쓰레드를 가용한 LWP 상에서 스케쥴
- 동일한 프로세스에 속한 쓰레드 사이에서 CPU를 경쟁.
- 이를 프로세스-경쟁-범위(PCS)라고 함.
CPU 상의 어느 커널 쓰레드를 스케쥴 할 건지 결정하기 위해 커널은 시스템 경쟁 범위(SCS)를 사용.
SCS 스케쥴링에서 CPU에 대한 경쟁은 모든 쓰레드 사이에서 발생.
일대일 모델 → 오직 SCS 만을 이용해 결정
PCS는 우선순위에 따라 행해짐
- 일부 쓰레드 라이브러리는 프로그래머가 우선순위를 바꿀 수 있게 허용
- PCS는 더 높은 우선순위의 쓰레드를 위해 현재 진행중인 쓰레드를 선점.
- 단, 같은 우선순위의 쓰레드들 사이에는 타임 슬라이스에 대한 보장이 없음.
Pthread 스케줄링
c
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5 // 쓰레드 갯수
int main(int ac, char **av)
{
int scope;
pthread_t tid[NUM_THREADS];
pthread_attr_t attr;
pthread_attr_init(&attr); // 초기화 설정
// 기존의 경쟁범위 방식으로 결정
if (pthread_attr_getscope(&attr, &scope) != 0)
fprintf(stderr, "unable to get scheduling scope\n");
else {
if (scope == PTHREAD_SCOPE_PROCESS)
printf("PTHREAD_SCOPE_PROCESS");
else if (scope == PTHREAD_SCOPE_SYSTEM)
printf("PTHREAD_SCOPE_SYSTEM");
else
fprintf(stderr, "Illegal scope value\n");
}
// 새 경쟁범위 방식을 지정
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
// 경쟁범위에 따른 쓰레드 생성 및 회수
for (int i = 0; i < NUM_THREADS; i++)
pthread_create(&tid[i], &attr, runner, NULL);
for (int i = 0; i < NUM_THREADS; i++)
pthread_join(tid[i], NULL);
}
void runner(void *param)
{
pthread_exit(0);
}