Frage

Wenn Sie eine enge Schleife Abfrage des Status von etwas haben, ich bin nicht ganz sicher, wie die Abfrage zu tun, ohne in den Weg anderer Prozesse bekommen wollen, um die CPU verwenden. Zum Beispiel, dies zu tun:

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

scheint wie eine Verschwendung von Ressourcen. Ich würde denken, den besten Weg, dies zu tun wäre:

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

Ich würde erwarten, dass oben würde den Prozess als Schlaf Liste, auch wenn es 100% der CPU verbraucht, während es dies tut. Auf diese Weise würde der Prozess (hoffe ich) poll „schön“. Aber das ist nicht, was passiert. Im Moment habe ich

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

, die durchaus akzeptabel ist, aber ich fühle mich wie es besser als dies getan werden könnte. Gibt es eine gängige Praxis, dies zu tun?

War es hilfreich?

Lösung

Do not Spin auf sched_yield (), mucks es die Planer der Priorität Erkennung sehr schlecht und auch wenn es zusammenarbeitet gut aus Sicht der Leistung wird die Dinge wie Wrack Akkulaufzeit und Stromverbrauch Metriken tun. Wenn Ihre Anwendung kann die Latenzen, Polling mit einem Timeout tolerieren (auch Kurzen wie 10 Hz) ist sehr viel besser, wenn noch nicht ideal.

Die richtige Antwort hängt davon ab, welche check_state () muss tatsächlich tun. Sind Sie absolut sicher, können Sie die Dinge nicht so anordnen, dass Ihre Zustandsänderungen sind Kernel-sichtbaren Ereignisse, die Sie blockieren kann?

Andere Tipps

Ich nehme nicht an das etwas ist, Sie Umfrage oder epoll auf?

Leider gibt es nicht so etwas wie Kriegsdienst Polling. Polling ist immer ein Kompromiss zwischen Reaktionszeit und Ressourcenverbrauch: Je kürzer die Polling-Periode, desto besser ist die Reaktionszeit, aber desto höher ist der Ressourcenverbrauch. Je länger die Polling-Periode, desto mehr Energie Sie sparen aber je weniger reaktiv Ihre Anwendung wird.

Polling ist immer hässlich, egal wie man es betrachtet. Wenn Sie versuchen, die Dinge richtig zu tun, werden Sie einen besseren Mechanismus, das heißt Benachrichtigung verwenden.  Was das bedeutet ist, dass Ihre check_state () API ein schlechtes ist, weil es nur für den Staat Umfrage ermöglicht; Sie benötigen eine Funktion entwickelt, um Sie zu benachrichtigen, wenn sich der Zustand ändert. Typischerweise würde eine solche Funktion einige fd lesbar machen, wenn sich der Zustand ändert, so können Sie synchron oder asynchron für Veranstaltungen auf dem fd warten, und erst aufwachen, wenn ein solches Ereignis eintritt.

ich glaube, Sie libevent oder libev .

Beide bieten Einrichtungen für Dinge wie diese Handhabung.

In meiner Echtzeit-Arbeit, nehme ich normalerweise einen angemessenen Timeout (wie 10us) und Spin auf dem Zustand und RDTSC (die Zeitstempel-Zähler).

Wenn Sie wirklich lange Zeit zu spinnen wollen (wie länger als 10 ms), würde ich vorschlagen, eine kleine Schlaf-Anweisung setzt dort so andere Sachen bekommt eine Chance zu laufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top