2012-03-12 2 views
2

начал испытывать некоторые потоки реального времени. Я просто послал свою нить спать, позвонив по телефону (ВРЕМЯ). Это гарантирует, что нить будет спать, по крайней мере, ВРЕМЯ. Я теперь измерял с TIME = 10ms и получил гауссовую функцию с ожидаемым значением μ = 10,1ms Второе измерение с TIME = 1us: я получаю большой пик при 4us.usleep busy waiting

Так почему же второе измерение не гауссово? Моя первая идея заключалась в том, что поток действительно не спит, но вместо этого он оживает. Как указано here (old beahavior), ожидание не занято. Как объяснить две кривые?

+0

Из интереса, на какой ОС вы работаете, чтобы получить такое разрешение на системных таймерах? Лучшее, что я видел, это 4ms, а не 4us ... :) –

+0

Какая базовая система вы используете для потоков в реальном времени? Вы видели [RTAI] (https://www.rtai.org/)? – Shahbaz

+0

это xilinx fpga (PPC440) с ядром linux 3.0 – user1264182

ответ

4

Из-за резолюции функций синхронизации. Вы сказали это сами, он гарантирует спать на наименее того времени. Причина, по которой он не может гарантировать спать точно такое количество времени, состоит в том, что он, скорее всего, работает в течение четырех микросекунд.

man page также упоминает этот феномен:

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

+0

, так что вы имеете в виду, что есть (когда вы спите для 1us) никакой другой активности, кроме сна и пробуждения, потому что он не удлиняется. – user1264182

+0

@ user1264182: возможно, это деталь реализации - она ​​может _well_ амортизировать задержки, так что она иногда спит в течение четырех микросекунд (например, 25% времени) и иногда не спят (например, 75% времени). Лично я сомневаюсь, что это вызовет излишнюю сложность для вызова, уже отмеченного как имеющего неточности для малых длительностей. Достаточно сказать, что при некоторой нижней границе вы будете ждать микросекунды 'X', независимо от того, о чем вы просите. – paxdiablo

+0

Я ожидал, что будет минимум X нас. Путаница заключается в том, что ни одна другая нить не начинается, когда моя нить спала, и минимальная смазка X будет пропущена. – user1264182

1

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