Как вытеснение работает над Linux, когда программа имеет таймер меньше затем 4 мс?

Большинство помнило розыгрыш, который я когда-либо устраивал на других, было два года, в то время как я учился.

  1. Записал a su обертка, которая попросила бы пароль пользователя и спрятала бы их в записываемый файл для меня и затем продолжилась бы к нормальному su. В конце у меня был бы весь набор пароля пользователя в сети и используемый, чтобы так или иначе дразнить их с тем, что пароль пользователя отошлет к символическому сообщению их, что я знаю об их паролях. Это была забава хотя :-))

  2. Я развернул cgi сценарий на http экземпляре, который будет скрытый, собрать пароль пользователя, говоря, что аутентификация системой, и они счастливо совместно использовали бы свои пароли к cgi сценарию, который сохранит их в текстовом файле.

Имел хорошую забаву, оба связанные с обманом пароля. Я не поощрил бы это теперь. Поскольку я нахожусь теперь в обуви Системного администратора и строго не обескураживаю людей, совместно использующих их пароли даже в сети. Если сомнительный, свяжитесь с SysAdm для законности сайта в локальной сети.

6
09.11.2012, 11:17
2 ответа

Посмотрите время (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.)

Комментарий предполагает, что Вы не можете спать меньше, чем миг. Это неправильно; с HRTs Вы можете. Попробуйте эту программу:

/* 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

Как Вы видите, 1 000 повторений 0,5 задержек миллисекунды заняли всего немногим более, чем 0,5 секунды, как ожидалось. Если clock_nanosleep действительно ожидали до следующего мига перед возвратом потребуется по крайней мере 4 секунды.


Теперь исходный вопрос был, что происходит, если Ваша программа была запланирована в течение того времени? И ответ - то, что это зависит от приоритета. Даже если другая программа будет запланирована, в то время как Ваша программа работает, если Ваша программа будет более высоким приоритетом, или планировщик решает, что это - время Вашей программы для выполнения, то это начнет выполняться снова после clock_nanosleep возвраты тайм-аута. Это не должно ожидать до следующего мига этого для случая. Можно попытаться выполнить тестовую программу выше при выполнении другого программного обеспечения, которое берет ЦП, и Вы будете видеть, что это все еще выполняется за то же количество времени, особенно при увеличении приоритета с, например.

$ time sudo schedtool -R -p 99 -e ./test_hrt
7
27.01.2020, 20:24
  • 1
    Правда, но планировщик все еще работает с мигом, в то время как (аппаратные средства) предупреждение может появиться теперь между двумя мигом... –  Nils 09.11.2012, 23:47
  • 2
    набора... и инициировали непосредственное пробуждение для Вашего процесса. Какова Ваша точка? Несомненно, если у Вас есть более высокий приоритетный процесс, также выполняющий затем планировщик, мог бы решить, что другой процесс добирается для выполнения вместо Вас, но это всегда - проблема в многозадачной операционной системе и может быть решено с соответствующим приложением SCHED_RR, SCHED_FIFO, приоритетов, и т.д. –  Jim Paris 10.11.2012, 00:06
  • 3
    Дело в том, что планировщик не будет реагировать "сразу" - требуется, по крайней мере, полный jiffie для реакции. Это - базовая проблема вопроса. Таким образом, эти таймеры высокой точности помогают ИЗМЕРИТЬ более точное время - но они не помогают для большего количества прекрасно-детализированного планирования. –  Nils 10.11.2012, 00:19
  • 4
    Это просто не верно. Можно спать для меньше, чем миг. Посмотрите мое редактирование. –  Jim Paris 10.11.2012, 00:38
  • 5
    Большое редактирование +1 для Вашего ответа теперь. Я не знал, что пробуждение может произойти между мигом. –  Nils 11.11.2012, 00:30

Если Вы не выполняете ядро в реальном времени, я не использовал бы времена сна <10 мс так или иначе tbh. Даже если планировщик будет готов предвосхитить другой процесс для Вашего тайм-аута, то дрожание будет, вероятно, доминировать над Вашими фактическими временами сна.

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

Так или иначе сводка закончилась дольше, чем оригинал..., о, хорошо.

4
27.01.2020, 20:24

Теги

Похожие вопросы