SCHED_FIFOSCHED_RR은 리눅스 커널의 실시간 스케줄링 정책 중 두 가지로, 실시간 시스템에서 높은 우선순위를 가진 작업을 효과적으로 처리하기 위해 사용된다. SCHED_FIFOSCHED_RR는 각각의 특성과 활용 방법이 다르며, 이를 정확히 이해하고 적용하는 것은 Preempt RT 환경에서 실시간 애플리케이션의 성능을 최적화하는 데 매우 중요하다.

SCHED_FIFO

SCHED_FIFO(First-In, First-Out) 스케줄링 정책은 선입선출 방식으로 동작하는 비선점(Non-Preemptive) 실시간 스케줄러이다. 이 정책에서는 우선순위가 높은 스레드가 실행 중일 때, 그 스레드가 명시적으로 sched_yield()를 호출하거나, 더 높은 우선순위를 가진 다른 스레드가 준비 상태에 놓이지 않는 한, 절대로 실행이 중단되지 않는다. 이는 실시간 시스템에서 매우 결정론적(Deterministic)인 응답 시간을 보장할 수 있다는 장점이 있다.

SCHED_FIFO의 동작 원리

SCHED_FIFO는 다음과 같은 원칙에 따라 동작한다:

SCHED_FIFO 스케줄링의 예

다음은 SCHED_FIFO를 사용하는 간단한 스레드 생성 예제이다:

#include <sched.h>
#include <pthread.h>
#include <stdio.h>

void* thread_function(void* arg) {
    printf("Thread with SCHED_FIFO policy is running\n");
    while(1) {
        // 무한 루프 안에서 작업 수행
    }
}

int main() {
    pthread_t thread;
    struct sched_param param;

    pthread_create(&thread, NULL, thread_function, NULL);

    param.sched_priority = 10; // 우선순위 설정
    pthread_setschedparam(thread, SCHED_FIFO, &param);

    pthread_join(thread, NULL);

    return 0;
}

이 예제에서 SCHED_FIFO 스레드는 무한 루프 내에서 작업을 수행하며, 명시적으로 양보하거나 종료되지 않는 한 CPU를 계속 점유하게 된다.

SCHED_RR

SCHED_RR(Round-Robin) 스케줄링 정책은 SCHED_FIFO와 유사하지만, 시간 할당량(Time Slice)을 사용하여 동일한 우선순위를 가진 스레드들 간에 공정하게 CPU를 분배한다. SCHED_RRSCHED_FIFO와 달리 선점적(Preemptive) 스케줄링을 허용하며, 실시간 응답성과 함께 시스템의 유연성을 보장한다.

SCHED_RR의 동작 원리

SCHED_RR는 다음과 같은 원칙에 따라 동작한다:

SCHED_RR 스케줄링의 예

다음은 SCHED_RR를 사용하는 스레드 생성 예제이다:

#include <sched.h>
#include <pthread.h>
#include <stdio.h>

void* thread_function(void* arg) {
    printf("Thread with SCHED_RR policy is running\n");
    while(1) {
        // 무한 루프 안에서 작업 수행
    }
}

int main() {
    pthread_t thread;
    struct sched_param param;

    pthread_create(&thread, NULL, thread_function, NULL);

    param.sched_priority = 10; // 우선순위 설정
    pthread_setschedparam(thread, SCHED_RR, &param);

    pthread_join(thread, NULL);

    return 0;
}

이 예제에서는 SCHED_RR 스레드가 무한 루프 내에서 작업을 수행하며, 동일한 우선순위의 다른 스레드들과 공정하게 CPU 시간을 나누어 사용하게 된다.

SCHED_FIFO와 SCHED_RR의 비교

SCHED_FIFOSCHED_RR는 각각 장단점이 있으며, 특정 상황에 따라 적절하게 선택하여 사용해야 한다.

SCHED_FIFO vs SCHED_RR

SCHED_FIFOSCHED_RR의 적절한 활용

SCHED_FIFOSCHED_RR의 설정 및 조정

스레드의 스케줄링 정책을 설정하기 위해 pthread_setschedparam() 함수를 사용한다. 이 함수는 스레드의 스케줄링 정책과 우선순위를 설정하는 데 사용된다. 예를 들어, 다음과 같이 스레드의 스케줄링 정책을 설정할 수 있다:

#include <pthread.h>
#include <sched.h>
#include <stdio.h>

void* thread_function(void* arg) {
    printf("Thread with SCHED_FIFO policy is running\n");
    while(1) {
        // 무한 루프 안에서 작업 수행
    }
}

int main() {
    pthread_t thread;
    struct sched_param param;

    pthread_create(&thread, NULL, thread_function, NULL);

    param.sched_priority = 10; // 우선순위 설정
    // SCHED_FIFO 또는 SCHED_RR로 스케줄링 정책 설정
    pthread_setschedparam(thread, SCHED_FIFO, &param);
    // pthread_setschedparam(thread, SCHED_RR, &param); // SCHED_RR로 설정할 경우

    pthread_join(thread, NULL);

    return 0;
}

위 예제에서 pthread_setschedparam() 함수를 사용하여 스레드의 스케줄링 정책을 SCHED_FIFO로 설정하고 있다. SCHED_RR로 변경하려면 주석을 해제하면 된다.

스케줄링 정책과 성능 최적화

실시간 애플리케이션의 성능을 최적화하기 위해서는 스케줄링 정책 외에도 여러 요소를 고려해야 한다. SCHED_FIFOSCHED_RR의 활용뿐만 아니라, 실시간 시스템의 전체적인 성능을 높이기 위해 다음과 같은 최적화 기법을 고려할 수 있다:

SCHED_FIFOSCHED_RR의 디버깅과 모니터링

실시간 스케줄링 정책을 적용한 시스템에서는 디버깅과 모니터링이 중요하다. 각 스케줄링 정책의 동작을 확인하고, 문제가 발생할 경우 신속하게 대응하기 위해 몇 가지 도구와 기법을 사용할 수 있다.

디버깅 기법

bash chrt -f 10 <pid>

이 명령어는 프로세스 <pid>의 스케줄링 정책을 SCHED_FIFO로 설정하며, 우선순위를 10으로 설정한다.

성능 모니터링

실시간 애플리케이션에서의 고려 사항

실시간 애플리케이션을 개발하고 운영할 때는 다음과 같은 추가적인 고려 사항이 있다: