프로그램의 타이머가 4밀리초 미만일 때 Linux에서 선점은 어떻게 작동합니까?

프로그램의 타이머가 4밀리초 미만일 때 Linux에서 선점은 어떻게 작동합니까?

대부분의 Linux 시스템에서 jiffies의 기본값은 250(4ms)입니다. 문제는 프로그램의 usleep() 시간이 4ms 미만이면 어떻게 됩니까? 물론 의도한 대로 작동합니다. 하지만 다른 프로그램이 실행되어야 하기 때문에 Linux 스케줄러가 프로그램을 대기 상태로 꺼내면 어떻게 될까요? 이 경우 선점은 어떻게 작동합니까?

대기시간이 이렇게 짧은 맞춤형 프로그램은 피해야 할까요? 정확할 수는 없겠죠?

답변1

바라보다시간(7), 그리고 그것이 참조하는 맨페이지입니다. 발췌:

High-Resolution Timers
   Before Linux 2.6.21, the accuracy of timer and sleep system calls  (see
   below) was also limited by the size of the jiffy.

   Since  Linux  2.6.21,  Linux  supports  high-resolution  timers (HRTs),
   optionally configurable via CONFIG_HIGH_RES_TIMERS.  On a  system  that
   supports  HRTs,  the  accuracy  of  sleep  and timer system calls is no
   longer constrained by the jiffy, but instead can be as accurate as  the
   hardware  allows  (microsecond accuracy is typical of modern hardware).
   You can determine  whether  high-resolution  timers  are  supported  by
   checking  the resolution returned by a call to clock_getres(2) or look‐
   ing at the "resolution" entries in /proc/timer_list.

   HRTs are not supported on all hardware architectures.  (Support is pro‐
   vided on x86, arm, and powerpc, among others.)

한 댓글은 당신이 그렇게 짧은 시간 동안 잠을 잘 수 없다고 말했습니다. HRT에서는 그렇지 않습니다. 이 앱을 사용해 보세요:

/* test_hrt.c */
#include <time.h>
main()
{
        struct timespec ts;
        int i;

        ts.tv_sec = 0;
        ts.tv_nsec = 500000;  /* 0.5 milliseconds */
        for (i = 0; i < 1000; i++) {
                clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
        }
}

컴파일:

$ gcc -o test_hrt test_hrt.c -lrt

달리다:

$ time ./test_hrt

real    0m0.598s
user    0m0.008s
sys     0m0.016s

보시다시피, 0.5ms 지연으로 1000회 반복하는 데 예상대로 0.5초가 조금 넘게 걸렸습니다. clock_nanosleep정말로 다음 순간이 돌아올 때까지 기다린다 면 적어도 4초는 걸릴 것이다.


이제 첫 번째 질문은 '계획이 해당 시간 동안 예정되어 있으면 어떻게 되나요?'입니다. 대답은 우선순위에 따라 다르다는 것입니다. 다른 프로그램이 예약된 동안 프로그램이 실행 중이더라도 프로그램의 우선 순위가 더 높거나 스케줄러가 프로그램 실행 시간이라고 결정하면 clock_nanosleep시간 초과가 반환된 후 다시 실행이 시작됩니다. 그 일이 일어나기 위해 다음 순간까지 기다릴 필요는 없습니다. CPU를 많이 사용하는 다른 소프트웨어를 실행하는 동안 위의 테스트 프로그램을 실행해 보면 이 프로그램이 여전히 동시에 실행되는 것을 확인할 수 있습니다. 특히 다음을 사용하여 우선순위를 높이는 경우 더욱 그렇습니다.

$ time sudo schedtool -R -p 99 -e ./test_hrt

답변2

실시간 커널을 실행하지 않는 한 어쨌든 10ms 미만의 절전 시간을 사용하지 않습니다. 스케줄러가 시간 초과 시 다른 프로세스를 기꺼이 선점하더라도 지터가 실제 절전 시간을 지배할 수 있습니다.

요약: 실시간 커널이 없으면 이렇게 작은 간격을 피하십시오. 커널을 변경할 수 없는 경우 가장 좋은 방법은 SCHED_FIFO를 사용하여 프로세스를 전용 CPU에 고정하고 약 2지피 미만 동안 바쁜 대기(또는 기타 유용한 작업)를 수행하는 것입니다.

어쩐지 요약이 원본보다 길어졌네요...아 그렇군요.

관련 정보