2013-03-18 19 views
10

Posso scrivere su parti diverse dello stesso file contemporaneamente da più thread (su un PC tipico)? Voglio dire, c'è solo una testa del disco, quindi le scritture possono essere eseguite solo in qualche modo, ad esempio, non in parallelo, giusto?È possibile scrivere su diverse parti dello stesso file da più thread?

Edit:

Sto scrivendo un programma che ordina un grande file binario, ma la maggior parte del tempo è ancora speso per disco I/O, quindi mi chiedo solo ci guadagno qualsiasi velocità extra eseguendo I/O in parallelo.

+0

sì che dovrebbe essere possibile ed è così che funziona il software utorrente .. !! –

+1

Stai parlando di parallelismo fisico? Se parli di parallelismo fisico, pensa a come funziona con un processore single core. – Andrey

+1

Non risolverà il tuo problema di I/O. Funziona se si finisce per richiedere di scrivere sullo stesso file da diversi thread * per risolvere i limiti associati alla CPU *, ma non migliorerà la velocità IO. Se mai, diminuirà leggermente. –

risposta

6

Non c'è nulla che impedisca di avere più thread di scrittura in diverse parti dello stesso file.

Ho un programma che ordina un file binario di grandi dimensioni, ma la maggior parte del tempo è ancora speso per l'I/O del disco, quindi mi chiedo se otterrò qualsiasi altra velocità eseguendo I/O in parallelo.

Se il programma è associato al disco, rendendolo multithread (e ancora scrivendo la stessa quantità di dati sullo stesso disco) non lo accelera.

Se si tratta di un disco rigido tradizionale, l'I/O sequenziale è generalmente più veloce di I/O che comporta lo spostamento della testina del disco avanti e indietro. Con questo in mente, suddividere l'I/O attraverso i thread potrebbe anche essere produttivo.

Ci sono diverse strade da esplorare per quanto riguarda le cose accelerare:

  1. Riducendo la quantità di I/O (ad esempio impiegando un algoritmo di ordinamento che richiede meno di I/O, o facendo più lavoro in -memoria);
  2. Miglioramento del throughput I/O, ad esempio utilizzando un'unità più veloce.
3

È possibile sui sistemi operativi unix (-like) almeno, presumibilmente anche su Windows, anche se la gestione dei file è leggermente diversa e potrebbe richiedere una modalità file specifica (vedere: answer of bizzehdee per i dettagli).

Su un sistema operativo in esecuzione, "file" è in realtà un'entità logica, alcuni stati memorizzati su disco in un determinato momento, ma anche alcune modifiche ancora solo nei buffer del kernel. Quindi, in un certo senso, scrivere in un file non è diverso dalla scrittura al blocco della memoria condivisa, solo l'API è diversa (e nemmeno quella se si usa mmap).

Ma in breve, basta cercare e scrivere, i vecchi byte nel file vengono sovrascritti. Se due processi scrivono sullo stesso byte sovrapposti, penso che il risultato finale sia indefinito, e in ogni caso qualcosa, che non dovrebbe mai accadere in un sistema funzionante correttamente, e qualsiasi programma che lo fa dovrebbe avere un meccanismo per evitare scritture sovrapposte.


Informazioni sull'accelerazione: dipende da cosa si fa, davvero. Se si esegue solo la scrittura grezza, le cose probabilmente rallenteranno sul disco rigido tradizionale rotante, o il file potrebbe diventare frammentato più facilmente. Su un SSD, probabilmente non c'è il rallentamento, ma neanche l'accelerazione.

D'altra parte, se l'operazione è legata alla CPU e si dispone di più core, e se si eseguono operazioni in parallelo, si otterrà un utilizzo totale della CPU più elevato, quindi l'elaborazione di parti diverse dello stesso file di output in parallelo può accelerare cose, anche molte se c'è molta elaborazione rispetto ai byte scritti sul file.

0

Sì, è possibile, ma come altri dicono che è più improbabile per migliorare le prestazioni nel caso generale.

Tuttavia, una delle affermazioni non è corretta.

c'è solo una testina del disco

Innanzitutto, c'è tipicamente uno per superficie, quindi, anche un singolo piatto HDD avrà due teste. Quelli multi-piatto hanno di più, ovviamente.

Alcune unità con più piatti sono anche in grado di leggere o scrivere contemporaneamente su tutti i piatti. Alcuni degli Fujitsu Eagle drives negli anni '80 lo hanno fatto e sono stati utilizzati per i primi sistemi in grado di registrare segnali video digitali non compressi. Questo non è un "accesso casuale", ovviamente, poiché tutte le teste si muovono insieme. Non sono sicuro che le unità moderne utilizzino questa tecnica.

Problemi correlati