Гарантия отклика процессора?

0

Примечание. Я предпочитаю C++ (ниже код C++), но если кому-то удастся сделать следующее на любом общем языке, я в порядке.

Вот идея:

а) начинается таймер.
б) функция выполняется и занимает всегда менее 0,1 секунды.
c) программа спит до тех пор, пока разница времени от начала не будет ровно 0,1 секунды.
г) повторяется навсегда.

Если время сна немного выше 0,1 секунды, скажем 0,105 секунды, я теряю 0,005 секунды в секунду. Эта неточность стоит в моем заявлении, так как я теряю в дневной период: 0,005 * 3600 * 24 = 432 секунды.

Мое приложение - в реальном времени; время, которое я теряю, не имеет большого значения.


Исполнение:

a) шаг был простым, просто установите переменную x = std::chrono::high_resolution_clock::now(); б) запустить функцию
с)

while((std::chrono::high_resolution_clock::now()-x).count() < 1000000)
        std::this_thread::sleep_for(std::chrono::nanoseconds(1));

d) просто петля


Резюме:

а) я понимаю, что бы ни случилось, я потеряю как минимум 1 наносекунду в секунду.
б) после прочтения этих статей: во- первых, во- вторых, я понимаю, что мое приложение может потерять всего 30 микросекунд в секунду = 0,00003 секунды. Это означает, что в день: 0,00003 * 3600 * 24 = 2,592 секунды в день.
c) в данный момент, используя функцию, описанную выше, лучшее, что мне удалось, теряет 7 минут в день.


То, что я действительно пытаюсь сделать:

Я получаю доступ к серверу с одним ограничением: допускается только один запрос за 0,1 секунды. Если это займет меньше, они меня запретят. Если мой запрос займет больше времени, я загружаю меньше данных. Мое приложение загружает файл каждые 0,1 секунды. Если из-за задержек я теряю 432 секунды в день, это означает, что я мог бы загрузить 4320 файлов больше.

В: Как реализовать защиту CPU на CentOS предпочтительнее или любую другую ОС?

  • 0
    «Мое приложение в режиме реального времени» Что именно это означает? Нужно ли вам соблюдать определенную точность синхронизации для управления устройствами? В этом случае вам не нужно заботиться об общей потере. Чтобы не терять точное время от поворота, имеющего контрольную точку, вам нужно будет синхронизировать данные с точными внешними источниками с определенной скоростью.
  • 1
    Я не знаю, какая поддержка для этого существует в библиотеках C ++, но с функциями таймера Posix вы указываете абсолютное время истечения, а не дельту (вы также можете указать интервал повторения). Это сразу решит вашу проблему.
Показать ещё 20 комментариев
Теги:
assembly

3 ответа

7
Лучший ответ

Если вы не хотите терять время в течение дня, вы бы не реализовали свой код, как это. Вы бы сделали что-то вроде

for(long next = System.currentTimeMillis() + 100;; start += 100) {
    // do something
    while(true){
        long delay = next - System.currentTimeMillis();
        if (delay <= 0)
            break;
        Thread.sleep(delay);
    }
}

Таким образом, вы можете получить дрожание до 5 мс на голом металлическом компьютере и 50 мс на гипервизоре, но это исчезнет на следующей итерации или после.

т.е. в этом коде нет кумулятивного дрейфа. (Примечание: таймеры с высоким разрешением дрейфуют, но это зависит от вашего оборудования)

Я подозреваю, что вы на самом деле пытаетесь решить другую проблему, которую вы здесь не объяснили.

Как реализовать защиту CPU на CentOS предпочтительнее или любую другую ОС?

Что я делаю для Java

  • используйте isocpus = 5,6,11,12 или каждый процессор для каждого ядра, которое вы хотите изолировать. Я предлагаю выделить целые ядра. Это позволяет использовать гиперпотоки выборочно.
  • настройте баланс IRQ, чтобы избежать этого CPU, если вы не намерены использовать их в своем потоке на этом CPU.
  • используйте sched_setaffinity для привязки выбранных потоков к отдельным процессорам. Чтобы выделить целое ядро, оставьте один центральный процессор незанятым.

BTW Я рекомендую заняться ожиданием, а не использовать сон или что-то, что блокируется в ОС, поскольку это нарушает кэширование CPU. т.е. ваш код будет работать значительно медленнее (2-5x) после пробуждения, поскольку время бодрствования - это не единственное, о чем вам нужно беспокоиться.

BTW2 Я не нашел надежного способа защиты экрана в Windows, отличного от установки приоритета, насколько это возможно, обратите внимание: вы не можете повысить приоритет, если вы не работаете как администратор. В Linux повышение приоритета не так эффективно, как удаление процессора из обычного планирования.

  • 1
    Хорошо, вы были на минуту быстрее.
  • 0
    Спасибо, я проверю это.
3

Java имеет встроенную функциональность для этого, один из вариантов с ScheduledExecutorService - запланировать с фиксированной скоростью или с фиксированной задержкой.

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

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

Обратите внимание, однако, что окна - это не-realtime OS, работающая с упреждающей многозадачной задачей. Служба попробует и перезвонит вам как можно скорее после следующего приезда, но это абсолютно невозможно гарантировать. Единственный способ избежать этого - переключиться на ОС реального времени, но это на самом деле слишком велико.

  • 1
    Я хотел бы добавить ссылку из Java 7, учитывая, что Java 6 в основном EOL.
  • 0
    Хорошая мысль, сделано это (этот конкретный класс не изменился, но все же лучше указать на более актуальные документы).
Показать ещё 2 комментария
0

Вам не нужно контролировать использование ЦП, пользователь может самостоятельно управлять им. Используя диспетчер задач в Windows. Я верю, что вам придется возиться с менеджером задач в вашем программном коде.

  • 0
    Большое спасибо. Я попытался установить приоритет реального времени в системе Windows. Это немного помогло, но только в одном Windows 7. Все еще далеко от того, что я пытаюсь сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню