Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre el tema que mas lidiaremos.

Anuncios

Un thread es una sección de código en el ámbito de un proceso que puede ser programado por el programador del sistema operativo.

Grigoryan, Wu
Anuncios
Anuncios

En el post anterior mencionamos que un proceso es una imagen del programa corriendo, y administrar proyectos multi-procesos a traves de IPC es mucho mas dificil y en algunos momentos completamente inutil comparandolas con proyectos que aprovechan el multi-threading. Sabemos que los programas deben lidiar con datos, ya sea accediendo, procesando y actualizandolos mediante funciones que pueden ser metodos en objetos o funciones libres pero todos para producir un resultado. Y los programas corren miles de funciones y objetos, y estos a su vez contienen instrucciones que estan envueltas bajo otros nombres que se usan para ser invocados por otras funciones. El objetivo de multithreading es correr estas funciones simultaneamente para mejorar la performance.

Anuncios

Tomemos el siguiente codigo como ejemplo:

void procesar_vector(const std::vector<int>& vec) 
{
 // calcula la suma de todos los valores y lo muestra
}

int main()
{
 std::vector<int> vec1{1, 2, 3, 4, 5};
 std::vector<int> vec2{6, 7, 8, 9, 10};
 std::vector<int> vec3{11, 12, 13, 14, 15};
 procesar_vector(vec1); 
 procesar_vector(vec2); 
 procesar_vector(vec3); 
}
Anuncios
Anuncios

Tenemos una funcion llamada procesar_vector la cual recibe un vector, esta se encarga ded tomar todos los valores en el mismo y los suma entre si para finalmente mostrar el resultado. En el main, creamos tres vectores con distintos valores para luego hacer tres llamados a la funcion y le pasamos cada uno de los vectores anteriores. Cada uno de ellos se ejecutara de manera secuencial y nos llevara una cantidad de tiempo procesarla. Si tuvieramos una forma de poder correrlas simultaneamente, en lugar de tener tres tiempos de espera, solo tendriamos uno solo y esto mejoraria la performance del programa.

Anuncios
Anuncios

Los threads son la manera exacta para correr tareas simultaneamente, entiendase por tareas a las funciones, y nuevamente cuando hablamos de threads corriendo simultaneamente tambien debemos considerar a context switching del cual hablamos en el post anterior sobre procesos. Cada proceso posee un thread, usualmente denominada como main thread, pero puede poseer mas threads y esto es lo denominaado como multithreading. Si bien los threads pueden correr por separado unos de otros comparten los mismos recursos del procesos porque todos estan sobre el mismo. Los procesos ocupan hardware y recursos de software tales como registros del CPU, y segmentos de memoria (tales como el stack y el heap). Si bien estos no son compartidos entre procesos, los threads si podran acceder a los mismos. Sin embargo, los threads no comparten su porcion del stack entre ellos.

Anuncios
Anuncios

Esto es debido a que los threads son funciones y las mismas solo deben tener acceso al stack para administrar el ciclo de vida de sus argumentos y variables locales. Y si bien cada thread mantiene sus limites con respecto a los otros, podemos pasar informacion de un thread a otro (por valor o referencia) pero es propenso a errores. Tomemos el caso anterior donde realizamos tres llamados a la funcion procesar_vector, imaginemos que corremos a cada uno en su respectivo thread donde copiara las variables pero no las instrucciones y cada uno correra por separado. Podemos decir que la misma funcion sera copiada como tres diferentes imagenes, cada una corre de manera independiente, y poseen su propio stack.

Anuncios
Anuncios

Si bien cada thread posee su stack, todos comparten el mismo heap. Y tal como sucede con los procesos, los threads que corren simultaneamente no necesariamente lo hacen en paralelo. Cada thread consigue una pequeña porcion del tiempo de la CPU para correrlo, y este quedara a la espera para intercambiar de un thread a otro. Cada estado de thread pausado debera ser almacenado en alguna parte para ser recuperado luego cuando lo retomemos. Aqui entra nuevamente la estructura interna del CPU, la cual define si threads podrian verdaderamente correr en paralelo, porque el numero de nucleos define la cantidad de threads que pueden correr paralelamente. Pero proximamente hablaremos sobre los inconvenientes que pueden ocurrirnos por trabajar con multithreading.

Anuncios

En resumen, hoy hemos visto a threads teoricamente, como trabaja, como se comporta, donde convive, asi como otras caracteristicas. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donation

It’s for maintenance of the site, thanks!

$1.50