Accesso sequenziale o parallelo al disco fisso nel programma multithread?

1

Nel programma java multi-threaded, avvio quattro thread simultanei con i seguenti dettagli

1.  Thread 1 writing file F1 
2.  Thread 2 writing file F2
3.  Thread 3 reading file F3
4.  Thread 4 reading file F4

Si tratta di un processore octa core, La mia domanda può quattro thread paralleli leggere o scrivere su hard disk o sarà sequenziale internamente in quanto sono tutti in competizione per singola risorsa, ad es. hard disk?

    
posta user3198603 12.08.2018 - 08:23
fonte

2 risposte

2

Supponendo che tutti siano sullo stesso disco, tutte le operazioni di lettura e scrittura verranno infine eseguite una alla volta. Supponendo che ogni file richieda lo stesso lasso di tempo da solo, il tuo lavoro complessivo richiederà circa 4 volte, indipendentemente dal numero di core che hai.

Tuttavia, non saranno necessariamente eseguiti in modo sequenziale e tutti e quattro potrebbero sembrare in esecuzione, ma il disco rigido eseguirà solo una lettura / scrittura alla volta. L'ordine esatto in cui vengono eseguite le operazioni sarà apparentemente casuale, soggetto ai capricci del programmatore e dell'orologio.

Per questo motivo, potrebbe essere saggio impostare da sé un sistema per accodare i lavori di I / O richiesti, per assicurarsi che vengano eseguiti in sequenza. Puoi spremere un po 'di prestazioni evitando che il disco rigido funzioni per soddisfare le diverse richieste.

    
risposta data 12.08.2018 - 08:34
fonte
3

È difficile dire cosa succederà alla fine a livello di unità. Tra il tuo programma Java e le testine fisiche del disco rigido ci saranno più fasi di buffering e scheduling che cercano di rendere più efficiente il processo di scrittura.

In primo luogo, il file system del sistema operativo può salvare l'output in modo asincrono e inviarlo al driver del dispositivo in un momento opportuno. Questo è noto come cache write-behind. Può avere una politica, non scrivere nulla per molto tempo mentre nessuno vuole leggerlo. Ciò può migliorare le prestazioni perché la scrittura sequenziale di molti dati nello stesso file è in genere più veloce rispetto alla scrittura di piccoli pezzi di file diversi in modo alternato.

Poiché un disco rigido è essenzialmente un dispositivo a blocchi, il software del driver può accumulare l'output e attendere altro. Dopo aver impilato un paio di blocchi completi o dopo che è passato un po 'di tempo, potrebbe decidere di infastidire il dispositivo con nuovi blocchi da scrivere.

Quindi il dispositivo stesso avrà un file system a un livello inferiore (non conosce i file ma sa dove sono i blocchi sul disco e quanto costosa sarà scrivere un blocco particolare, dato dove sono le teste al momento). Quindi impilerà i blocchi che riceve dal driver e individuerà una sequenza intelligente per scriverli sul disco, evitando il più possibile movimenti della testa il più possibile.

Quindi non ti rimane molto che ti preoccupi e non hai praticamente alcun controllo sull'ordine che le cose finiranno sul disco se stai scrivendo molto velocemente, indipendentemente dall'ordine che scegli a livello di applicazione. Se le prestazioni di scrittura sono importanti per la tua applicazione, il meglio che puoi fare è provare alcuni scenari diversi e vedere come funzionano nel tuo sistema.

    
risposta data 12.08.2018 - 09:44
fonte

Leggi altre domande sui tag