¿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