Multihilos y Programación Asíncrona

18 02 2009

Las aplicaciones que trabajan con multihilos son aquellas que dividen su carga de trabajo en diversos Hilos o unidades de ejecución. Una razón para esto es la simplificación del diseño. Multi-hilos permite para permitir una fuerte cohesión entre tareas, significando que cada clase de hilo capturará un simple abstracción o idea. Este diseño produce una estrategia llamada divide-and-conquer (dividir y reducir) en lo cual sistemas grandes y complejos son divididos entre más unidades manejables, resultando un sistema con menos costo en la construcción y mantenimiento. La introducción de múltiples hilos también produce beneficios tanto como incrementar concurrencia, mejorar la interacción con el usuario y más eficiencia en el uso de la CPU.

Un poco más de Conceptos..

¿Cómo trabaja mi PC?

Los sistemas operativos utilizan procesos para independizar las diferentes aplicaciones que ejecutan. Los subprocesos son la unidad básica a la que el sistema operativo asigna tiempo de procesador. Puede que haya más de un subproceso ejecutando código dentro del proceso. Cada subproceso mantiene controladores de excepciones, una prioridad de programación y un conjunto de estructuras que el sistema utiliza para guardar el contexto del subproceso hasta que se programe. El contexto del subproceso incluye, el espacio de direcciones del proceso host del subproceso, toda la información que necesita éste para reanudar sin problemas la ejecución, como el conjunto de registros de la CPU y la pila.

¿Qué papel juega .NET Framework?

.NET Framework subdivide un proceso de sistema operativo en pequeños subprocesos administrados, denominados dominios de aplicación y representados por AppDomain. Dentro del mismo proceso administrado se pueden ejecutar uno o varios subprocesos administrados (representados por System.Threading.Thread) en uno o varios dominios de aplicación. Aunque cada dominio de aplicación se inicia con un único subproceso, su código puede crear otros dominios de aplicación y subprocesos adicionales. El resultado es que un subproceso administrado puede moverse libremente entre dominios de aplicación dentro del mismo proceso administrado; podría tener sólo un subproceso que se moviera entre varios dominios de aplicación.

Un sistema operativo que admita multitareas prioritarias crea el efecto de ejecución simultánea de varios subprocesos desde varios procesos. Para ello, se divide el tiempo de procesador disponible entre los subprocesos que lo necesitan y se asigna un espacio de tiempo de procesador a cada subproceso, uno tras otro. Cuando trascurre su espacio de tiempo, el subproceso que se esté ejecutando actualmente se suspende y otro subproceso reanuda su ejecución. Cuando el sistema cambia de un subproceso a otro, guarda el contexto del subproceso prioritario y vuelve a cargar el contexto de subproceso guardado del siguiente subproceso de la cola.

Desventajas del uso de varios subprocesos

Se recomienda utilizar el menor número de subprocesos posible, puesto que de este modo se reduce el uso de recursos del sistema operativo y se mejora el rendimiento. Al diseñar la aplicación, el subprocesamiento debe tener en cuenta los requisitos de recursos y conflictos potenciales.

Los requisitos de recursos son los siguientes:

  1. El sistema utiliza memoria para la información de contexto requerida por los procesos, objetos AppDomain y subprocesos. Por tanto, el número de procesos, objetos AppDomain y subprocesos que se pueden crear está limitado por la memoria disponible.
  2. Si se realiza un seguimiento de un gran número de subprocesos, se utiliza una gran cantidad de tiempo de procesador. Si hay demasiados subprocesos, la mayoría no avanzarán de forma significativa.
  3. Si la mayor parte de los subprocesos actuales pertenecen a un proceso, los subprocesos de otros procesos se programan con menor frecuencia.
  4. El control de la ejecución del código con muchos subprocesos es complejo y puede constituir una fuente de muchos errores.
  5. Para destruir los subprocesos es necesario conocer lo que podría suceder y controlar dichos problemas.
  6. Si se proporciona acceso compartido a los recursos, se pueden producir conflictos. Para evitar los conflictos, es necesario sincronizar o controlar el acceso a los recursos compartidos. Si no se sincroniza el acceso correctamente (en los mismos dominios de aplicación o en otros) se pueden producir problemas como interbloqueos (en los que dos subprocesos dejan de responder mientras cada uno espera a que el otro se complete) y condiciones de anticipación (cuando se produce un resultado anómalo debido a una dependencia decisiva e inesperada de la duración de dos eventos). El sistema proporciona objetos de sincronización que pueden utilizarse para coordinar recursos compartidos entre varios subprocesos. Si se reduce el número de subprocesos, se facilita la sincronización de los recursos.

Entre los recursos que requieren sincronización se incluyen los siguientes:

  1. Recursos del sistema (como puertos de comunicaciones).
  2. Recursos compartidos por varios procesadores (como identificadores de archivo).
  3. Los recursos de un único dominio de aplicación (como campos globales, estáticos y de instancia) a los que tienen acceso varios subprocesos.

Demostración de Creación un Hilo Parte I:

2/15/2009, 8:00 PM

Esta demostración veremos lo simple como se puede crear Hilos y lo que debemos de tener en cuenta para ello.

Para iniciar iniciamos nuestro Visual Studio y creamos nuestro proyecto:

Cuando creamos nuestro proyecto, visual estudio nos crea un archivo llamado Program.cs (cs = el lenguaje con el que se va ha trabaja es el C#), donde se genera por defecto el siguiente código:

clip_image001

Los pasos de creación de la demos es la siguiente:

  1. Como podemos observar no incluye el namespace System.Threading,que es con el trabajaremos todo que tenga que ver con multihilos y programación asíncrona. Por lo anterior lo primero que debemos que hacer es agregar el siguiente código para agregar dicho namespace. using System.Threading;
  2. Crearemos un método llamado TrabajandoMultihilos, donde en este caso nos mostrará en pantalla un mensaje "Estamos Utilizando Multihilos".
  3. ThreadStart es el delegado que utilizaremos en el momento de creación de un Hilo, para indicar el método que el hilo deberá de llamar en el momento de trabajar (la acción o tarea que realizar el hilo).
  4. Crearemos unos mensajes usando console.WriteLine, para indicar cada una de las faces de creación y ejecución.
  5. Creamos elHilo NuestroHilo y lo relacionaremos con el delegado que hemos creado. Él codigo que nos resultará es el siguiente:

clip_image001[5]

y el Resultado que obtenemos es el siguiente:

clip_image001[8]

Descarga el código de la demo aqui:

http://www.4shared.com/file/88283184/108bb6a5/IntroduccionHilos.html

En las proximas post vamos a profundizar mucho más este tema.

Saludos,

clip_image001[10]



Acciones

Información

Deja un comentario