2009-05-23 14 views
24

Quando si eseguono molte operazioni su disco, il multithreading aiuta, ostacola o non fa alcuna differenza?Il multithreading ha senso per le operazioni legate all'IO?

Ad esempio, quando si copiano molti file da una cartella a un'altra.

Chiarimento: Comprendo che quando si eseguono altre operazioni, la concorrenza ovviamente farà la differenza. Se l'attività consisteva nell'aprire un file immagine, convertirlo in un altro formato e quindi salvare, le operazioni del disco possono essere eseguite contemporaneamente alla manipolazione dell'immagine. La mia domanda è quando le sole operazioni eseguite sono operazioni su disco, sia che accodamento simultaneo e risposta alle operazioni del disco sia migliore.

risposta

33

La maggior parte delle risposte finora ha avuto a che fare con lo scheduler del SO. Tuttavia, c'è un fattore più importante che penso possa portare alla tua risposta. Stai scrivendo su un singolo disco fisico o su più dischi fisici?

Anche se si parallelizzare con più thread ... IO ad un singolo disco fisico è intrinsecamente un'operazione serializzato.Ogni thread dovrebbe bloccarsi, aspettando la sua possibilità di ottenere l'accesso al disco. In questo caso, più thread sono probabilmente inutili ... e potrebbero persino portare a problemi di contesa.

Tuttavia, se si sta scrivendo flussi multipli su più dischi fisici, elaborarli simultaneamente dovrebbe darvi una spinta in termini di prestazioni. Questo è particolarmente vero con i dischi gestiti, come array RAID, dispositivi SAN, ecc.

Non penso che il problema abbia molto a che fare con lo scheduler del SO in quanto ha più a che fare con gli aspetti fisici del disco (s) la tua scrittura a.

0

No, non ha senso. Ad un certo punto, le operazioni devono essere serializzate (dal sistema operativo). D'altra parte, dal momento che i sistemi operativi moderni devono far fronte a più processi, comunque, dubito che ci sia un ulteriore sovraccarico.

2

penserei che dipende da una serie di fattori, come il tipo di applicazione in esecuzione, il numero di utenti simultanei, ecc

Attualmente sto lavorando su un progetto che ha un alto grado di lineari (lettura dei file dall'inizio alla fine) operazioni. Usiamo un NAS per l'archiviazione e siamo preoccupati per ciò che accade se eseguiamo più thread. Il nostro pensiero iniziale era che ci avrebbe rallentato perché avrebbe aumentato la ricerca della testa. Quindi abbiamo eseguito alcuni test e scoperto che il numero ideale di thread è lo stesso del numero di core nel computer.

Ma il tuo percorso potrebbe variare.

2

Si può fare, semplicemente perché ogni volta che c'è più lavoro da fare per un thread (identificando il prossimo file da copiare) il sistema operativo lo riattiva, quindi i thread sono un modo semplice per agganciarsi allo scheduler del SO e ancora scrivere codice in un modo sequenziale tradizionale, invece di doverlo suddividere in una macchina a stati con i callback.

Questa è principalmente un'assistenza con programmazione chiara piuttosto che prestazioni.

6

Questo dipende dalla vostra definizione di "I/O bound", ma in generale il multithreading ha due effetti:

  • utilizzano CPU multiple contemporaneamente (che non saranno necessariamente aiuto se il collo di bottiglia è il disco piuttosto che il CPU [s])

  • Utilizzare una CPU (con un altro thread) anche mentre un thread è bloccato (ad esempio, in attesa di completamento I/O)

non sono sicuro che la risposta di Konrad ha sempre ragione, tuttavia: come contro-esempio, se "I/O bound" significa semplicemente "un thread trascorre la maggior parte del tempo in attesa del completamento I/O invece di utilizzare la CPU", ma non significa che "abbiamo raggiunto il limite di larghezza di banda I/O del sistema", quindi IMO con più thread (o I/O asincroni) potrebbe migliorare le prestazioni (abilitando più di una simultanea operazione di I/O).

0

Pensavo che avrebbe ostacolato le operazioni ... Hai solo un controller e un disco.

è possibile utilizzare un secondo thread per fare l'operazione, e un filo conduttore che mostra un'interfaccia utente aggiornata.

0

Penso che potrebbe peggiorare le prestazioni, perché i thread multipli concorreranno per le stesse risorse.

È possibile verificare l'impatto di operazioni simultanee di IO sullo stesso dispositivo copiando un insieme di file da un luogo a un altro e misurando l'ora, quindi dividere il set in due parti e fare le copie in parallelo ... la seconda opzione sarà sensibilmente più lenta.

Problemi correlati