miércoles, 9 de mayo de 2012

Procesos, Hilos (Threads- Subproceso), MultiHilos (MultiThreads)

 

Buen dia para todos, con el fin de continuar la serie de blogs de hilos y paralelismo a continuación quiero compartir con ustedes algunas definiciones importantes antes de iniciar con el tema de computación en paralelo, definiciones básicas como que es un proceso?, diferencia entre hilos y multihilos, y finalmente algunas de las funcionalidades que trae el Framework de .Net para la gestión y manejo de hilos.

Procesos.

Un hilo representa básicamente una acción de un programa, un proceso en si mismo no hace nada, en su lugar hospeda los recursos consumidos de la aplicación que se esta ejecutando, tal como el head y la pila de memoria en otras palabras proporciona los recursos necesario para que un programa pueda ejecutarse.

Un proceso contiene un espacio de memoria virtual, código, ejecutable, un contexto de seguridad, un identificador de proceso único, variables de entorno, y al menos un thread de ejecución.

Cada proceso se inicia con un único thread, a menudo llamado thread principal, pero puede crear threads adicionales. (Ver Ilustración 1)

clip_image002

Ilustración 1

Threads

Un hilo es una posible forma de ejecutar un programa, además es la entidad dentro de un proceso que realmente ejecuta el código contenido en el proceso.

Es importante tener en cuenta que todos los threads de un proceso comparten los recursos y memoria virtual de proceso, cada Thread mantiene los controladores de excepciones, una prioridad de programación, almacenamiento local y un identificador de Thread Único.

Un proceso puede contener uno o mas Threads, a mas threads tenga un proceso va a dar la sensación de que dicho proceso esta ejecutando varias tareas al mismo tiempo. (Ver Ilustración 2).

clip_image004

Ilustración 2

A continuación presentamos un ejercicio sencillo en donde se puede visualizar como se crea un hilo en C# y como interactúa un hilo principal y un hilo secudario.

   

   1:  using System;
   2:  using System.Threading;
   3:   
   4:  namespace Hilos1
   5:  {
   6:      class Program
   7:      {
   8:          static void Main(string[] args)
   9:          {
  10:              Thread t = new Thread(HiloSecundario);
  11:              t.Start();
  12:              while (true)
  13:                  //Hilo principal
  14:                  Console.Write("1");
  15:          }
  16:   
  17:          static void HiloSecundario()
  18:          {
  19:              //Escribe y indefinidamente
  20:              while (true)
  21:                  Console.Write("2"); 
  22:          }
  23:   
  24:      }

25: }

clip_image006




En este ejercicio el hilo principal crea un nuevo hilo llamado t el cual ejecuta un método llamado hilosecundario, sobre el cual se ejecuta la impresión del numero 2, simultáneamente el hilo principal imprime el numero 1. EL CLR asigna a cada hilo su propia pila de memoria para que las variables locales se mantengan de forma separada.

 

MultiThread


Una de las características innovadoras e interesantes es la incorporación de la programación multihilo (MultiThreading) . Cuando se ejecuta una aplicación que Multihilo, cada hilo ejecuta funciones de forma separada, y podemos afirmar que el multithreading es una forma especializada de la multitarea.

En la siguiente grafica podemos visualizar como funcionan las aplicaciones MultiHilo, las cuales permiten realizar tareas asíncronas “al mismo tiempo”, aunque realmente no es asi. Por ejemplo para el proceso de paint el sistema operativo le sede el control al hilo 1 de paint , y luego sede el control al siguiente Thread y asi sucesivamente.

clip_image008


Según la grafica el primer proceso ha tenido mucho mas tiempo de CPU que el resto de los procesos, lo que puede indicar que el proceso de paint ha hecho mas cosas en el mismo tiempo que los demás procesos. Sin embargo como solo tenemos un solo Core , sencillamente cada hilo se va a ejecutar de uno en uno, cada Threads.

Multithreading es manejado internamente por un programador de hilos (Thread scheduler), una función típica del CLR es delegarlo al sistema operativo. Un programador de hilos (Thread scheduler) asegura que todos los hilos activos sean asignados apropiadamente en tiempo de ejecución, y que los hilos que se encuentran en espera o bloqueados no consuman tiempo de CPU.

En un equipo con un solo núcleo el programador de hilos, hace que se conmuten los hilos activos, realizando una especie de multiplexacion, en un equipo con Windows el tiempo de conmutación entre hilos es de aproximadamente 10 ms.


A medida que se aumentan lo core en el hardware, lo que produce es que cada un hilo puede ejecutarse de forma paralela, ya que un hilo podrá ejecutarse en un procesador y el otro hilo en el otro procesador, lo que conlleva a que exista paralelismo. Solo puede existir paralelismo cuando existe mas de un core en el hardware.

clip_image010


,

Es importante conocer que actualmente existen dos tipos distintos de multitarea:


a) Basada en Procesos.

b) Basada en la ejecución de Hilos (Subprocesos).


A continuación presento a ustedes alguna de las diferencias de multitarea basada en proceso y basada en hilos (Threads - Subproceso).

La multitarea basada en procesos se encarga de la ejecución concurrente de los programas, mientras que la multitarea basado en hilos realiza acuerdos para la ejecución simultánea de las partes de un mismo programa.

Basado en procesos: Ejemplo - procesador de textos corriendo al mismo tiempo que se navega por la red.

Basado en Hilos (Subproceso): en un programa como Paint se puede dar formato a un color de un dibujo, al mismo tiempo que se está imprimiendo.

La diferencia clave es que los procesos están completamente aislados unos de otros, los hilos comparten el head de memoria con otros hilos que se ejecutan sobre la misma aplicacion. Esto es lo que hace que los hilos sean útiles : un hilo se puede ir a buscar los datos en segundo plano, mientras que otro hilo muestra los datos a medida que van llegando.



Importante tener en cuenta: Las aplicaciones paralelas son concurrentes, pero no toda aplicación concurrente es paralela.

El Framework de .Net trae consigo la funcionalidad de poder gestionar los hilos con la librería using System.Threading, y define dos tipos de hilos, Primer plano. (Foreground), Segundo plano. (BackGround). De forma predeterminada cuando se crea un hilo, se trata de un subproceso de primer plano, pero se puede cambiar a un subproceso en segundo plano. La única diferencia entre un hilo primer plano y el hilo de segundo plano, es que un hilo de segundo plano se cancelará automáticamente cuando todos los Hilos en primer plano son detenidos en su proceso.

Todos los procesos tienen al menos un hilo de ejecución, generalmente se llama el hilo principal, ya que es el que se ejecuta cuando el programa comienza. Desde el hilo principal se pueden crear otros hilos.

5 comentarios: