Domanda

Sono estendere la funzionalità di un semaforo. Mi sono imbattuto in un posto di blocco quando ho capito che non conosco la realizzazione di un vero e proprio semaforo e per assicurarsi che il mio codice ha funzionato correttamente, avevo bisogno di sapere questo.

So un semaforo funziona bloccando thread nell'attesa su di esso quando chiamano sem_wait () e un altro filo attualmente ha bloccato. Il filo viene poi bloccata e poi messo in una lista di attesa per quel semaforo.

La mia domanda si riferisce a ciò che accade su un sem_post (). È il filo successivo tirato fuori dalla lista di attesa, impostare come il filo di chiusura, e ha permesso di essere sbloccato? O è lo schema per la pubblicazione di completamente diverso?

Grazie!

È stato utile?

Soluzione

semafori avere due operazioni:

  1. P() per acquisire il semaforo (ti sembra di chiamare questo sem_wait)
  2. V() Per rilasciare il semaforo (ti sembra di chiamare questo sem_post)

semafori hanno anche un intero associato ad essi, che è il numero di thread simultanei transita P () senza bloccare. Altre chiamate a P () bloccherà fino V () è chiamato a liberare macchie.

Questa è la definizione classica di un semaforo.

Modifica I semafori non forniscono alcuna garanzia di ordine. Non hanno utilizzare effettivamente una coda o altra struttura FIFO. Quando solo un thread è consentita alla volta, quando chiama V (), un altro (possibilmente casuale) filo tornerà dal suo P () chiamata e continuare.

Altri suggerimenti

Il filo successivo di sbloccare sul suo sem_wait() sarà qualunque discussione il sistema operativo decide è il prossimo ad contesto passare in. Nessuno fa alcuna garanzia di ordinamento; essa dipende dalla strategia di pianificazione del vostro sistema operativo. Potrebbe essere il filo che è stato fuori la CPU per il più lungo, o quello che è stato assegnato il più alto "priorità", o quello che ha storicamente avuto alcune statistiche di utilizzo delle risorse, o qualsiasi altra cosa.

Molto probabilmente, il tuo thread corrente (quella che ha chiamato sem_post()) continuerà in esecuzione per un po ', fino a quando non sia avvia in attesa di input dell'utente, blocca su un altro semaforo, o esaurisce la sua fetta di tempo os-assegnato. Quindi, il sistema operativo passa in qualche processo totalmente estranei a correre per una frazione di secondo (probabilmente Firefox o qualcosa del genere), poi spegnersi e gestire una parte del traffico di rete, ottenere per sé una tazza di tè, e, infine, quando si arriva intorno ad esso, scegliere a seconda di quale dei tuoi altri thread ci si sente, sulla base di qualcosa come se ci si sente basa sulla storia passata che il filo particolare, è più CPU o I / o-bound.

In molti sistemi operativi, la priorità viene data a I / O-bound processi che non sono stati in giro per molto tempo. La teoria è che i nuovi processi potrebbero essere di breve durata (se è stato in giro per cinque ore già, le probabilità sono che non sarà finendo nei prossimi 1ms) in modo tanto vale farli finita. I / O-bound processi è probabile che continueranno ad essere di I / O-bound, il che significa che le probabilità sono che stanno per spegnere la CPU a breve in attesa di altre risorse. In sostanza, il sistema operativo vuole trovare il processo che sta andando essere in grado di essere fatto con più presto, in modo che possa tornare a sorseggiare il suo tè e in esecuzione il malware.

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