Hai scelto un cattivo esempio, come Tudor stato così gentile da sottolineare. L'hardware del disco rotante è soggetto a vincoli fisici per lo spostamento di piatti e testine e l'implementazione di lettura più efficiente consiste nel leggere ogni blocco in ordine, riducendo la necessità di spostare la testina o attendere l'allineamento del disco.
Detto questo, alcuni sistemi operativi non memorizzano sempre le cose continuamente sui dischi, e per coloro che ricordano, la deframmentazione potrebbe fornire un incremento delle prestazioni del disco se il sistema operativo/file system non ha fatto il lavoro per voi.
Come hai accennato a volere un programma che ne trarrebbe beneficio, lascia che ne suggerisca uno semplice, con aggiunta di matrice.
Supponendo di aver creato un thread per core, è possibile dividere banalmente due matrici da aggiungere in righe N (una per ogni thread). Matrix Inoltre (se vi ricordate) funziona come tale:
A + B = C
o
[ a11, a12, a13 ] [ b11, b12, b13] = [ (a11+b11), (a12+b12), (a13+c13) ]
[ a21, a22, a23 ] + [ b21, b22, b23] = [ (a21+b21), (a22+b22), (a23+c23) ]
[ a31, a32, a33 ] [ b31, b32, b33] = [ (a31+b31), (a32+b32), (a33+c33) ]
Quindi, per distribuire questo attraverso N fili, abbiamo semplicemente bisogno di prendere il conteggio delle righe e dividere il modulo per il numero di thread per ottenere l'ID del thread con cui verrà aggiunto.
matrix with 20 rows across 3 threads
row % 3 == 0 (for rows 0, 3, 6, 9, 12, 15, and 18)
row % 3 == 1 (for rows 1, 4, 7, 10, 13, 16, and 19)
row % 3 == 2 (for rows 2, 5, 8, 11, 14, and 17)
// row 20 doesn't exist, because we number rows from 0
Ora ogni filo "sa" cui un file deve gestire, ei risultati "per riga" può essere calcolato banalmente perché i risultati non si intersecano nel dominio di altro filo della computazione.
Tutto ciò che è necessario ora è una struttura di dati "risultato" che tiene traccia quando i valori sono stati calcolati e quando viene impostato l'ultimo valore, quindi il calcolo è completo. In questo esempio "finto" di un risultato di aggiunta di matrice con due thread, il calcolo della risposta con due thread richiede circa la metà del tempo.
// the following assumes that threads don't get rescheduled to different cores for
// illustrative purposes only. Real Threads are scheduled across cores due to
// availability and attempts to prevent unnecessary core migration of a running thread.
[ done, done, done ] // filled in at about the same time as row 2 (runs on core 3)
[ done, done, done ] // filled in at about the same time as row 1 (runs on core 1)
[ done, done, .... ] // filled in at about the same time as row 4 (runs on core 3)
[ done, ...., .... ] // filled in at about the same time as row 3 (runs on core 1)
Problemi più complessi possono essere risolti dal multithreading e diversi problemi vengono risolti con tecniche diverse. Ho scelto di proposito uno degli esempi più semplici.
Grande nome del metodo! Quando ho provato a leggere Moby Dick, ho scoperto che dovevo farlo contemporaneamente (interlacciato con altri libri) ;-) –
Quindi ... la grande balena bianca sarebbe .NET, sì? –