2010-10-26 15 views
41

Ho letto il modello threaded di programmazione rispetto al modello asincrono da questo articolo davvero buono. http://krondo.com/blog/?p=1209Thread vs. Async

Tuttavia, l'articolo cita i seguenti punti.

  1. Un programma asincrono semplicemente sovraperforma un programma di sincronizzazione passando da un'attività all'altra ogni volta che è presente un I/O.
  2. I thread sono gestiti dal sistema operativo.

Ricordo di aver letto che i thread sono gestiti dal sistema operativo spostandosi tra TCB tra Ready-Queue e Waiting-Queue (tra le altre code). In questo caso, le discussioni non perdono tempo in attesa o?

Alla luce di quanto sopra menzionato, quali sono i vantaggi dei programmi asincroni su programmi con thread?

+0

Penso che tu intenda sincrono contro asincrono. – someguy

+4

No, intendevo Threaded Async. Ho accennato al punto uno solo perché era qualcosa che ho capito dall'articolo. –

risposta

55
  1. È molto difficile scrivere codice che sia thread-safe. Con il codice asincrono, sai esattamente dove il codice passerà da un'attività all'altra e quindi le condizioni di gara sono molto più difficili da ottenere.
  2. I thread consumano una buona quantità di dati poiché ogni thread deve avere il proprio stack. Con il codice asincrono, tutto il codice condivide lo stesso stack e lo stack viene mantenuto piccolo a causa dello svolgimento continuo dello stack tra le attività.
  3. I thread sono strutture del sistema operativo e pertanto sono più memoria per la piattaforma da supportare. Non esiste alcun problema con attività asincrone.
+9

Per elaborare un bit: 1. La parte I/O del codice thread è relativamente semplice, ma la gestione dello stato condiviso tra i thread (utilizzando blocchi/code/ecc.) Senza condizioni di competizione è ciò che rende complicato. L'utilizzo di un modello asincrono consente di avere meno attività contemporaneamente, in modo da evitare facilmente le gare. 2/3. ogni thread consumerà almeno una pagina di memoria di stack (in genere 4KB o 8 KB), oltre a una quantità sconosciuta di memoria per altre strutture di dati correlate allo stato di quel thread. –

4

Prima di tutto, si noti che molti dettagli su come i thread sono implementati e pianificati sono specifici per OS. In generale, non è necessario preoccuparsi di thread in attesa l'uno dell'altro, dal momento che il sistema operativo e l'hardware cercheranno di farli funzionare in modo efficiente, sia in modo asincrono su un sistema a processore singolo o in parallelo su più processori.

Una volta che un thread ha terminato di attendere qualcosa, ad esempio I/O, può essere considerato eseguibile. I thread che sono eseguibili saranno programmati per l'esecuzione a un certo punto presto. Se questo è implementato come una semplice coda o qualcosa di più sofisticato è, ancora una volta, specifico per OS e hardware. Puoi pensare al set di thread bloccati come set piuttosto che come coda strettamente ordinata.

Si noti che su un sistema a processore singolo, i programmi asincroni come definiti qui sono equivalenti ai programmi con thread.

-1

Async I/O significa che c'è già un thread nel driver che esegue il lavoro, quindi si sta duplicando la funzionalità e si verificano dei sovraccarichi. D'altra parte, spesso non è documentato come si comporta esattamente il thread del driver, e in scenari complessi, quando si desidera controllare il comportamento di timeout/cancellazione/avvio/arresto, la sincronizzazione con altri thread, ha senso implementare il proprio thread. A volte è anche più facile ragionare in termini di sincronizzazione.

+3

Non è così che funziona l'I/O asincrono. Fondamentalmente, l'I/O è basato sugli eventi (si avvia un I/O su un dispositivo, in seguito il dispositivo lo completa e si spera che lo comunichi con un interrupt). Esistono alcuni tipi di I/O (come I/O del disco) in cui il driver utilizza un thread del kernel per motivi un po 'oscuri; ma per le reti, sono operazioni asincrone fino in fondo. – Glyph

0

vedi http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

Tuttavia, l'uso del sistema di blocco chiamate in thread utente (in contrapposizione a kernel thread) o fibre possono essere problematico. Se un thread utente o una fibra esegue una chiamata di sistema che blocca, gli altri thread utente e le fibre nel processo non possono essere eseguite finché non viene restituita la chiamata di sistema. Un tipico esempio di questo problema si verifica quando si esegue l'I/O: la maggior parte dei programmi viene scritta per eseguire l'I/O in modo sincrono.Quando viene avviata un'operazione di I/O, viene effettuata una chiamata di sistema e non ritorna fino al completamento dell'operazione di I/O. Nel frattempo, l'intero processo è "bloccato" dal kernel e non può essere eseguito, il che impedisce l'esecuzione di altri thread e fibre utente nello stesso processo.

In base a ciò, l'intero processo potrebbe essere bloccato e nessun thread verrà pianificato quando un thread è bloccato in IO. Penso che questo sia specifico per OS, e non sarà sempre valido.

6

Ci sono due modi per creare discussioni: filettatura

sincrono - il genitore crea uno (o più) thread figlio e poi deve attendere per ogni bambino per terminare. Il threading sincrono viene spesso definito come fork-join model.

threading asincrono - il genitore e il figlio vengono eseguiti contemporaneamente/indipendentemente l'uno dall'altro. I server multithread seguono in genere questo modello.

risorsa - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720

-1
  1. utente si assume hanno 2 compiti, che non comporta alcun IO (sulla macchina multiprocessore). In questo caso i thread superano Async. Perché Async come un programma a thread singolo esegue le tue attività in ordine. Ma i thread possono eseguire entrambe le attività contemporaneamente.

  2. Si supponga di avere 2 attività, che coinvolgono IO (su macchina multiprocessore). In questo caso, sia Async che Thread eseguono più o meno la stessa cosa (le prestazioni possono variare in base al numero di core, programmazione, quantità di lavoro intensiva del processo ecc.). Anche Async richiede meno risorse, meno spese generali e meno complesse da programmare su programmi multi-thread.

Come funziona? Il thread 1 esegue l'attività 1, poiché è in attesa di IO, viene spostato nella coda di attesa IO . Analogamente Thread 2 esegue Task 2, poiché coinvolge anche IO, viene spostato su IO waiting Queue. Non appena viene risolta la richiesta di I/O , questa viene spostata nella coda pronta in modo che lo scheduler possa pianificare il thread per l'esecuzione di .

Async esegue l'attività 1 e senza attendere che sia IO a completarlo, continua con l'attività 2, quindi attende l'I/O per completare l'attività. È completa le attività nell'ordine di completamento dell'IO.

Async più adatto per attività che implicano chiamate di servizio Web, query di database chiamate ecc., Thread per attività intensive di processo.

Il video qui sotto spiega circa Async vs Threaded model e anche quando utilizzare ecc, https://www.youtube.com/watch?v=kdzL3r-yJZY

Spero che questo è utile.

+0

https://www.youtube.com/watch?v=kdzL3r-yJZY – Lakshmipathi

+0

Un collegamento a una potenziale soluzione è sempre il benvenuto, ma per favore [aggiungi contesto intorno al link] (// meta.stackoverflow.com/a/8259) così i tuoi utenti avranno un'idea di cosa sia e perché è lì. ** Cita sempre la parte più rilevante di un link importante, nel caso in cui il sito target sia irraggiungibile o sia permanentemente offline. ** Considera che essere _barely più di un link a un sito esterno_ è una possibile ragione per [Perché e come vengono eliminate alcune risposte?] (// stackoverflow.com/help/deleted-answers). – Machavity

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/17067843) – gobrewers14