Domanda

Qual è la differenza tra un filo e una fibra? Ho sentito parlare di fibre da Ruby e ho letto sentito che sono disponibili in altre lingue, qualcuno potrebbe spiegare a me in termini semplici che cosa è la differenza tra un filo e una fibra.

È stato utile?

Soluzione

In termini più semplici, fili sono generalmente considerati preventivo (anche se questo non è sempre vero, a seconda del sistema operativo) mentre le fibre sono considerati leggero, fili cooperativa. Entrambi sono separati percorsi di esecuzione per l'applicazione.

Con filettature: il percorso di esecuzione corrente può essere interrotta o Preempted in qualsiasi momento (nota:. Questa affermazione è una generalizzazione e non può tenere sempre vero seconda OS pacchetto / filettatura / etc). Ciò significa che per filetti, l'integrità dei dati è un grosso problema perché un thread può essere fermato nel mezzo di aggiornamento di un blocco di dati, lasciando l'integrità dei dati in uno stato difettoso o incompleto. Questo significa anche che il sistema operativo può sfruttare più CPU e CPU core eseguendo più di un thread contemporaneamente e lasciando allo sviluppatore per proteggere l'accesso ai dati.

Con fibre: il percorso di esecuzione corrente viene interrotta solo quando l'esecuzione rese fibra (stessa nota come sopra). Ciò significa che le fibre iniziano sempre e fermano in luoghi ben definiti, quindi l'integrità dei dati è molto meno di un problema. Inoltre, poiché le fibre sono spesso gestiti nello spazio utente, cambiamenti di contesto costosi e cambiamenti di stato CPU non devono essere effettuate, facendo cambiare da una fibra all'altra estremamente efficiente. D'altra parte, poiché non esistono due fibre possono funzionare esattamente nello stesso tempo, solo utilizzando fibre solo non sfruttare più CPU o più core CPU.

Altri suggerimenti

Filati usa preventivo scheduling, mentre le fibre usa cooperativa scheduling.

Con un filo, il flusso di controllo potrebbe ottenere interrotto in qualsiasi momento, e un altro filo può assumere. Con processori multipli, è possibile avere più thread tutti in esecuzione allo stesso tempo ( simultanea multithreading o SMT). Di conseguenza, si deve essere molto attenzione circa l'accesso ai dati simultanei, e proteggere i dati con mutex, semafori, variabili di condizione, e così via. Spesso è molto difficile da ottenere.

Con una fibra, il controllo passa solo quando la dite, in genere con una chiamata di funzione con un nome simile yield(). Questo rende concomitante accesso ai dati più semplice, dal momento che non devi preoccuparti di atomicità di strutture di dati o mutex. Finché non cedere, non c'è pericolo di essere preempted e avere un'altra fibra cercando di leggere o modificare i dati che si sta lavorando. Come risultato, però, se la tua fibra entra in un ciclo infinito, nessun altra fibra può funzionare, visto che non stai cedendo.

Si può anche mescolare fili e fibre, che dà origine a problemi affrontati da entrambi. Negativa, ma a volte può essere la cosa giusta da fare se fatto con attenzione.

In Win32, una fibra è una sorta di filo gestiti dall'utente. Una fibra ha un proprio stack e proprio puntatore all'istruzione ecc, ma le fibre non sono in programma dal sistema operativo: devi chiamare SwitchToFiber in modo esplicito. Fili, al contrario, sono preventivamente programmate dal sistema operativo. Quindi grosso modo una fibra è un filo che viene gestito a livello di applicazione / runtime invece di essere un vero e proprio filo OS.

Le conseguenze sono che le fibre sono più economici e che l'applicazione ha più controllo sulla pianificazione. Questo può essere importante se l'applicazione crea un sacco di attività simultanee, e / o vuole ottimizzare strettamente quando corrono. Ad esempio, un server di database potrebbe scegliere di utilizzare fibre piuttosto che le discussioni.

(Ci possono essere altri utilizzi per lo stesso periodo;. Come osservato, questa è la definizione Win32)

Per prima cosa mi sento di raccomandare la lettura di questa spiegazione della la differenza tra processi e thread come materiale di base.

Una volta che hai letto che è piuttosto semplice. lattine Discussioni essere attuate sia nel kernel, nello spazio utente, oi due possono essere mescolati. Le fibre sono fondamentalmente fili implementate nello spazio utente.

  • Ciò che è tipicamente chiamato un thread è un thread di esecuzione implementato nel kernel: ciò che è noto come un kernel thread. La programmazione di un kernel thread viene gestita esclusivamente dal kernel, anche se un kernel thread può rilasciare volontariamente la CPU dormendo, se vuole. Un thread del kernel ha il vantaggio di poter utilizzare il blocco di I / O e lasciare che la preoccupazione del kernel sulla pianificazione. È svantaggio principale è che il passaggio del filo è relativamente lento, poiché richiede intrappolando nel kernel.
  • Le fibre sono fili di spazio utente la cui programmazione viene gestito nello spazio utente da uno o più fili kernel sotto un unico processo. Questo rende fibra commutazione molto veloce. Se si raggruppano tutte le fibre che accedono a un particolare insieme di dati condivisi nel contesto di un singolo thread del kernel e che hanno la loro programmazione gestita da un unico filo del kernel, quindi è possibile eliminare i problemi di sincronizzazione poiché le fibre verrà eseguito in modo efficace in serie e si dispone di completa il controllo sulla loro programmazione. Raggruppamento fibre collegate in un unico filo kernel è importante, poiché il filo kernel sono in esecuzione in può essere anticipata dalla kernel. Questo punto non è chiaro in molte delle altre risposte. Inoltre, se si utilizza il blocco I / O in una fibra, l'intero kernel filo è una parte di blocchi comprese tutte le fibre che sono parte di quel filo kernel.

Nella sezione 11.4 "Processi e thread in Windows Vista" nei sistemi operativi moderni, commenti Tanenbaum:

  

Sebbene fibre sono cooperativamente previsti, se ci sono più   filetti la pianificazione delle fibre, un sacco di un'attenta sincronizzazione   necessaria per assicurarsi che le fibre non interferiscano tra loro. Per   semplificare l'interazione tra fili e fibre, è spesso   utile creare solo tanti fili quante sono processori per eseguire   li, e affinità tra i fili di ogni corsa solo su un insieme distinto di   processori disponibili, o anche solo ad un processore. Ogni thread può   quindi eseguire un particolare sottoinsieme delle fibre, stabilendo uno   a-molti tra fili e fibre che semplifica   sincronizzazione. Anche se ci sono ancora molte difficoltà   fibre. La maggior parte delle librerie Win32 sono completamente all'oscuro di fibre, e   applicazioni che tentano di utilizzare fibre come se fossero fili saranno   incontrare vari fallimenti. Il kernel non è a conoscenza di fibre,   e quando una fibra entra nel nucleo, il filo è in esecuzione su può   blocco e il kernel programmerà un thread arbitrario sulla   processore, rendendo disponibile per eseguire altre fibre. Per questi   fibre motivi sono raramente utilizzati, tranne quando porting codice da altri   sistemi che richiedono esplicitamente la funzionalità fornita da fibre.

Si noti che, oltre a fili e fibre, Windows 7 introduce -User Mode Scheduling :

  

in modalità utente di pianificazione (UMS) è un   Meccanismo leggera che   applicazioni possono utilizzare per programmare il loro   propri thread. Un'applicazione può commutare   tra UMS thread in modalità utente   senza coinvolgere lo scheduler del sistema   e riprendere il controllo del processore, se   un UMS blocchi di filettatura del kernel. UMS   fili differiscono da fibre in tale   ogni thread UMS ha il proprio filo   contesto invece di scambio del filo   contesto di un singolo filo. Il   possibilità di passare tra le discussioni in   modalità utente rende più efficiente UMS   di pool di thread per la gestione di grandi dimensioni   numero di elementi di lavoro di breve durata   che richiedono poche chiamate di sistema.

Ulteriori informazioni su filati, fibre e UMS è disponibile guardando Dave Probert:. All'interno di Windows 7 - User Mode Scheduler (UMS)

Le discussioni sono in programma dal sistema operativo (pre-emptive). Un filo può essere fermato o ripreso in qualsiasi momento dal sistema operativo, ma le fibre più o meno il gestore stessi (cooperativa) e la resa tra loro. Cioè, i controlli programmatore quando le fibre fanno il loro trattamento e quando tale elaborazione passa a un'altra fibra.

Le discussioni sono stati originariamente creati come processi leggeri. In modo simile, le fibre sono un filo leggero, basandosi (semplicisticamente) sulle fibre stesse per pianificare l'altro, cedendo controllo.

Credo che il prossimo passo sarà filoni in cui si deve inviare loro un segnale ogni volta che si desidera loro di eseguire un'istruzione (non dissimile da mio figlio 5yo :-). Ai vecchi tempi (e anche ora su alcune piattaforme embedded), tutte le discussioni erano le fibre, non vi era alcuna prelazione e si doveva scrivere le vostre discussioni a comportarsi bene.

Fili genere si basano sul kernel di interrompere il filo in modo o nell'altro thread può eseguire (che è meglio conosciuto come multitasking prelazione) mentre le fibre utilizzano multitasking cooperativo dove è la fibra stessa che danno la sua esecuzione tempo in modo che altre fibre possono eseguire.

Alcuni link utili che spiegano meglio di probabilmente ho fatto sono:

definizione fibra Win32 è in realtà "Green Thread" definizione stabilita di Sun Microsystems. Non c'è bisogno di sprecare la fibra termine sul filo di qualche tipo, cioè un filo esecuzione nello spazio utente sotto controllo codice utente / thread-library.

Per chiarire l'aspetto argomento ai seguenti osservazioni:

  • Con iperthreading, CPU multi-core può accettare più thread e distribuirli uno su ogni core.
  • superscalare pipeline CPU accetta un thread per l'esecuzione e utilizza istruzioni Livello Parallelismo (ILP) per eseguire il thread più veloce. Possiamo supporre che un thread è suddiviso in fibre parallele esecuzione in gasdotti paralleli.
  • SMT CPU può accettare più fili e freno in fibre di istruzioni per esecuzione parallelo su più oleodotti, utilizzando gasdotti più efficiente.

Dobbiamo supporre che i processi sono fatti di fili e che filettature devono essere fatti di fibre. Con questo in mente logica, utilizzando fibre per altri tipi di fili è sbagliato.

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