Domanda

Quando hai un ciclo di polling stretto lo stato di qualcosa, io non sono molto sicuro di come fare il polling senza ottenere nel modo di altri processi che vogliono utilizzare la CPU. Per esempio, facendo questo:

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

sembra uno spreco di risorse. Vorrei pensare il modo migliore per farlo potrebbe essere:

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

mi aspetto che il top sarebbe elencare il processo come dormire, anche se lo fa consumare il 100% della CPU, mentre si sta facendo questo. In questo modo, il processo sarebbe (spero) sondaggio "bene". Ma non è quello che succede. Al momento ho

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

che è perfettamente accettabile, ma mi sento come si poteva fare meglio di questo. C'è una pratica standard per fare questo?

È stato utile?

Soluzione

Non girare su sched_yield (), è mucks il rilevamento priorità del programma di pianificazione molto male e anche quando interagisce bene dal punto di vista delle prestazioni farà le cose come la durata della batteria relitto e metriche di consumo di energia. Se l'applicazione in grado di tollerare le latenze, polling con un timeout (anche quelli brevi come 10Hz) è molto preferibile, se ancora non è l'ideale.

La risposta giusta dipende da ciò che check_state () ha bisogno in realtà di fare. Sei assolutamente sicuro di non poter organizzare le cose in modo che i cambiamenti di stato sono gli eventi del kernel-visibile che è possibile bloccare sul?

Altri suggerimenti

Non credo che questo è qualcosa che si può utilizzare sondaggio o epoll su?

Purtroppo, non c'è alcuna cosa come polling di coscienza. Polling è sempre un compromesso tra tempo di reazione e il consumo di risorse: più breve è il periodo di polling, il migliore è il tempo di reazione, ma maggiore è il consumo di risorse. Più lungo è il periodo di polling, più energia si salva, ma il meno reattivo l'applicazione diventa.

Polling è sempre brutto, non importa come la si guarda. Se stai cercando di fare le cose nel modo giusto, si dovrà utilizzare un meccanismo migliore, vale a dire la notifica.  Ciò significa che il vostro check_state () API è uno cattivo, perché consente solo di eseguire il polling per lo stato; avete bisogno di una funzione progettata per informare l'utente quando lo stato cambia. In genere, tale funzione potrebbe fare qualche fd leggibile quando i cambiamenti di stato, in modo da poter modo sincrono o asincrono attendere che gli eventi sulla fd, e solo svegliarsi quando si verifica un evento del genere.

Credo che si potrebbe usare libevent o libev .

Sia fornire servizi per la gestione di cose come questa.

Nel mio lavoro in tempo reale, io di solito prendo un timeout ragionevole (come 10US), e far girare sulla condizione e RDTSC (il contatore di data e ora).

Se si vuole girare per davvero lunghi periodi di tempo (come più di 10ms), suggerirei di mettere una dichiarazione piccolo sonno in là quindi altra roba ottiene qualche possibilità di funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top