Pregunta

Cuando usted tiene un bucle de sondeo apretado el estado de algo, no estoy muy seguro de cómo hacer el sondeo sin interponerse en el camino de otros procesos que deseen utilizar la CPU. Por ejemplo, hacer esto:

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

Parece como un desperdicio de recursos. Yo creo que la mejor manera de hacer esto sería la siguiente:

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

Yo esperaría que la alta enumeraría el proceso como dormir, incluso si lo hace consumir el 100% de la CPU mientras se está haciendo esto. De esta manera, el proceso (espero) sondeo "muy bien". Pero eso no es lo que sucede. Por el momento tengo

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

que es perfectamente aceptable, pero me siento como que se podía hacer algo mejor que esto. ¿Existe una práctica estándar para hacer esto?

¿Fue útil?

Solución

No girar sobre sched_yield (), que mucks hasta la detección de la prioridad del planificador muy mal e incluso cuando interactúa bien desde una perspectiva de rendimiento va a hacer cosas como la vida de la batería pecio y métricas de consumo de energía. Si su aplicación puede tolerar las latencias de votación, con un tiempo de espera (incluso las más cortas como 10 Hz) es altamente preferible, si todavía no es ideal.

La respuesta correcta depende de lo check_state () en realidad tiene que hacer. ¿Estás absolutamente seguro de que no puede arreglar las cosas para que sus cambios de estado son eventos de kernel-visible que se puede bloquear en?

Otros consejos

Por desgracia, no hay tal cosa como el sondeo de conciencia. El sondeo es siempre una solución de compromiso entre el tiempo de reacción y el consumo de recursos: cuanto más corto es el período de votación, mejor será el tiempo de reacción, pero cuanto mayor sea el consumo de recursos. Cuanto más largo sea el período de votación, más energía se guarda pero el menos reactivo se convierte en su aplicación.

El sondeo es siempre fea, no importa cómo se mire. Si usted está tratando de hacer las cosas de la manera correcta, usted tiene que utilizar un mecanismo mejor, es decir, la notificación.  Lo que esto significa es que su check_state () de la API es una mala, ya que sólo permite realizar sondeos para el Estado; se necesita una función diseñada para que le notifique cuando cambia el estado. Por lo general, esta función sería hacer algo de fd legible cuando cambia el estado, por lo que pueden esperar sincrónica o asincrónica de eventos en el fd, y sólo despertar cuando se produce un evento.

Creo que se podría usar libevent o libev .

Tanto proporcionar facilidades para el manejo de este tipo de cosas.

En mi trabajo en tiempo real, que normalmente tomo un tiempo de espera razonable (como 10us), y el giro de la condición y RDTSC (el contador de marca de tiempo).

Si desea girar por muy largos períodos de tiempo (como más de 10 ms), sugeriría poner una declaración pequeño sueño allí, así otras cosas consigue un cierto oportunidad de correr.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top