La programación paralela es el uso de varios procesadores trabajando en conjunto para dar solución a una tarea en común, estos se dividen el trabajo y cada procesador hace una porción del problema al poder intercambiar datos por una red de interconexión o a través de memoria.
Es tendencia que cada vez haya más núcleos en los procesadores, ya no sólo por rendimiento sino por las ventajas en cuanto a ahorro de energía, temperatura, entre otras cosas. Esto implica que casi cualquier aplicación pueda trabajar en entornos con múltiples núcleos, lo que hace realmente importante sacarle provecho a la programación multi-subproceso.
Antes, para aumentar el rendimiento de una aplicación bastaba con moverla a una máquina con un procesador más rápido. Sin embargo, hoy en día, el rendimiento se obtiene a través de sacarle partido a más. Esto quiere decir que si queremos que una aplicación llegue a ser escalable ésta debe sacar partido a múltiples hilos de ejecución y, por lo tanto, a múltiples nodos de procesamiento.
Este tipo de programación paralela siempre ha sido muy compleja, sobre todo a la hora de depurar aplicaciones en las que existen muchas probabilidades de generar interbloqueos o “race conditions”. En su momento, con .NET 4.0 y Visual Studio se incluyeron nuevas bibliotecas, tipos y herramientas para facilitar la programación multi-núcleo, área de suma importancia para los programadores.
Muchos programadores recomiendan a .NET 4.0 para realizar este tipo de tareas. Con él disponemos de lo que se ha bautizado como “Parallel Extensions” que están formadas por tres componentes:
- La biblioteca de tareas paralelas (TPL, Task Parallel Library): esta biblioteca dentro del espacio de nombres System.Threading.Taks.Parallel incluye construcciones para ejecutar tareas repetitivas independientes entre sí en paralelo y de forma automática, como por ejemplo versiones paralelas de los bucles For y ForEach.
- El motor de ejecución paralela de Linq (PLINQ Execution Engine): como se desprende de su nombre, se trata de una versión paralelizada de Linq to Objects, que nos permite lanzar consultas integradas en el lenguaje aprovechando la capacidad de paralelismo del sistema.
- Las estructuras de datos para coordinación (CDS, Coordination data Structures): ofrece un conjunto de primitivas de sincronización y de colecciones preparadas para multisubproceso (thread-safe) que simplifican los escenarios paralelizados. Por ejemplo, tenemos diccionarios, pilas y colas thread-safe, y objetos especiales para sincronización de hilos como el SpinWait o el SpinLock.
0 comentarios