Le chiamate poll
e select
(menzionate da Basile Starynkevitch in un commento) o un semaforo (menzionato da Als in una risposta) sono i modi corretti per attendere le richieste, a seconda delle circostanze. Su sistemi operativi senza poll
o select
, dovrebbe esserci qualcosa di simile.
Né sleep
, YieldProcessor
, né sched_yield
sono modi adeguati per eseguire questa operazione, per i seguenti motivi.
YieldProcessor
e sched_yield
spostare semplicemente il processo fino alla fine della coda eseguibile ma lasciarlo eseguibile. L'effetto è che consentono l'esecuzione di altri processi con priorità uguale o superiore, ma, quando tali processi vengono eseguiti (o se non ce ne sono), il processo che ha chiamato YieldProcessor
o sched_yield
continua a essere eseguito. Questo causa due problemi. Uno è che i processi con priorità più bassa non verranno ancora eseguiti. Un altro è che questo fa sì che il processore sia sempre in esecuzione, usando energia. Preferiremmo che il sistema operativo riconosca quando nessun processo deve essere in esecuzione e per mettere il processore in uno stato di bassa potenza.
sleep
potrebbe consentire questo stato di bassa potenza, ma svolge un gioco di ipotesi su quanto tempo sarà fino a quando la richiesta successiva arriva, si sveglia il processore più volte quando non ce n'è bisogno, e rende il processo meno reattivo alle richieste, dal momento che il processo continuerà a dormire fino alla scadenza del tempo richiesto anche se c'è una richiesta di assistenza.
Le chiamate poll
e select
sono progettate esattamente per questa situazione. Dicono al sistema operativo che questo processo vuole servire una richiesta che arriva su uno dei suoi canali di I/O, ma altrimenti non ha lavoro da fare. Ciò consente al sistema operativo di contrassegnare il processo come non eseguibile e di mettere il processore in uno stato di bassa potenza se adatto.
L'utilizzo di un semaforo fornisce lo stesso comportamento, con la differenza che il segnale per riattivare il processo proviene da un altro processo che solleva il semaforo anziché dall'attività che si verifica in un canale I/O. I semafori sono adatti quando il segnale per fare un po 'di lavoro arriva in questo modo; usa semplicemente quello di poll
o un semaforo è più appropriato per la tua situazione.
La critica a poll
, select
o un semaforo causa una chiamata in modalità kernel irrilevante, poiché gli altri metodi provocano anche chiamate in modalità kernel. Un processo non può dormire da solo; deve chiamare il sistema operativo per richiederlo. Allo stesso modo, YieldProcessor
e sched_yield
eseguono richieste al sistema operativo.
Sleeping indica allo scheduler di eseguire sulla CPU un altro processo anziché il processo per uno smontaggio specifico del tempo (anche per mantenerlo semplice). Il tuo programma non consumerà risorse della CPU durante il sonno. Anche dormire per pochi millisecondi rende le cose fluide in un ciclo infinito come lo hai mostrato. –
Se stai ascoltando *, allora dovresti usare qualche syscall di multiplexing come 'poll (2)' (o il più vecchio, quasi obsoleto, 'select (2)') –