실시간 리눅스 커널을 설치하기 위해서는 기존의 리눅스 커널을 패치하거나, 이미 실시간 패치가 적용된 커널을 다운로드하고 설치해야 한다. 여기에서는 RT-Preempt 패치를 이용하여 실시간 커널을 설치하는 과정을 설명하겠다.

1. 기본 패키지 설치

먼저, 커널 컴파일에 필요한 기본 패키지들을 설치해야 한다.

sudo apt-get update
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev

2. 커널 소스 코드 다운로드

다음으로, 리눅스 커널의 소스 코드를 다운로드한다. 최신 커널 소스 코드는 kernel.org에서 확인할 수 있다.

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.tar.xz
tar -xvf linux-5.4.tar.xz
cd linux-5.4

3. RT-Preempt 패치 다운로드

리눅스 커널을 실시간으로 패치하기 위해 RT-Preempt 패치를 다운로드한다. RT-Preempt 패치는 RT-Preempt 사이트에서 확인할 수 있다.

wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.4/patch-5.4.60-rt37.patch.xz
xz -d patch-5.4.60-rt37.patch.xz
patch -p1 < patch-5.4.60-rt37.patch

4. 커널 구성

실시간 커널을 구성하기 위해 메뉴 구성을 시작한다. 이 단계에서는 실시간 옵션을 활성화해야 한다.

make menuconfig

Processor type and features 섹션으로 이동하여 Preemption ModelFully Preemptible Kernel (RT)로 설정한다. 그 외 필요한 설정을 완료한다.

5. 커널 컴파일 및 설치

이제 실시간 커널을 컴파일하고 설치한다. 이 과정은 다소 시간이 걸릴 수 있다.

make -j$(nproc)
sudo make modules_install
sudo make install

6. 부트로더 업데이트

부트로더를 업데이트하여 새로 설치한 커널을 부팅할 수 있도록 설정한다. grub을 사용하는 경우 아래 명령어를 실행한다.

sudo update-grub

7. 시스템 재부팅

이제 시스템을 재부팅하여 실시간 커널로 부팅한다.

sudo reboot

8. 커널 확인

재부팅 후, 새로운 커널이 정상적으로 적용되었는지 확인한다.

uname -r

결과에 rt 문자가 포함되어 있으면 실시간 커널이 제대로 설치된 것이다.

실시간 태스크 스케줄링

리눅스에서 실시간 태스크 스케줄링을 사용하려면 태스크의 우선순위를 설정하고, 필요한 경우 적절한 스케줄링 정책을 적용해야 한다.

1. 실시간 우선순위 설정

실시간 프로세스는 표준 프로세스보다 높은 우선순위를 가질 수 있다. 이는 chrt 명령을 사용하여 설정할 수 있다. 예를 들어, 특정 PID를 가진 프로세스를 실시간 우선순위 50으로 설정하려면 다음과 같이 한다.

sudo chrt -f -p 50 <PID>

여기서 -f 옵션은 FIFO (First In First Out) 스케줄링 정책을 지정한다. FIFO 정책 외에도 -r 옵션을 사용하여 RR (Round Robin) 정책을 지정할 수 있다.

2. 실시간 스케줄링 정책 적용

리눅스 실시간 스케줄링 정책에는 주로 두 가지가 있다: FIFO (First In First Out)와 RR (Round Robin). 이 두 정책 모두 실시간 우선순위를 가진 프로세스를 관리하기 위한 것이다.

FIFO 스케줄링

FIFO 스케줄링에서는 높은 우선순위를 가진 태스크가 종료되거나 자신이 원할 때까지 실행되며, 우선순위가 같은 태스크 간에는 먼저 대기한 순서대로 실행된다.

RR 스케줄링

RR 스케줄링에서는 FIFO와 마찬가지로 높은 우선순위를 가진 태스크가 우선 실행되지만, 동일 우선순위의 태스크 간에는 시간 할당량(Time Quantum)을 두고 순환적으로 실행된다.

3. C 프로그래밍 예제

실시간 프로세스를 만들고 관리하는 간단한 C 코드 예제를 살펴봅시다. 이 예제는 sched_setscheduler 함수를 사용하여 실시간 스케줄링을 설정한다.

#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    struct sched_param param;
    int max_priority = sched_get_priority_max(SCHED_FIFO);

    param.sched_priority = max_priority;

    if (sched_setscheduler(0, SCHED_FIFO, &param) == -1) {
        perror("sched_setscheduler failed");
        exit(EXIT_FAILURE);
    }

    printf("Running with real-time priority %d\n", max_priority);

    while (1) {
        // 실시간 작업 수행
        printf("Real-time task running...\n");
        sleep(1);
    }

    return 0;
}

이 코드는 현재 프로세스를 SCHED_FIFO 정책으로 설정하고, 최대 우선순위로 실행한다. 그런 다음 무한 루프로 들어가서 매 초마다 메시지를 출력한다.

리눅스 실시간 성능 측정 도구

실시간 성능을 측정하고 튜닝하기 위해 여러 도구를 사용할 수 있다. 대표적인 예로 cyclictestlatencytop 등이 있다.

1. cyclictest

cyclictest는 주기적인 타이머를 사용하여 시스템 지연을 측정하는 도구이다. 이를 통해 실시간 성능을 평가할 수 있다.

sudo apt-get install rt-tests
sudo cyclictest -m -Sp90 -i 1000 -h 100 -l 10000

이 명령은 1000 마이크로초 간격으로 10000회 측정을 수행하며, 최대 지연 시간을 100 마이크로초로 설정한다.

2. latencytop

latencytop은 시스템 지연의 원인을 분석하는 데 도움이 되는 도구이다. 이는 실시간 시스템에서 성능 문제를 진단하는 데 유용하다.

sudo apt-get install latencytop
sudo latencytop

latencytop은 실시간으로 시스템의 지연 현상을 모니터링하고 원인을 분석해준다.

이상으로 실시간 리눅스 환경 설정과 관련된 주요 내용을 다루었다. 다음은 실시간 제어 소프트웨어 개발에 대해 알아보겠다.