Para comprender mejor el tema de programación concurrente es necesario conocer y dominar dos conceptos claves, me refiero a threads y procesos, conceptos que en primera instancias puede ser algo complejos de comprender y que sin duda, a más de uno le han causado dolores de cabeza. Es por ello que en esta ocasión me gustaría que habláramos sobre ellos, explicando qué son, en que son similares y por supuesto, en que son diferentes.
Si aún no te queda claro que es la programación concurrente, no te preocupes, tenemos un post donde te lo explicamos en detalle, te invito a que te des un vuelta por él. 😉
Bien, sin más dilación que les parece si comenzamos.
Procesos
Comencemos con lo más sencillo, bueno, más o menos. ¿Qué es un Proceso?
En términos simples un proceso no es más que la instancia de un programa. Verás, cuando tú abres cualquier programa en tu dispositivo, por ejemplo, tu navegador web, quizás google chrome, internamente estás creando un nuevo proceso. 😎
Un proceso no será más que la ejecución del programa mismo. Y ojo, no hay que confundir un proceso con un programa ya que son entidades completamente diferentes. Podemos ver a un programa como un conjunto de instrucciones y de datos, por otro lado, podemos ver a un proceso como la ejecución de esas instrucciones junto con esos datos. Una muy buena analogía es ver a un programa como la receta para preparar un platillo, ya que en una receta se establecen todos los ingredientes a utilizar junto con los pasos a seguir; en cambio, un proceso podemos verlo como la ejecución de esa receta, algo que se está realizando.
Puede quedarnos más en claro si consideramos que un mismo programa puede ser ejecutado múltiples veces por nuestro sistema operativo. Siguiendo con la analogía, una misma recete puede ser implementada por n chefs. 👨🍳
En la siguiente imagen podemos observar tres procesos diferentes del mismo programa.
Dentro de un proceso encontraremos todo lo necesario para que el programa se ejecute de forma correcta, me refiero a código fuente, ficheros, variables, tareas, sub-procesos etc...
Otra entidad importante para comprender mejor el tema de procesos es sin duda el sistema operativo. El sistema operativo será quien cree, ejecute y controle todos los procesos.
Una de las tareas del sistema operativo es aislar a cada uno de los procesos entre sí, de tal forma que los procesos sean completamente independientes unos de otros; esto con la finalidad prevenir que compartan información entre ellos, lo cual pueda dar pie a errores. Es por ello que en esencia, lo programas no pueden acceder a la información y datos de otros programa en ejecución.
Cuando un proceso finaliza, ya sea de forma natural o no, quizás por algún error, será el sistema operativo el encargado de liberar el espacio en memoria.
Podemos ver al sistema operativo como un maestro de ceremonias, quien está al pendiente de todos los procesos, desde su creación, ejecución y finalización.
Si utilizas un sistema operativo basado en unix, por ejemplo, fedora, puedes ejecutar en tu terminal el comando top, el cual listará todos los procesos en ejecución de tu sistema, de esta forma podrás obtener información de ellos.
Con los procesos es posible implementar el paralelismo, ejecutando diferentes procesos en diferentes procesadores, claro, tambíen depende de cuantos procesadores posea el equipo de computo. 😎
Para que un proceso pueda ser ejecutado este necesita poseer por lo menos un thread, a este thread lo vamos a conocer como el thread principal, o, el main thread.
Threads
Bien, ya sabemos que es un proceso, ahora hablemos de los Threads, un concepto un poco más sencillo de comprender.
Varás, los Threads, también conocidos como sub-procesos o hilos, podemos definirlos como una secuencia de instrucciones las cuales el sistema operativo puede programar para su ejecucción. A diferencia de un proceso, los threads son entidades mucho más pequeñas, lo cual los hace fácilles de gestionar, tanto es así que un thread es la unidad más pequeña a la cual un procesador puede asignar tiempo.
A diferencias de los procesos, los cuales viven dentro del sistema operativo, los threads viven dentro de los procesos. Un thread se crean, ejecutan y finalizan dentro de un proceso, dicho en otras palabras: Un thread le pertenece a un proceso, y, asu vez, un proceso puede poseer múltiples threads. Si lo vemos en términos de base de datos pudiésemos decir que esta es una relación uno a muchos. 😛
Algo interesante a mencionar es que debido a que los Thread existen dentro de los procesos, estos pueden compartir información entre ellos; Algo a lo cual sin duda le podemos sacar mucho provecho, pero, que también puede llegar hacer complicado de manejar. 😲 Uno de los problemas más comunes al momento de trabajar con Threads tiene por nombre Race condition, y es, en esencia, un problema que surge cuando más de un thread intenta acceder y modificar un espacio en memoria compartido, ocasionando que el programa se comporte de forma inadecuada.
Visto de otra forma, un thread no es más que un proceso, pero en pequeño, al igual de un proceso un thread se ejecuta dentro de un contexto y posee instrucciónes a realizar 👻
Conclusión
En conclusión, un proceso no es más que la instancia de un programa, el cual es creado y controlado por el sistema operativo. Los procesos son entidades independientes y no pueden compartir información entre ellos. Para que un proceso pueda ser ejecutado es necesario que este posea por lo menos un thread.
Por otro lado, un thread es la unidad más pequeña a la cual un procesador puede asignar tiempo. Los threads poseerán la secuencia más pequeña de instrucciones a ejecutar. Los threads se crean, ejecutan y mueren dentro de los procesos, siendo capaces de compartir información entre ellos.
Con los threads y los procesos seremos capaces de implementar la programación concurrente, y, dependiendo de la cantidad de procesadores la programación en paralelo.
-
check_circle_outlineMódulo 1 | 32 clases
Introducción
expand_more-
done_all
Clase 1
Introducción
-
done_all
Clase 2
¿Qué es la programación concurrente?
-
done_all
Clase 3
Threads y Procesos
-
done_all
Clase 4
Creación de threads
-
done_all
Clase 5
Múltiples threads
-
done_all
Clase 6
Módulo logging
-
done_all
Clase 7
Thread principal
-
done_all
Clase 8
Dormir a un thread
-
done_all
Clase 9
Callbacks
-
done_all
Clase 10
Programar callbacks
-
done_all
Clase 11
Futuros
-
done_all
Clase 12
Futuros pt2
-
done_all
Clase 13
Método Join
-
done_all
Clase 14
Demonios
-
done_all
Clase 15
Demonios pt2
-
done_all
Clase 16
Módulo threading
-
done_all
Clase 17
Clase Thread
-
done_all
Clase 18
Problema Race condition
-
done_all
Clase 19
Lock
-
done_all
Clase 20
Lock pt2
-
done_all
Clase 21
RLock
-
done_all
Clase 22
Eventos
-
done_all
Clase 23
Eventos pt2
-
done_all
Clase 24
Colas
-
done_all
Clase 25
Problema Productor y consumidor
-
done_all
Clase 26
Pool de threads
-
done_all
Clase 27
Pool bajo contexto
-
done_all
Clase 28
Futuros y pool
-
done_all
Clase 29
Multiples tareas
-
done_all
Clase 30
Tareas completadas
-
done_all
Clase 31
Método map
-
done_all
Clase 32
¿Qué es el GIL en Python?
-
-
check_circle_outlineMódulo 2 | 15 clases
Procesos
expand_more