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
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
- Introducing Blocks and Grand Central Dispatch
- Concurrency Programming Guide
- Grand Central Dispatch (GCD) Reference
- hiloing Programming Guide
- Apple opens Grand Central; challenges impede Linux adoption
- Grand Central Dispatch, en el análisis de John Siracusa en Ars Technica
- Thread pool pattern
Technorati Tags: macosx
No hay comentarios:
Publicar un comentario