다음 이전 차례

5. 리얼타임 리눅스

지금부터 소개할 내용은 RT-Linux라고 불리는 것으로서 멀티태스킹 OS에서 해결하기 힘든 리얼 타임(Real-Time) 지원을 리눅스에 가져온 독특한 프로젝트이다. 일반적으로 선점형 멀티태스킹 시스템에서 정확한 시간 주기를 가지고 일을 해야 하는 프로세스에게 커널이 정확한 타이밍을 맞춰준다는 것은 거의 불가능한 일처럼 보인다.

거의 대부분의 작업들(예를 들어 워드 프로세싱, 웹 브라우징 등)은 짧은 시간 간격, 정확한 주기와는 별 상관없는 것들이다. 몹시 부하가 걸려 워드 프로세서에게 넘겨져야 할 제어권이 잠시 지연된다던가 해서 워드 작업을 망치거나 하지는 않는다. 네트워크 사정 때문에 멈추기 일쑤인 브라우징 작업이 1-2 초 다른 작업에 의해 멈춰진다 해도 문제될 것은 없다.

필자로서는 정확한 주기를 가지고 시그널을 보내야 한다든지 하는 중요한 작업에 어떤 일이 있는지 잘 상상이 안되지만 어찌 되었든 실시간 지원 OS에 대한 중요성을 빠뜨릴 수 없는 것 중 하나라고 한다. 이 문제를 리눅스에서 해결해야만 관찰/감시 카메라, 로봇 또는 여러 과학 관련 도구들을 리눅스를 운영하는 PC에 연결하여 활용하는 것이 가능해진다.

리눅스에서 정확한 타이밍이 이뤄지지 않는 순간에 대해서 서술하라면 멀리서 찾지 않아도 된다. 여러분은 대부분 덩치도 크고 뜨는데 시간도 많이 걸리는 넷스케이프를 리눅스/X 윈도에서 띄워본 적이 있을 것이다. 뜨는 동안 마우스 조차 움직일 생각을 하지 않고 모든 프로그램들이 헤매는 모습을 쉽게 확인할 수 있다.

5.1 소프트 리얼 타임 지원

어떠한 패치 없이 표준 커널 안에 들어있는 리얼 타임 지원을 사용하는 것을 소프트 리얼 타임 지원이라고 부르고 있다. 커널 컴파일 설정시 문자 장치(Character Devices)-->Enhanced Real Time Clock Support를 설정하고 나서 커널 컴파일을 해보도록 하자. 그리고 나서 메이저 번호 10, 마이너 번호 135의 문자 장치 파일 /dev/rtc 파일을 만든다.

# mknod /dev/rtc c 10 135

[yong@freeyong 9705]$ cat /proc/interrupts
 0:  2859962  timer
 1:   140285  keyboard
 2:     0  cascade
 3:  1447093 + serial
 4:     1 + serial
 5:     1  sound blaster
 8:     0 + rtc
10:    430 + aic7xxx
12:   202636  PS/2 Mouse
13:     1  math error
14:   252100 + ide0
15:   421489 + ide1

리얼 타임 지원 기능을 갖는 커널로 부팅하고 나서 인터럽트 사용 현황을 살펴보면 8번 인터럽트를 rtc 기능에서 사용하고 있다는 것을 볼 수 있다.

자, 리눅스 소프트 리얼 타임 지원을 시험해보기 위한 프로그램을 하나 구해와야 한다. 다음은 바로 리눅스 커널 내부 기능을 사용하는 rt 라는 프로그램 실행기의 LSM(Linux Software Map) 파일이다.

Legin3
Title:          rt - run program on realtime priority
Version:        1.0
Entered-date:   12 Jan 1997
Description:    rt starts any program on realtime priority, like nice
                does with lower priority. Lets you choose scheduler
                class (SCHED_RR vs SCHED_FIFO policy) and priority.
Keywords:       linux, real time, scheduler
Author:         Boris Tobotras <boris@xtalk.msk.su>
Maintained-by:  Boris Tobotras <boris@xtalk.msk.su>
Primary-site:   sunsite.unc.edu /pub/Linux/system/Admin
                10 kb rt-1.0.tar.gz
Alternate-site: ftp.macsimum.ru /pub/Linux/local
                10 kb rt-1.0.tar.gz
Platform:       Linux 1.3.87 and later
Copying-policy: GPL
End

소스를 가져와 컴파일하고 설치하는 과정을 소개할 필요없이 아주 간단하다. 결과로 나오는 바이너리명은 rt이다.

Usage: rt [options] command

Recognized options are:
    -r  Use SCHED_RR scheduling policy (default);
    -f  Use SCHED_FIFO scheduling policy;
    -p  N Set priority level N. If N<0, set priority level
        to sched_get_priority_min(POLICY)-N.
        Default is (sched_get_priority_max()+sched_get_priority_min())/2;
    --  End of options;
    -v  Be verbose;
    -h  This help screen.

지금은 splay와 같은 훌륭한 MPEG Layer3 플레이어가 나왔으므로 사용할 필요가 없어졌지만 시험상 예전에는 바이너리로만 주어진 셰어웨어 버전의 mp3play를 사용한 적이 있었다. mp3play는 사실 스크립트에 불과하고 l3dec라는 프로그램과 wavplay를 불러다 사용하였다. 문제는 펜티엄 120 이상에서도 조금만 다른 프로세스가 동작한다든지 할 때는 심하게 음이 끊기는 것이었다. 소스 코드가 공개되어 있지 않으므로 별다른 해결 방법을 찾지 못하다가 rt라는 프로그램을 알게 되었고 리눅스 커널에 이미 어느 정도의 리얼 타임 지원이 들어있었다는 것을 그제서야 알게 되었다.

rt [옵션들] -- <리얼타임 지원을 원하는 명령>
( 위에서 -- 는 rt에 대한 옵션의 끝임일 알린다 )

이렇게 수행시키면 예를 들어 mp3play의 경우 넷스케이프와 같은 프로그램이 시작해도 rt를 통해 수행시킨 프로세스에게 상당한 우선권이 부여되어 있으므로 전혀 끊기지 않는 현상을 목격할 수 있었다. 루트 사용자만 사용할 수 있다. 당연히 한 프로세스에 대하여 특별한 우선권이 주어졌다는 것은 전체적으로 다른 프로세스들에게 악영향이 간다는 것을 의미한다.

5.2 하드 리얼 타임 지원

현재 리눅스 커널 안에서 기본적으로 제공하고 있는 리얼 타임 지원을 소프트라고 부르는 것은 Michael Barabanov씨와 Victor Yodaiken씨의 RT-Linux 프로젝트에 대한 상대적인 개념으로서 그렇게 부르는 것이다. 커널 패치의 형태로 주어지는 RT-Linux는 더욱 더 강력한 형태의 리얼 타임 지원을 해주도록 리눅스 커널 구조에 약간의 변화를 준 것이다. 관련 사이트는 다음과 같다. luz.cs.nmt.edu/~rtlinux/ 여러분은 여기서 일단 커널 2.0.27에 대한 패치 형식으로 된 rtlinux-0.5.tgz 파일을 받아와야 한다. 커널 2.0.29에 대해서는 웹 페이지에서 별도의 패치 파일을 받아오면 된다. 파일을 풀어보면 rtlinux-0.5라는 디렉터리가 만들어지고 kernel_patch라는 파일을 하나 볼 수 있을 것이다. 그 파일을 /usr/src 디렉터리 밑으로 복사한다. 레드햇 4.1 사용자라면 이미 커널 버전은 2.0.27 일 것이다.

cd /usr/src/linux
patch -p2 < ../kernel_patch

patch 프로그램에 -p2 옵션을 주는 것에 유의하자.

make config
make dep ; make clean
make zlilo
make modules ; make modules_install

일반적인 커널 컴파일 과정을 마치고 나면 /lib/modules/2.0.27/misc 디렉터리에 rt_prio_sched.o 라는 모듈 파일이 하나 생긴다. 리얼타임 지원을 사용하려면 바로 저 모듈을 로딩해주어야 한다.그리고 나서 rt_fifo_new.o 모듈도 로딩한다.

modprobe rt_prio_sched.o
modprobe rt_fifo_new.o

[root@freeyong /root]# lsmod
Module        Pages      Used by
rt_fifo_new     2      [rt_process]  0
rt_prio_sched   1                    0
sbpcd          14                    1
aic7xxx        10                    0
bsd_comp        1                    0
ppp             5      [bsd_comp]    1
slhc            2      [ppp]         1
lp              2                    0

모듈이 로딩되면 리눅스 커널과 하드웨어 레벨 사이에 리얼 타임 커널층을 끼워지게 되어 둘 간의 처리를 중간에 가로채어 처리하게 되는 형태이다. 그 다음에 해주어야 하는 일은 /dev 디렉터리에 적절한 장치를 만드는 일이다. 배시 사용자라면 명령행에서 다음과 같이 입력해주면 된다.

for i in 0 1 2 3; do mknod /dev/rtf$i c 63 $i; done

펜티엄 120 머신에서 RT-Linux는 150 마이크로초 수준의 정확도를 가지고 스케쥴링을 해줄 수 있다고 한다.

여러분의 시스템에 리얼 타임 지원이 필요한가? 대부분의 사람들에게는 물론 논외의 문제일 것이다. 그리고 소프트 리얼 타임 지원만으로도 충분할 것이라고 본다.

5.3 테스트 해보기

rtlinux-0.5 디렉터리에 보면 testing이라는 디렉터리를 볼 수 있을 것이다. 각 디렉터리의 README를 읽어보고 테스팅을 해보기 바란다. sound 디렉터리에 있는 예를 실행해보면 리얼 타임 지원이 어떠한지 감을 잡을 수 있을 것이다. 필자가 글을 쓰고 있는 순간 rtlinux-0.5 버전 패키지에 든 소스는 제대로 동작하지 않으므로 웹 페이지에서 패치파일을 가져와서 패치한 후 컴파일해야 한다. sound 디렉터리 그 위치에서 patch < soundpatch 하고 나서 README에 따라 테스트해본다.

리눅스를 창조력을 가지고 도전하는 사람들로 인해 그 빛을 발휘하는 것이라는 생각이 든다.


다음 이전 차례