usted escogió un mal ejemplo, como Tudor fue tan amable de señalar. El hardware del disco giratorio está sujeto a las limitaciones físicas de mover los platos y las cabezas, y la implementación de lectura más eficiente es leer cada bloque en orden, lo que reduce la necesidad de mover el cabezal o esperar a que el disco se alinee.
Dicho esto, algunos sistemas operativos no siempre almacenan cosas continuamente en los discos, y para aquellos que lo recuerdan, la desfragmentación podría proporcionar un aumento del rendimiento del disco si su sistema de archivos/OS no le hiciera el trabajo.
Como mencionó querer un programa que se beneficiaría, permítame sugerirle una simple, suma de matriz.
Suponiendo que ha creado un hilo por núcleo, puede dividir trivialmente dos matrices que se agregarán en N filas (una para cada hilo). Además de la matriz (si recuerdan) funciona como tal:
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) ]
Así que para distribuir este a través de N hilos, simplemente hay que tomar el número de filas y dividir el módulo por el número de hilos para obtener el "id. de subproceso" se agregará.
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
Ahora cada hilo "sabe" qué filas se debe manipular, y los resultados "por fila" se puede calcular trivial, porque los resultados no se cruzan en el dominio de otro hilo de la computación.
Todo lo que se necesita ahora es una estructura de datos de "resultados" que rastrea cuándo se han calculado los valores, y cuándo se establece el último valor, luego se completa el cálculo. En este ejemplo "falso" de un resultado de suma de matriz con dos subprocesos, calcular la respuesta con dos subprocesos toma aproximadamente la mitad del tiempo.
// 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)
Los problemas más complejos se pueden resolver con subprocesamiento múltiple, y se resuelven diferentes problemas con diferentes técnicas. Escogí a propósito uno de los ejemplos más simples.
gran nombre de método! Cuando traté de leer Moby Dick, descubrí que tenía que hacerlo al mismo tiempo (intercalado con otros libros) ;-) –
Entonces ... la gran ballena blanca sería .NET, ¿sí? –