Parallel Extensions fue el nombre de desarrollo de una biblioteca de concurrencia administrada desarrollada por una colaboración entre Microsoft Research y el equipo CLR de Microsoft . La biblioteca se lanzó en la versión 4.0 de .NET Framework . [1] Está compuesta por dos partes: Parallel LINQ (PLINQ) y Task Parallel Library (TPL). [2] [3] También consta de un conjunto de estructuras de datos de coordinación (CDS), conjuntos de estructuras de datos que se utilizan para sincronizar y coordinar la ejecución de tareas concurrentes. [4]
PLINQ , o Parallel LINQ , paraleliza la ejecución de consultas sobre objetos (LINQ to Objects) y datos XML (LINQ to XML). PLINQ está pensado para exponer el paralelismo de datos mediante el uso de consultas. [2] Cualquier cálculo sobre objetos que se haya implementado como consultas puede ser paralelizado por PLINQ. Sin embargo, los objetos necesitan implementar la IParallelEnumerable
interfaz, que está definida por el propio PLINQ. Internamente, utiliza TPL para la ejecución. [4] [5]
La biblioteca de tareas paralelas ( TPL ) es el componente de paralelismo de tareas de las extensiones paralelas para .NET. [6] Expone construcciones paralelas como paralelos For
y ForEach
bucles, utilizando llamadas de métodos y delegados regulares , por lo que las construcciones se pueden usar desde cualquier lenguaje CLI . El trabajo de generar y terminar subprocesos , así como escalar el número de subprocesos de acuerdo con el número de procesadores disponibles, lo realiza la propia biblioteca, [3] utilizando un programador que roba trabajo . [7]
TPL también incluye otras construcciones como Task y Future . Una Task es una acción que se puede ejecutar independientemente del resto del programa. En ese sentido, es semánticamente equivalente a un hilo, excepto que es un objeto más liviano y no tiene la sobrecarga de crear un hilo del sistema operativo. Las tareas se ponen en cola mediante un objeto del Administrador de tareas y se programan para ejecutarse en varios hilos del sistema operativo en un grupo de hilos cuando llega su turno.
Future es una tarea que devuelve un resultado. El resultado se calcula en un subproceso en segundo plano encapsulado por el objeto Future y se almacena en un búfer hasta que se recupera. [3] Si se intenta recuperar el resultado antes de que se haya calculado, el subproceso solicitante se bloqueará hasta que el resultado esté disponible. [6]
La otra construcción de TPL es la clase Parallel . TPL proporciona una forma básica de paralelismo estructurado a través de tres métodos estáticos en la clase Parallel:
El concepto principal de las extensiones paralelas para .NET es una Task
, que es una pequeña unidad de código, generalmente representada como una función lambda , que se puede ejecutar de forma independiente. Tanto PLINQ como la API TPL proporcionan métodos para crear las tareas: PLINQ divide una consulta en tareas más pequeñas y los métodos Parallel.For
, Parallel.ForEach
y Parallel.Invoke
dividen un bucle en tareas.
PFX incluye un Task Manager
objeto que programa las tareas para su ejecución. Un administrador de tareas contiene una cola global de tareas que luego se ejecutan. También encapsula varios subprocesos en los que se ejecutan las tareas. De forma predeterminada, se crean tantos subprocesos como procesadores (o núcleos de procesador) haya en el sistema, aunque este número se puede modificar manualmente. Cada subproceso está asociado con una cola de tareas específica para subprocesos. Cuando está inactivo, cada subproceso toma un lote de tareas y las coloca en su cola local, donde luego se ejecutan, una por una. Si la cola global está vacía, un subproceso buscará tareas en las colas de sus pares y tomará las tareas que hayan estado en la cola durante más tiempo ( robo de tareas ). Cuando están en ejecución, las tareas se ejecutarán de forma independiente, y el cambio de estado de una tarea será independiente de las demás. Como resultado, si utilizan un recurso compartido, aún deben sincronizarse manualmente mediante bloqueos u otras construcciones.