대부분의 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지피 미만 동안 바쁜 대기(또는 기타 유용한 작업)를 수행하는 것입니다.
어쩐지 요약이 원본보다 길어졌네요...아 그렇군요.