Qualcuno può spiegare la differenza tra il modello di threading preemptive e il modello di threading non preventivo?Filettature preventive Vs Filettature non preventive
Come per la mia comprensione:
- non preventiva modello di thread: volta un thread avviato, non può essere interrotto o il controllo non può essere trasferito ad altri thread finché il filo ha completato il suo compito.
- Modello di filettatura preventiva: Il runtime può entrare e passare manualmente da un thread a un altro in qualsiasi momento. I thread con priorità più alta hanno la precedenza sui thread con priorità più bassa.
Qualcuno può per favore:
- Spiegate se la comprensione è corretta.
- Spiegare i vantaggi e gli svantaggi di entrambi i modelli.
- Un esempio di quando utilizzare ciò che sarà veramente utile.
- Se creo un thread in Linux (system v o Pthread) senza menzionare alcuna opzione (ce ne sono ??) per impostazione predefinita il modello di threading utilizzato è il modello di threading preventivo?
Solo una nota su yield(): non usarla su Linux perché risulta in prestazioni orribili. Un thread ceduto viene inserito nella parte finale della pianificazione del thread in modo che il thread non venga pianificato fino a quando * tutto il resto dell'intero sistema * ha avuto la sua possibilità. –
A mio avviso, quando il processo principale crea due thread, verranno eseguiti in parallelo. Quindi il "Modello di threading non preemptive" rende l'esecuzione come, (finish_thread_1) -> (finish_thread_2) -> main()? Voglio dire dopo che il thread 1 ha finito completamente il thread 2 inizierà dopo il completamento, il metodo main() chiamerà. È corretto? Se è così, a cosa serve "Thread non Preemptive"? – rakeshNS
@rakeshNS: i thread non cooperativi indicano che un thread viene eseguito finché non chiama una funzione che forza/consente il passaggio a un altro thread. In alcuni casi, questa è una funzione di 'yield' esplicita. In altri, consentire l'esecuzione di altri thread è implicito in alcune altre funzioni.Ad esempio, in Windows a 16 bit, quando hai chiamato 'GetMessage', altri thread/processi potevano essere eseguiti (erano considerati processi, ma tutti condividevano uno spazio indirizzo ...) –