Inicio > Sistemas Operativos > Concurrencia vs Paralelísmo

Concurrencia vs Paralelísmo

En la vida de todo programador siempre llega el momento en que es necesario hacer uso de la programación concurrente y/o parelela, en donde es necesario, dada una cierta clase de problemas, ejecutar dos o mas tareas o procesos de forma casi, o en algunos casos, totalmente independiente.

Supongamos que, no sé si la mayoría sabe de qué se trata un WhoIs, pero bueno, en pocas palabras un WhoIs es una simple aplicación que verifica la disponibilidad de un nombre de dominio cualquiera. La mayoría de las empresas de Hosting ofrecen este servicio, de manera tal que cuando un cliente decide comprar un determinado plan de hosting, puede a su vez verificar si su nombre de dominio preferido está disponible o no, y hacer todo esto en el mismo paso de compra.

En los sistemas UNIX, por ejemplo en Linux, cualquiera sea la distribución, supongamos Ubuntu, existe un comando precisamente llamado whois, que permite hacer este tipo de consulta de nombre de dominio y alguna que otra cosa más, en fin, el tema es que si necesitamos hacer un WhoIs y contamos con un servidor, o una cuenta en un servidor con sistema operativo Linux, en principio podemos hacer uso de este comando (para ver más, pueden buscar en las páginas del manual de Linux, el “man”, escribiendo en la línea de comandos del shell que estén utilizando, el comando man whois).

Entonces, a qué va todo esto?. Pensemos en una simple aplicación Web, con un formulario HTML que tenga un campo de texto y un botón de tipo submit, y detrás un script (ya sea en PHP, Python, Perl, etc.) del lado del servidor, que mediante la validación correspondiente sobre los datos enviados realice esta consulta, y que luego muestre los resultados. Hasta aquí la tarea es simple, pero resulta que quiero darle más opciones al cliente, quiero que cuando busque un determinado dominio, se le den ciertas alternativas, para que en caso de no haber disponibilidad, este tenga diferentes opciones de disponibilidad de ese mismo dominio en otra extensión o TLD.

Ya en este caso, nuestro supuesto script va a necesitar ser modificado para que pueda realizar N consultas, una para el TLD que ingresó el cliente, y otras N-1 más para las restantes que se le mostrarán como opción. Entonces, suponiendo que la consulta para un único dominio, se demora unos 3 o 4 segundos, dependiendo del estado de la red, y teniendo en cuenta que se pudo establecer conexión con el servidor de WhoIs, y que además no hubo ningún error en el medio, esto mismo, en un esquema de ejecución secuencial, andaria por los 3 o 4 segundos para cada consulta, que multiplicado por la cantidad de TLD que deseo buscar, suponiendo 10 TLD, ya andaríamos por los 30 o 40 segundos.

Y entonces?, que pasó?, esto es mucho o poco?. Y… hoy en día hacer esperar a un cliente más de 10 segundos por la respuesta de un formulario, es sinónimo de que cerró la ventana o se fue a otra página por que se aburrió esperando😦

Pero… entonces, que pasaría si pudiese ejecutar de forma concurrente esas consultas o requests?, y… automáticamente aprovecharía más los recursos, y en el tiempo en que el script espera a la respuesta de la consulta, puede ir haciendo las demás, y así solapar consultas y ahorrar mucho tiempo, esto no quiere decir que vaya a tardar lo que una única consulta, pero lo que sí significa es que se va a ahorrar muchisimo tiempo, de seguro mucho más que en el caso secuencial. De esta forma no aburriría a los usuarios mientras esperan la respuesta del WhoIs😀

Casos como este, hay muchísimos, la mayoría de las tareas que exigen una espera ya sea sincrónica (por un tiempo definido) o asincrónica (por un tiempo indefinido), son posibles de separar de forma de ahorrar tiempo y aprovechar mejor los recursos de los que disponemos, y este es un poco el principio de la programación concurrente, arma poderosísima que hoy en día utilizan los programadores para hacer sus aplicaciones más robustas, y con un mejor aprovechamiento de los recursos de los que disponen, más aún con el Boom de los procesadores de varios núcleos, en donde en cierto modo es posible paralelizar literalmente tareas/procesos.

Como verán, hice diferencia acerca de tareas/procesos concurrentes y tareas/procesos paralelos. Cúal es la diferencia entre ambos?, es muy simple, hacer algo de forma concurrente, implica realizar un poco de cada tarea de forma tal que parezca que se realizan a la vez, este principio básicamente es el que usan los sistemas operativos que sólo cuentan con un único procesador, tratan de administrar las tareas de forma tal que parezca que se ejecutan a la vez. En cambio, cuando hay más de un procesador presente, los sistemas operativos modernos, se dan cuenta de esto, y en algunos casos, en donde es posible, ejecutan tareas en paralelo, es decir, realmente de forma simultánea. Esta en principio es la diferencia fundamental entre concurrencia y paralelismo.

Bueno, espero que les haya resultado interesante el tema. Esto sigue con la presentación de los Threads o Hilos, y su comparación con los Procesos. ¿Qué son?. ¿Qué diferencias hay entre usar Threads o Procesos para agilizar las cosas?. ¿En qué casos es más conveniente hacer uso de uno, o el otro o ambos?.

Hasta el próximo Post =)

Javier.

  1. anonimated
    9 marzo 2013 a las 5:33 PM

    Felicito y doy reconocimiento a tu información😀 , realmente buena y clara!

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: