열렬히.뛰기

쓰레드 스케쥴링

운영체제 > Part 2 : 프로세스 관리 > 공룡책 5장 : cpu 스케쥴링 > 쓰레드 스케쥴링

쓰레드 스케줄링이란?

  • 대다수 운영체는 커널 수준 쓰레드도 스케쥴의 대상으로 포함.
  • 사용자 수준 쓰레드와 커널 수준 쓰레드의 스케쥴링에 대한 쟁점을 보자.

경쟁 범위

다대일 모델과 다대다 모델

  • 쓰레드 라이브러리는 사용자 수준 쓰레드를 가용한 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);
}