在Linux中可以改變更高時間分辨率的速率嗎?linux內核將ticks/jiffies改爲比1000更高的hz
默認分辨率設置爲1000赫茲在我的系統,這意味着我有1ms的最小延遲時間,我需要在1微秒甚至納秒的延遲一個更percise系統,但我不知道這是否是偶數有可能改變這個超過1000hz。
如果可以改變,在哪裏/如何完成?
有沒有可能有任何其他解決方法考慮即時編寫c腳本?
在Linux中可以改變更高時間分辨率的速率嗎?linux內核將ticks/jiffies改爲比1000更高的hz
默認分辨率設置爲1000赫茲在我的系統,這意味着我有1ms的最小延遲時間,我需要在1微秒甚至納秒的延遲一個更percise系統,但我不知道這是否是偶數有可能改變這個超過1000hz。
如果可以改變,在哪裏/如何完成?
有沒有可能有任何其他解決方法考慮即時編寫c腳本?
當然,這取決於硬件(如果特定的嵌入式)和內核版本,然而在現代Linux睡眠時間不受Jiffies控制。高於2.6.24的Linux內核可以具有高精度事件計時器(HPET)來觸發某些事件。
它與應用程序休眠無關。如果您想要睡眠1ms或更少,則不需要設置CONFIG_HZ_1000
。
在Linux中,您可以使用函數usleep()
和nanosleep()
。在運行Ubuntu的臺式機中,時鐘分辨率已經是1ns。然而,這並不意味着在非實時系統中可以完美睡眠幾納秒。
檢查該示例(與gcc clock.c -O3 -Wall -lrt -o clock
編譯):
#include <stdio.h>
#include <unistd.h>
#include <time.h>
int main()
{
struct timespec res, tp1, tp2;
clock_getres(CLOCK_MONOTONIC, &res);
clock_gettime(CLOCK_MONOTONIC, &tp1);
usleep(100);
clock_gettime(CLOCK_MONOTONIC, &tp2);
printf("resolution: %ld sec %ld ns\n", res.tv_sec, res.tv_nsec);
printf("time1: %ld/%ld\n", tp1.tv_sec, tp1.tv_nsec);
printf("time2: %ld/%ld\n", tp2.tv_sec, tp2.tv_nsec);
printf("diff: %ld ns\n", (tp2.tv_sec - tp1.tv_sec) * 1000000000 + tp2.tv_nsec - tp1.tv_nsec);
return 0;
}
缺省情況下它發生,我有期望的睡眠時間以上另外的60周微秒的延遲。這種準確度對於幾百微秒的睡眠時間(我係統中的CONFIG_HZ=250
)可以接受。
爲了減少延遲的過程中應具有較高優先級運行,例如:
sudo chrt --rr 99 ./clock
在這種情況下,我可以有誤差小於20我們。
在後續調用clock_gettime
之間沒有任何睡眠功能,我可以看到延遲範圍爲200 - 900 ns
。因此,它可以測量睡眠與usec
精度由繁忙的循環:
clock_gettime(CLOCK_MONOTONIC, &tp1);
clock_gettime(CLOCK_MONOTONIC, &tp2);
while (get_diff(&tp1, &tp2) < ns_time_to_sleep)
clock_gettime(CLOCK_MONOTONIC, &tp2);
如果你只是尋找更高的定時分辨率,如納米第二,你可以使用['clock_gettime()'](HTTP:/ /man7.org/linux/man-pages/man2/clock_gettime.2.html)而不是與jiffies混淆。更詳細的可以看到這個[回答](http://stackoverflow.com/a/6749766/1865106)。 – SSC
您是否需要調度程序的更高分辨率才能使系統更具響應性,或者您是否需要更多的時間測量分辨率? –
這是爲了更好的反應時間,能夠睡眠x我們和/或執行每一個x我們 – user3828657