---
http://www.drdobbs.com/184402031참고해서 리눅스에서 리얼타임 프로그래밍을
해봅시다. 먼저 타이머의 resolution. 그중 nanosleep()은 timespec구조체가
nanosec단위이긴 하지만 커널은 매 jiffie마다 타이머를 체크할뿐이라서 절대
nanosec단위의 resolution이 아님을 유의하세요. nanosleep()이 기존의
sleep()/usleep()보다 좋은점중 하나는 시그널때문에 -1을 리턴 하는 경우
(errno==EINTR) 두번째 인자에 깨어날 시간까지의 남은 시간이 들어간다는 점입
니다. 그래서, while(nanosleep(&t, &t)); 하면 시그널과 상관없이 최소한 지정
된 시간을 기다릴수 있다는 것이죠. 더 resolution이 높은것을 위해서는 /dev
/rtc를 씁니다. 2HZ부터 8192HZ까지 2배수 단위로 설정될수 있는데, read()명령
으로 장치에서 오는 인터럽트를 기다릴수 있습니다. 단점은 주기가 2배수라는 것
과 이 장치는 한번에 하나의 프로세스만이 쓸수 있다는점이죠. 스와핑에 대해서
는 물론 기능자체를 아예 꺼버릴수도 있겠지만, mlock()으로 주소범위내의 페이
지들을 메모리에 묶어놓을수 있습니다. 프로세스가 끝나거나 munlock()이 불릴때
까지죠. 전체 프로세스를 묶고 싶으면 mlockall()함수를 씁니다. (
MCL_CURRENT|MCL_FUTURE 플래그로 현재의 공간과 미래의 할당을 모두 묶으면 됩
니다. CAP_IPC_LOCK capability 필요.) 그외에도 realtime 프로그래밍을 위해서
는 mutex등의 동기화와 thread관리를 좀더 공부해야겠습니다.
지금은 이름이 바뀌었지만 RTLinux라는것이 있는데, 이 프로젝트 역시
virtualization과 비슷하게 linux를 thread로서 돌리면서 real-time task는 리눅
스와 따로 우선적으로 실행시키는 구조이군요. 자신들만의 새로운 API들을 제공
하여 그를 이용해서 프로그래밍하게 되어있습니다.
기존의 리눅스 타이머는 jiffies기반의 타이머이기 때문에 resolution이
millisec단위였으며 부정확한면이 많았습니다. 여기에 자세한 설명이 있군요. 이
를 해결하기 위해 HRT(High Resolution Timers)가 도입됩니다. jiffies값과는 별
개로 좀더 정확한 하드웨어를 사용해서 타이머를 구현합니다. 그렇다고 커널 전
체가 HRT를 쓰는것은 아니고 CONFIG_HIGH_RES_TIMERS 가 설정된 이후에도
itimers, POSIX timers, nanosleep의 세가지만이 micro-sec수준의 high
resolution을 가지게 됩니다. (커널 내부엔 hrtimer_init(), hrtimer_start() 가
사용됩니다.) 예를 들어 select()는 HRT를 사용하지 않습니다. TODO