В Linux опрос по добросовестному пути - PullRequest
2 голосов
/ 07 октября 2009

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

while (state == BUSY) state = check_state();

кажется пустой тратой ресурсов. Я думаю, что лучший способ сделать это будет:

while (state == BUSY) {
    sched_yield();
    state = check_state();
}

Я бы ожидал, что top отобразит процесс как спящий, даже если он будет использовать 100% процессорного времени, пока он это делает. Таким образом, процесс будет (я надеюсь) опросить «красиво». Но это не то, что происходит. На данный момент у меня есть

while (state == BUSY) {
    sleep(1);
    state = check_state();
}

, что вполне приемлемо, но я чувствую, что это можно сделать лучше, чем это. Есть ли стандартная практика для этого?

Ответы [ 5 ]

3 голосов
/ 07 октября 2009

Не включайте sched_yield (), он очень сильно портит определение приоритета планировщика, и даже когда он хорошо взаимодействует с точки зрения производительности, это может повлиять на показатели ресурса батареи и энергопотребление. Если ваше приложение может выдерживать задержки, опрос с тайм-аутом (даже короткие, например, 10 Гц) очень предпочтителен, если все еще не идеален.

Правильный ответ зависит от того, что на самом деле нужно сделать check_state (). Вы абсолютно уверены, что не можете организовать все так, чтобы изменения вашего состояния были видимыми для ядра событиями, которые вы можете заблокировать?

1 голос
/ 23 июня 2011

К сожалению, нет такого понятия, как добросовестный опрос. Опрос всегда является компромиссом между временем реакции и потреблением ресурсов: чем короче период опроса, тем лучше время реакции, но тем выше потребление ресурсов. Чем дольше период опроса, тем больше энергии вы экономите, но тем менее реактивным становится ваше приложение.

Опрос всегда безобразен, независимо от того, как вы на него смотрите. Если вы пытаетесь сделать все правильно, вам придется использовать лучший механизм, то есть уведомление. Это означает, что ваш API check_state () плохой, потому что он позволяет вам только запрашивать состояние; вам нужна функция, предназначенная для уведомления вас, когда состояние меняется. Как правило, такая функция делает некоторые fd читаемыми при изменении состояния, поэтому вы можете синхронно или асинхронно ожидать события на fd и активироваться только при возникновении такого события.

1 голос
/ 07 октября 2009

Я не думаю, что это то, что вы можете использовать опрос или epoll на?

0 голосов
/ 07 октября 2009

В своей работе в реальном времени я обычно выбираю разумное время ожидания (например, 10us) и включаю условие и RDTSC (счетчик меток времени).

Если вы хотите вращаться в течение действительно длительных периодов времени (например, более 10 мс), я бы посоветовал добавить туда маленькую инструкцию сна, чтобы другие вещи могли работать.

0 голосов
/ 07 октября 2009

Я думаю, вы могли бы использовать libevent или libev .

Оба предоставляют средства для обработки подобных вещей.

...