Está en la página 1de 6

INSTITUTO TECNOLOGICO DE

VILLAHERMOSA

Alumno: FÉRIDO CASTILLO MAGAÑA

MATERIA: tópicos avanzados de


programación

4ER SEMESTRE
3_1 Hilos
PERIDO ENERO-AGOSTO 2024

UNIDAD 3

FECHA DE ENTREGA: 12 DE MARZO DEL


2024
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 los 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 ejecutándose 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 está siendo actualizado por el primer cajero quede liberado.

1
Un sistema operativo puede realizar multiprogramación al reasignar rápidamente
tiempos de la CPU entre muchos programas, dando el aspecto de paralelismo, al
ejecutarse concurrentemente. Aunque el verdadero paralelismo se logra con una
computadora con varias CPU.
Java soporta varios hilos de ejecución. Un proceso de Java puede crear y manejar,
dentro de sí mismo, varias secuencias de ejecución concurrentes o paralelos. Cada
una de estas secuencias es un hilo independiente y todos ellos comparten tanto el
espacio de dirección como los recursos del sistema operativo. Por lo tanto, cada hilo
puede acceder a todos los datos y procedimientos del proceso, pero tiene su propio
contador de programa y su pila de llamadas a métodos.
Todos los programas que hemos aprendido a desarrollar se ejecutan en forma
secuencial, por ejemplo, cuando llamamos a un método desde la main hasta que
esta no finalice no continúan ejecutándose las instrucciones de la main.
Esta forma de resolver los problemas en muchas situaciones no será la más
eficiente. Imaginemos si implementamos un algoritmo que busca en el disco duro la
cantidad de archivos con extensión java, éste proceso requiere de mucho tiempo ya
que el acceso a disco es costoso. Mientras esta búsqueda no finalice nuestro
programa no puede desarrollar otras actividades, por ejemplo no podría estar
accediendo a un servidor de internet, procesando tablas de una base de datos etc.
En el lenguaje Java se ha creado el concepto de hilo para poder ejecutar algoritmos
en forma concurrente, es decir que comience la ejecución de la función pero
continúe con la ejecución de la función main o la función desde donde se llamó al
hilo.
Con los hilos podremos sacar ventajas en seguir la ejecución del programa y que
no se bloquee en algoritmos complejos o que accedan a recursos lentos.

¿Qué es la programación multihilo?

Para poder explicar claramente lo que es la programación multihilo, lo primero es


necesario aclarar una serie de conceptos para entender la diferencia entre
multiproceso y multihilo.

Los sistemas operativos multitarea ejecutan o emulan ejecutar más de una tarea a
la vez. Esto es solo cierto si dispone de más de un procesador, si no, va alternando
procesos en un solo procesador.

La ejecución de un proceso implica que el mismo en el momento de ejecución


utiliza todo el procesador y con el espacio de memoria asignado. En sistemas
multitarea, se van alternando procesos y cuando uno libera el procesador para que
otro se ejecute, también libera la memoria asignada.

2
Esto lo realiza el planificador del sistema operativo lo cual implica la correcta gestión
de la memoria para guardar los datos del proceso saliente, provocando cierta
sobrecarga del sistema.

La programación multihilo se basa en que, dentro del desarrollo de la aplicación,


hemos definido diversas tareas para que se ejecuten a la vez. Todas estas tareas
forman parte de un mismo proceso.

Para nuestro sistema operativo tendremos un solo proceso con diversas tareas a
ejecutar. En este sentido el planificador se encarga de que cuando le toque
ejecutarse a nuestro proceso, las tareas del mismo se vayan alternando, con la
diferencia que, al ser de un mismo proceso, no se libera espacio de memoria ni
procesador, como si se haría en el caso de alternar procesos.

Esto agiliza por lo tanto la ejecución de nuestro proceso que además puede simular
paralelizar la ejecución de varias tareas a la vez.

Para realizar una programación multihilo, deberemos indicar en el código de


programación mediante el comando correspondiente que queremos lanzar diversas
tareas en diferentes hilos.

¿Cuándo vale la pena usar la programación multihilo?

El hecho de usar programación multihilo no implica que siempre vamos a tener una
mejora de rendimiento y es potestad del programador el decidir cuándo conviene
usar este tipo de programación. En líneas generales, si la aplicación que hemos
desarrollado es muy simple no tiene sentido plantearse este tipo de programación.

Tampoco puede que sea buena idea emplear el multihilo para


aplicaciones excesivamente complejas pues provocará excesiva sobrecarga y
sea más un problema que una ventaja.

Entonces la pregunta clave es ver cuñando va a ser ventajoso usar la programación


multihilo que nos permitirá paralelizar la ejecución de varios procesos y de esta
forma mejorar el rendimiento de nuestra aplicación.

Por regla general, se considera que una aplicación es candidata a ser programa en
multihilo cuando cumple las siguientes premisas:

1. La aplicación va a requerir se realizar diversas tareas claramente


diferenciadas con un alto coste computacional que sea mayor al que se
genera en un cambio de contexto, es decir, de liberación del espacio de
memoria asignado.

3
2. El resultado de las tareas que se ejecuten en diferentes hilos no debe
depender del resultado de otras tareas, ya que, de lo contrario, las tareas se
estarían esperando unas a otras y al final el rendimiento sería menor del
esperado.
3. Se prevea que pueda haber tareas retenidas o bloqueadas por estar
esperando a una lectura de disco, por ejemplo. En estos casos, esta tarea se
bloquea y otra entra en acción, aprovechando de esta forma la programación
multihilo.

Ejemplos de ventajas de la programación multihilo

Para entender mejor lo que hemos comentado, pondremos dos ejemplos en los que
puede resultar beneficioso el uso de la programación multihilo. Uno de los casos de
uso más comunes es cuando una aplicación precisa acceder a diferentes
orígenes, como servidores o bases de datos, para procesar la información recogida
de cada origen.

En programación secuencial, los accesos a estos orígenes serían secuenciales y


hasta que no tuviésemos toda la información, no podríamos procesarla. Si por el
contrario usamos programación multihilo, podríamos lanzar en paralelo el acceso a
los diferentes orígenes provocando una mejora sensible del rendimiento.

Un segundo caso de uso tradicional de la programación multihilo es cuando dentro


de una aplicación queremos priorizar alguno de los procesos que comporta sobre
el resto. Es muy habitual usar este tipo de programación en videojuegos priorizando
la parte de renderización de la imagen sobre otros procesos paralelos que se
ejecutan a la vez.

Como podemos ver en estos dos casos de uso, la mejora del rendimiento o la
priorización de procesos, son las ventajas más claras que podremos obtener en la
programación multihilo.

Si además nuestra aplicación multihilo se ejecuta sobre un sistema multiprocesador,


entonces las ventajas se multiplicarán al paralelizar realmente todos los procesos,
como hemos comentado el inicio de este post.

4
5

También podría gustarte