chandrAN2& Ответов: 2

Разъяснение по наносекундному () сну в linux


Используя наносекундный сон, смогу ли я спать в течение 1 наносекунды?.
Насколько более тонкая детализация таймера поддерживается в linux?
В основном детализация таймера будет составлять 10 мсек(ТИК планировщика), поэтому я понимаю, что невозможно достичь детализации таймера менее 10 мсек.
может кто-нибудь прояснить, пожалуйста?

Если предположим, что поддерживается более тонкое разрешение, моя задача будет переведена в спящий режим или ядро выполнит цикл занятости от имени моей задачи, чтобы скоротать время (скажем, 100 микросекунд или 500 наносекунд)?

Может кто-нибудь прояснить?

Что я уже пробовал:

Если предположим, что поддерживается более тонкое разрешение, моя задача будет переведена в спящий режим или ядро выполнит цикл занятости от имени моей задачи, чтобы скоротать время (скажем, 100 микросекунд или 500 наносекунд)?

Может кто-нибудь прояснить?

0x01AA

Вы имеете в виду наносп, как описано здесь nanosleep(2): High-resolution sleep-man-страница Linux[^]?

2 Ответов

Рейтинг:
2

Richard MacCutchan

Вы не можете использовать таймеры для абсолютного времени в операционной системе с несколькими активностями. Когда таймер истекает, это просто означает, что операционная система помещает ваше действие (процесс) обратно в очередь выполнения, поэтому оно возобновится в следующий раз, когда достигнет вершины очереди. Это будет после 1 или более наносекунды.

Видеть nanosleep(2): High-resolution sleep-man-страница Linux[^].


chandrAN2&

Спасибо за ваш ответ. Я не говорю об абсолютном времени. Мой вопрос здесь заключается в том, что ядро поддерживает детализацию таймера 1ns? Если да, то как через sleep или busyloop(фиктивные mips?)

Richard MacCutchan

Я не знаю подробностей, не глядя на исходный код Linux.

Рейтинг:
2

Jochen Arndt

Вы, вероятно, не сможете спать ни одной наносекунды, потому что доступное разрешение зависит от детализации базовых часов, которые зависят от системы. Если базовые часы не имеют разрешения в наносекунду или меньше, то передаваемое значение будет округлено в большую сторону.

См. также спецификацию OpenGroup nanosleep[^] и nanosleep(2): High-resolution sleep-man-страница Linux[^].

Чтобы получить разрешение аппаратных часов см. clock_getres(2): функции часов/времени-man-страница Linux[^]. Обратите внимание, что существует также clock_nanosleep(2) - man-страница Linux[^] функция, которая позволяет использовать спецификацию часов.

При использовании функций сна будет ждать только текущий поток (или текущий процесс, когда он однопоточный). Другие потоки, включая ядро, продолжат работу.


chandrAN2&

cat /proc / таймеры. Я мог видеть разрешение таймера 1нс? Это означает, что разрешение 1ns поддерживается правильно? Если это так, то процесс будет переведен в спящий режим на 1нс ?

Jochen Arndt

Наверное, нет, но я не уверен. Разрешение не является детализацией часов.

Вместо этого вы можете искать min_delta_ns в /proc/timer_list.
Пример вывода:
min_delta_ns: 15001 (Rapsberry Pi B+)
min_delta_ns: 1000 (VirtualBox на Windows 7 с Ubuntu 14.04 LTS )

Разрешение, сообщенное для Пи, тоже составляет 1 НС, но оно определенно не имеет детализации 1 НС.

Простая проверка заключается в многократном использовании clock_gettime(CLOCK_MONOTONIC_RAW) до тех пор, пока возвращаемое значение не будет отличаться от предыдущего. Доступное разрешение больше, чем разница (возможно, потребуется сделать это несколько раз и использовать наименьшее значение для устранения ошибок при приостановке тестового потока).