miércoles, 14 de marzo de 2012

4.1 CONCEPTO HILO

INSTITUTO TECNOLÓGICO DE CERRO AZUL
ITCA

UNIDAD IV
PROGRAMACIÓN CONCURRENTE (MULTIHILOS)

PRESENTAN


ANAISA MARTINEZ DE LA CRUZ
EUNICE AGUIRRE CÁRDENAS
AIDE DIEGO BAUTISTA
NANCY MARLENE HERNANDEZ ROSAS
IMELDA GARCÍA HERNANDEZ


ING: MARÍA ALEJANDRA ROSAS TORO




ESPECIALIDAD:
INGENIERÍA EN SISTEMAS COMPUTACIONALES




CERRO AZUL, VERACRUZ, MÉXICO.


4.1 CONCEPTOS DE HILO


Hilo (theread) llamado también proceso ligero o subproceso, es la unidad de ejecución de un proceso y esta asociado con una secuencia de instrucciones un conjunto de registros y una pila. Cuando se crea un proceso el S.O crea su primer hilo (hilo primario) en la cual puede,a su vez,crear hilos adicionales. esto pone de manifiesto que un proceso no ejecuta,si no que es sólo el espacio de direcciones donde recide el código que es ejecutado mediante uno o más hilos.

En un S.O tradicional. Cada proceso tiene un espacio de direcciones y un único hilo  de control por ejemplo, considere que un programa que incluya la siguiente secuencia de operaciones para actualizar el saldo de una cuenta bancaria cuando se efectúa un nuevo ingreso:
Saldo=Cuenta.ObtenerSaldo ();
Saldo+=ingreso; 
Cuenta.EstablecerSaldo (saldo);
Este modelo de programación, en el que se ejecuta un solo hilo, es en el que estamos acostumbrados a trabajar habitualmente. Pero, siguiendo con el ejemplo anterior piensa en un banco real; en el varios cajeros pueden actuar simultáneamente. Ejecutar el mismo programa por cada uno de los cajeros tiene un costo elevado (recuerde los recursos que necesita). En cambio si el programa permitiera lanzar un hilo por cada petición de cada cajero para actualizar una cuenta, estaríamos en el caso múltiples hilos ejecutandose concurrente mente (multitriandi) . Esta característica ya es una realidad en los S.O modernos de hoy y como consecuencia contemplada en los lenguajes de programación actuales.

Cada hilo se ejecuta de forma estrictamente secuencial y tiene su propia pila en estados de los registros de UCP y su propio contador de un programa en cambio comparte el mismo espacio de direcciones, lo que significa compartir también las mismas variables globales, el mismo conjunto de ficheros abiertos, procesos hijos (no hilos hijos), señales, semáforos, etc.
Los hilos comparten la UCP de la misma forma que lo hacen los procesos pueden crear hilos hijos y se pueden bloquear no obstante mientras un hilo del mismo proceso, en el caso de hilos soportados por el kernel (núcleo del S.O: programas en ejecución que hacen que el sistema funcione), no sucediendo lo mismo  con los hilos soportados por una aplicación por ejemplo en Windows NT todos los hilos son soportados por el Kernel; imaginemos que alguien llaga a un cajero para depositar dinero en una cuenta y casi al mismo tiempo un segundo cliente realiza la misma operación sobre la misma cuanta en el segundo cajero quedara bloqueado asta que el registro que esta siendo actualizado por el primer cajero quede liberado.

   ESTADOS DE UN HILO

Igual  que los procesos con un solo hilo de control, los hilos pueden encontrarse en unos de los siguientes estados.
  • NUEVO.- El hilo ha sido creado pero aun no ha sido activado. Cuando se active pasará al estado preparado.  
  • PREPARADO.- El hilo está activado y le ha sido asignada la UCP.
  • EN EJECUCIÓN.- El hilo está activo y le ha sido asignada la UCP(solo hilo activos  preparados solo pueden ser ejecutados).
  • BLOQUEADO.- El hilo espera que otro elimine el bloqueo de un hilo bloqueado.
  • DORMIDO. -El  hilo está bloqueado durante una cantidad de tiempo determinada después de la cual despertará y pasará al estado preparado.
  • ESPERANDO.-El hilo está esperando que ocurra alguna cosa:una condicion,una operación de E/S o adquirir la propiedad de un objeto sincronismo.Cuando ocurra, pasará al estado preparado.
  • MUERTO.-El hilo ha finalizado (está muerto)  pero todavía no ha sido recogido por  su padre.Los hilos muertos no pueden alcanzar ningún otro estado.

Descrito en lo anterior no se muestra los estados nuevo y muerto ya que no hay estados de transición durante la vida del hilo; esto es,no se puede transitar al estado nuevo ni desde  el estado muerto.

La transición entre estados está controlada por un planificador: parte del núcleo del sistema operativo encargada que todos los hilos que esperan ejecutarse tengan su oportunidad.Si un hilo en ejecución no puede continuar pasará al estado bloqueado; o también, si puede continuar y el planificador decide que ya ha sido ejecutado el tiempo suficiente,pasará al estado preparado.Si el proceso está bloqueado pasará a preparado cuando se dé el evento por el que espera; puede estar esperando a que otro hilo elimine el bloqueo,o bien si está dormido,esperará a que pase el tiempo por el que fue enviado a este estado para ser activado; y si está preparado pasará a ejecución cuando el planificador lo decida porque los demás hilos ya han tenido su parte de tiempo de UCP.



    CUANDO SE DEBE CREAR UN HILO

    Según lo expuesto anteriormente,cada vez que se crea un proceso, el S.O crea un hilo primario.Para muchos procesos éste es el único hilo necesario.
    Sin embargo,un proceso puede crear otros hilos para ayudarse en su trabajo,utilizando la UCP al máximo posible.Por ejemplo supongamos el diseño de una aplicación procesador de texto.¿sería asertado crear un hilo separado para manipular cualquier tarea de impresión? Este permitiría al usuario continuar utilizando la aplicación mientras se está imprimiendo el documento.En cambio,¿que sucederá si los datos del documento cambian mientras se imprime? Éste es un problema que habría resolver,quizás creando un fichero temporal que contenga los datos a imprimir.
    Es evidente que los hilos son extraordinariamente útiles pero también es evidente que si no se utilizan adecuadamente pueden introducir nuevos problemas mientras tratamos de resolver otros más antiguos.Por lo tanto,es un error pensar que la mejor forma de desarrollar una aplicación es dividirla en partes que se ejecuten cada una como un hilo.


    PROGRAMAR CON HILOS

    La mayoria del soporte de java proporciona para trabajar con hilos recide  en la clase Theread del paquete  java.lang, aunque también la clase Objecto, la interfaz Runnable,la interfaz Thread.UncaughtExceptionHandler y las clases ThreadGroup y ThreadLocal del mismo paquete,así como la máquina virtual,proporcionan algún tipo de soporte. 

    CREAR UN HILO
    Los hilos de java  se pueden crear en dos formas: escribiendo una nueva clase derivada de Theread, o bien haciendo una clase existente implementa la interfaz Runnable .

    La clase Thread,que implemente la interfaz Runnable,de forma resimida,está definida asi:

    public class Thread extends Object implements Runnable

    {

    //Atributos 

    static int MAX_PRIORITY;

    //Prioridad máxima que un hilo puede tener.

    static int MIN_PRIORITY;

    //Prioridad mínima que un hilo puede tener. 

    static int NORM_PRIORITY;

    //Prioridad asignada por omisión a un hilo.

    //Constructores 

    Thread ([argumentos])

    //Métodos 

    static Theread currentThread()

    //Devuelve una referencia al hilo que actualmente esta en ejecución. 

    long getID()

    //Devuelve el identificador del hilo.

    String getName()

    //Devuelve el nombre del hilo.

    int getPriority()

    //Devuelve la prioridad del hilo. 

    void interrupt()

    //Envía este hilo al estado de preparado.

    boolean isAlive()

    //Verifica sí este hilo está vivo (no ha terminado).

    boolean isDaemon()

    //Verifica sí este hilo es un demonio. Se da este nombre  a

    //un hilo se ejecuta en segundo plano, realizando una 

    //operación específica en tiempos predefinidos, o bien en

    //respuestas a ciertos eventos.

    boolean is Interrupted()

    //Verifica si este hilo ha sido interrumpido.

    void join([milisegundos[. nanosegundos]])

    //Espera indefinidamente o el tiempo especificado,a que este

    //hilo termine (a que muera).

    void run()

    //Contiene el código que es ejecutará cuando el hilo pase

    //al estado de ejecución.Por omisión no hace nada.

    void setDaemon(boolean on)

    //Define este hilo como un demonio o como un hilo de usuario.

    void setName(String nombre)

    //Cambia el nombre de este hilo.

    void setPriority(int nuevaPrioridad)

    //Cambia la prioridad de este hilo.Por omisión es normal

    //(NORM_PRIORITY).

    static void sleep(long milisegundos[,int nanosegundos])

    //Envía este hilo a dormir  por el tiempo especificado.

    void start()

    //Inicia la ejecución de este hilo:la máquina virtual de Java

    //invoca al método run de este hilo.

    static void yield()

    //Detiene temporalmente la ejecución de este hilo para

    //permitir la ejecución de otros.

    //Métodos heredados de la clase Object:notify,notifyAll y wait void notify()

    //Despierta un hilo de los que están esperando por el

    //monitor de este objeto.

    void notifyAll()

    //Despierta todos los hilos que están esperando por el

    //monitor de este objeto.

    void wait ([milisegundos[,nanosegundos]])

    //Envía este hilo al estado de espera hasta que otro hilo

    //invoque al método notify o notifyAll,o hasta que transcurra

    //el tiempo especificado.

    }



    Una clase que implemente la interfaz Runnable tiene que sobreescribir el método run aportado por está,de ahí que Thread proporcione este método aunque no haga nada.El método run contendrá el código que debe ejecutar el hilo.

    Los métodos stop,suspend,resume,destroy y countStackFrames incluidos en versiones anteriores han sido desaprobados porque son intrínsecamente inseguros.

    BIBLIOGRAFIA
    java 2 curso de programación
     3 edición actualizada
    por el autor. Francisco Javier Ceballos  





    No hay comentarios:

    Publicar un comentario