Question

Quand vous avez une interrogation de boucle serrée l'état de quelque chose, je ne suis pas tout à fait sûr de savoir comment faire le vote sans prendre le chemin d'autres processus qui souhaitent utiliser la CPU. Par exemple, faire ceci:

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

apparaît comme un gaspillage de ressources. Je pense que la meilleure façon de le faire serait:

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

Je pense que le haut dresserait une liste des processus que le sommeil, même si elle consomme 100% de la CPU pendant qu'il fait cela. De cette façon, le sondage processus serait (je l'espère) « bien ». Mais ce n'est pas ce qui se passe. En ce moment j'ai

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

qui est tout à fait acceptable, mais je me sens comme cela pourrait se faire mieux que cela. Y at-il une pratique standard pour le faire?

Était-ce utile?

La solution

Ne pas tourner sur sched_yield (), il mucks très mal la détection de priorité du planificateur et même quand il interagit bien du point de vue de la performance fera des choses comme la vie de la batterie de l'épave et des mesures de consommation d'énergie. Si votre application peut tolérer les latences, les sondages avec un délai d'attente (même les courtes comme 10Hz) est très bien préférable, si pas encore idéal.

La bonne réponse dépend de ce que check_state () a réellement besoin de le faire. Êtes-vous absolument sûr que vous ne pouvez pas arranger les choses afin que vos changements d'état sont des événements visibles noyau que vous pouvez bloquer sur?

Autres conseils

Malheureusement, il n'y a pas une telle chose que l'interrogation de conscience. L'interrogation est toujours un compromis entre le temps de réaction et la consommation des ressources: plus la période de vote, plus le temps de réaction, mais plus la consommation des ressources. Plus la période de vote, plus d'énergie que vous enregistrez mais votre application devient moins réactif.

Polling est toujours laid, peu importe la façon dont vous regardez. Si vous essayez de faire les choses de la bonne façon, vous devez utiliser un meilleur mécanisme, à savoir la notification.  Ce que cela signifie est que votre API check_state () est une mauvaise, car il ne vous permet de scrutin pour l'Etat; vous avez besoin d'une fonction conçue pour vous informer lorsque les changements d'état. En règle générale, une telle fonction serait une fd lisible lorsque les changements d'état, vous pouvez donc synchrone ou asynchrone attendre des événements sur le fd, et ne se réveiller lorsqu'un tel événement se produit.

Je pense que vous pouvez utiliser libevent ou libev .

Les deux fournissent des installations pour la manutention des choses comme ça.

Dans mon travail en temps réel, je prends généralement un délai raisonnable (comme 10US), et faites tourner la condition et RDTSC (le cachet de compteur de temps).

Si vous voulez faire tourner pendant des périodes très longues périodes (comme plus de 10ms), je vous suggère de mettre une petite déclaration de sommeil là-dedans donc d'autres choses obtient une chance de courir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top