domingo, 25 de noviembre de 2018

CONCURRENCIA, PARALELISMO, MULTI-PROCESO O MULTI-HILO


¿CUÁL ES LA DIFERENCIA? , ¿CUANDO USARLOS ?



Existe cierta confusión acerca de lo que es concurrencia y paralelismo. La confusión se acentúa cuando se empieza a hablar de multi-procesos y multi-hilos  y como estos interactúan con el o los  procesadores de una computadora. Para clarificar estos conceptos, a continuación se van a definir algunos:

Paralelismo se refiere a la facultad de una computadora multi-procesador para realizar varios procesos en forma simultánea. Por otro lado, la concurrencia se refiere a la facultad de una computadora con uno a más procesadores para realizar varias tareas en el mismo intervalo de tiempo ya sea de forma simultánea o aparentando paralelismo. 

Supongamos que tenemos una computadora con un solo procesador y queremos correr 2 procesos al mismo tiempo. Debido a que solo es un procesador, no le es posible correr 2 procesos en forma simultánea, pero aparenta hacerlo porque dedica tiempo a un proceso a uno y después pasa a dedicarle tiempo al otro proceso, esto lo hace tan rápido que para el usuario, los 2 procesos están corriendo al mismo tiempo, aunque no sea así (secuencial). Ahora, si tenemos una computadora con 2 procesadores y queremos correr 2 procesos de forma simultánea, esto es posible si se asigna un procesador a cada proceso, resultando en paralelismo verdadero. Ambas computadoras son multi-proceso porque corren los procesos en forma concurrente.

Por otro lado, un proceso se puede dividir en sub-procesos más pequeños llamados hilos o threads. Cada proceso consiste de al menos un hilo (llamémosle el hilo principal). Cuando un proceso es capaz de correr más de un hilo se dice que es multi-hilo o multi-thread. Esto podría ser un poco confuso porque a un proceso se le puede llamar también un hilo cuando tiene solo uno.

Retomando el ejemplo de las 2 computadoras, supongamos que se desarrolló una aplicación multi-hilo
(2 procesos con 2 ilos cada uno). La computadora con un solo procesador dedicaría tiempo para los 4 hilos, alternando recursos para cada uno, dando así la impresión de que se están corriendo en paralelo aunque no sea así. La computadora con 2 procesadores podría correr un proceso por procesador y cada procesador podría correr 2 hilos alternando tiempo para cada uno. Ambas computadoras son concurrentes, ambas son multi-hilo y multi proceso, pero solo la última corre 2 procesos en paralelo.

La principal razón para paralelizar un programa es para reducir su tiempo de ejecución. Hipotéticamente digamos que tenemos un programa secuencial, el cual queremos que corra más rápido sin modificar su código fuente. Para esto, se necesitaría aumentar la frecuencia del reloj del procesador y suministrar más energía, En la práctica esto no es viable, debido a que, al incrementar la energía de forma indefinida, también aumenta el calor producido en el circuito, pudiendo provocar un sobrecalentamiento que dañaría el procesador.

En la actualidad los fabricantes optan por incluir más procesadores en lugar de incrementar la velocidad de uno solo. Esto lleva a la necesidad de dividir en partes el programa, aunque en la gran mayoría, existen partes del programa que deben correr en serie forzosamente. Eugenie Amdhal postuló en 1960 la ley que lleva su nombre, donde indica que el total de ganancia de rendimiento de un programa, se limita por la porción del programa que puede ser paralelizada. De esto podemos deducir que, el hecho de contar con varios procesadores no significa necesariamente que un programa pueda correr más rápido.

Existen otros aspectos a considerar a la hora de paralelizar un programa. Los procesos tienen su sector de memoria asignada para cada uno, por lo que la comunicación ente procesos conlleva a un movimiento considerable de datos que podría reducir la velocidad de ejecución ganada. Los sub-procesos comparten el mismo sector en memoria, por lo que se deben sincronizar para acceder a los datos en memoria de forma intercalada en modo lectura o escritura para evitar la corrupción de datos (véase Mutex y semaforos).

Se aconseja usar paralelismo solo cuando se deben procesar grandes cantidades de datos, y se disponga de varios procesadores. Por su parte, se aconseja usar usar multi-hilo en un proceso donde los sub-procesos no traten con grandes cantidades de datos (procesos pequeños).Una aplicación de proceso multi-hilo podría ser: correr un sub-proceso tardado, mientras otro hilo se encarga de mantener la interfase gráfica respondiendo a la interacción de usuario sin bloquearse o congelarse.

Aun con esto, se debe cuantizar la ganancia o pérdida de velocidad, haciendo varias implementaciones del mismo programa y valorar si es viable paralelizar o hacer multi-hilo nuestra aplicación.

No hay comentarios.:

Publicar un comentario