miércoles, septiembre 16, 2009

Apple publica las fuentes de su implementación de Grand Central Dispatch API

(vía reddit.programming) Acabo de ver que Apple ha publicado las fuentes de Grand Central Dispatch, una serie de herramientas para la facilitar la programación concurrente en máquinas con múltiples procesadores. Leyendo la introduccion, es un conjunto de herramientas que permite aprovechar las capacidades de procesamiento paralelo de los procesadores actuales para poder ejecutar varios procesos de manera simultánea de manera más sencilla que con los actuales hilos POSIX. Apple ha diseñado unas extensióne a los lenguajes C, C++ y Objetive-C, un conjunto de funciones de runtime y soporte en el sistema operativo. Sin embargo, al ser otra librería de hilos más, pero que presenta otras abstracciones para su uso, se puede compilar y usar con los lenguajes originales sin necesidad de modificaciones de la sintaxis de los mismos.

Las abstracciones que propone Apple son las siguientes

  • Block Objects: Bloques de código.
  • Dispatch Queues: Colas donde se añadiran los bloques de código para su posterior ejecución.
  • Primitivas de sincronización
  • Eventos que pueden lanzar la ejecución de determinados bloques de código.

La idea que ha tenido Apple es de encapsular todo el código de gestión de hilos en una serie de librerías del sistema operativo, y que sea éste el encargado de la planificación y ejecución de las mismas. El modelo de ejecución de estas tareas es asíncrona, donde existen unas colas de despacho donde se añaden las tareas a ejecutar (ya sean definidas como funciones o como bloques de código), por debajo de las cuales, el sistema implementa un conjunto de hilos que se van a ejecutar. Es decir, es una librería de hilos en espacio de usuario que se mapea a una serie de hilos del sistema con un modelo N:M. Una cosa importante es el número de hilos del sistema que se crean para manejar las colas: Esto es algo que va a hacer el sistema en función del número de núcleos que tenga el sistema, de tal manera que no es el programador el que tenga que decidir el número de hilos encargados de hacer el trabajo. El siguiente esquema es como yo interpreto el uso de las dispatch queues

Dispath Queues

Las tareas se encolan en las colas de despacho en orden FIFO, mientras que la ejecución y finalización de las mismas no tienen porqué ocurrir en ese orden. Apple sin embargo ha añadido la posibilidad de usar colas que donde las tareas que se añadan a las mismas se ejecuten en el mismo orden en las que se añadieron a la cola, y que una tarea no empieza a ejecutarse hasta que la previa lo haya hecho.

Otra de las abstracciones que usan son las Event Sources. La librería permite definir eventos, que cuando sucedan, ejecutarán un determinado bloque de código o función en la dispatch queue que se le haya asignado. Así se puede crear eventos cuando finalice un timer o hayan datos disponibles en un socket determinado, que se asignaran a una cola, que empezarán a ejecutarse cuando se dispare el evento.

¿Qué motivo ha podido tener Apple para diseñar un nuevo API para multiproceso, que usa el paradigma de pool de hilos?. Pues según apunta John Siracusa, puede ser porque la creación de hilos es una tarea bastante pesada en MacOS X, y va a acompañado de un uso bastante intensivo de recursos (apunta del orden de 512Kb por hilo), frente a los menos de 256 bytes que ocupa cada gestión de tarea con esta librería. Las implicaciones para el programador es dejar de preocuparse del hardware que tenga debajo para crear el pool de hilos, que ya se encargará el sistema de hacerlo por nosotros.

Referencias

  1. Introducing Blocks and Grand Central Dispatch
  2. Concurrency Programming Guide
  3. Grand Central Dispatch (GCD) Reference
  4. hiloing Programming Guide
  5. Apple opens Grand Central; challenges impede Linux adoption
  6. Grand Central Dispatch, en el análisis de John Siracusa en Ars Technica
  7. Thread pool pattern

Technorati Tags:

No hay comentarios: