INTRODUCCIÓN A LOS SISTEMAS DE COMPUTACIÓN Nombre: Alejandro Bejarano

RESUMEN DE LAS PÁGINAS 43 A 57

LOS HILOS Un hilo es la unidad básica de utilización del procesador y posee por un ID de hilo, un contador de programa, un conjunto de registros y una pila. Comparte códigos, datos y otros recursos del sistema operativo con otros hilos pertenecientes al mismo código. Un proceso tradicional posee un único hilo de control, por el contrario un proceso posee múltiples hilos de control, puede realizar más de un trabajo a la vez. Normalmente una se aplicación implementa como un proceso con varios hilos de control, por ejemplo, un navegador de Internet puede tener un hilo para mostrar las imágenes o el texto mientras otro hilo recupera los datos de la red. En algunas situaciones una misma aplicación tiene que llevar a cabo varias tareas similares, El ejemplo más claro es un servidor que acepta solicitudes de los clientes que piden acceder a su información (servidores Web, bases de datos, etc.). Un servidor sometido a un gran trabajo puede tener muchos clientes accediendo de forma concurrente a él, pero si el servidor funcionara como un proceso de un único hilo, solo podría dar servicio a un cliente cada vez, tardándose mucho en atender las peticiones de los clientes. Los hilos juegan un papel muy importante en los sistemas de llamada a procedimientos remotos (RPC) las cuales permiten la comunicación entre procesos dando comunicaciones parecidas a las llamadas funciones ordinarias, los servidores RPC so multihilo. Ahora los kernel de los SO son multihilo (existen varios hilos operando en el) 1. Ventajas de la programación multihilo  Capacidad de Respuesta: permite que un programa continúe su ejecución incluso cuando esta parte está bloqueada  Compartición de recursos: una aplicación puede tener varios hilos de diferentes actividades dentro del mismo espacio de direcciones  Economía: es más fácil crear y realizar cambios de contexto entre hilos; se consume mas tiempo en gestionar procesos de hilos  Uso en arquitecturas multiprocesador: los hilos pueden ser ejecutados de forma totalmente paralela en los diferentes procesadores 2. Los modelos multihilo Proporciona en un nivel por encima del kernel y los hilos se gestionan sin soporte por su parte, casi todos los SO soportan hilos de kernel

4. ya que un único hilo puede acceder al kernel a la vez. Las tres principales bibliotecas de hilo actualmente en uso son: POSIX Pthreads. que proporciona la funcionalidad del modelo muchos a muchos. Nos basaremos en la API Win32 al ser la de mayor difusión. este número de hilos puede ser específico (se pueden asignar más hilos del kernel a una aplicación en un sistema multiprocesador. permite la ejecución de otros hilos mientras un hilo realiza una llamada bloqueante al sistema. La gestión de éstos se realiza a través de la biblioteca de hilos en el espacio de usuario. los programadores pueden crear tantos hilos de usuario como crean necesarios. En este caso. El segundo método consiste en implementar una biblioteca en el nivel del kernel. bloqueándose el proceso completo si un hilo realiza una llamada bloqueante al sistema. Los componentes generales de un hilo son: • Un identificador (ID) de hilo que identifique de forma unívoca al hilo. Modelo muchos a muchos Se multiplexan muchos hilos de usuario sobre un número menor o igual de hilos del kernel. 2. El primer método consiste en proporcionar una biblioteca en el espacio de usuario. TEB: bloque de entorno del hilo. Utiliza el modelo uno a uno. 5. El único inconveniente es que la creación de cada hilo de usuario requiere la correspondiente creación de un hilo del kernel. Esta API es la principal interfaz de programación de aplicaciones de la familia de sistemas . Win32 y Java.3. cualquier hilo de un proceso puede acceder al espacio de direcciones de dicho proceso. Asimismo. y cada proceso puede contener uno o más hilos. el código y las estructuras de datos de la biblioteca se encuentran en el espacio del kernel. Bibliotecas de hilos Proporciona al programador una API para crear y gestionar los hilos. y que sea soportada directamente por el SO. KTHREAD: bloque de hilo del kernel. proporciona una mayor concurrencia que el modelo anterior. el kernel puede planificar otro hilo para su ejecución. Modelo uno a uno Se asigna cada hilo de usuario a un hilo del kernel.4 Los hilos de Windows XP Windows XP implementa la API Win32 en su versión de 32 bits y la API Win64 en su versión de 64 bits. sobre varios procesadores. 7. 6. también permite la ejecución de múltiples hilos en paralelo.: bloque de hilo ejecutivo. Un conjunto de registros para representar el estado del procesador. la mayoría de las implementaciones de este modelo limitan el número de hilos soportados por el sistema. cuando un hilo realiza una llamada bloqueante al sistema. sin ningún soporte del kernel. Windows XP también proporciona el soporte adecuado para una biblioteca de fibras. Sin embargo. Existen dos formas implementar una biblioteca. no se podrán ejecutar varios hilos de forma paralela sobre múltiples procesadores. Modelo muchos a uno Se signan múltiples hilos del nivel de usuario a un hilo del kernel. Los hilos de Windows Se ejecuta como un proceso independiente.

libera al hilos para continuar su ejecución. En este contexto se habla también de un hilo principal. 2000 y XP). y cada proceso puede contener uno o más hilos. 2. • El conjunto de registros. 2. Proporciona el código de salida de un hilo determinado. Función Resultado CreateThread() SetThreadPriority() SuspendThread() ResumeThread() Sleep() SleepEx() ExitThread() TerminateThread() GetCurrentThread() GetCurrentThreadId() GetExitCodeThread() GetThreadPriority() AttachThreadInput() Crea un hilo. que proporciona la funcionalidad del modelo muchos a muchos. utilizada cuando el hilo se está ejecutando en modo usuario. que se utiliza en el funcionamiento simultáneo de operaciones I/O asíncronas. una pila del modo usuario y una matriz para los datos específicos del hilo (lo que en la terminología de Windows XP se conoce por almacenamiento local del hilo). La estructura ETHREAD también contiene un puntero al correspondiente bloque KTHREAD. esto significa que sólo el kernel puede acceder a ellas. Con la biblioteca de hilos. Windows XP utiliza el modelo uno a uno descrito anteriormente.operativos Windows (95.1 La creación y finalización Además del hilo inicial. trataremos una visión general de las principales funciones de la API Win32.5. Una aplicación de Windows XP se ejecuta como un proceso independiente. Proporciona la prioridad de un hilo determinado. LA estructura KTHREAD incluye información de planificación y sincronización del hilo. Define la prioridad de un hilo determinado. desde fuera.5 La programación de los hilos Al inicializar un proceso con la función CreateProcess() se crea automáticamente un hilo primario que materializa la ejecución del proceso. que se crea automáticamente al inicializar un proceso. un hilo determinado del proceso actual. Una pila de usuario. Además. en cualquier momento se . Detiene la ejecución del hilo durante un tiempo determinado. KTHREAD: bloque de hilo del kernel. Entre otros componentes. utilizada cuando el hilo se está ejecutando en modo kernel. Un conjunto de registros para representar el estado del procesador. Un área de almacenamiento privada usada por las distintas bibliotecas de tiempo de ejecución y bibliotecas de vínculos dinámicos (DLLs). donde cada hilo de nivel de usuario se asigna a un hilo del kernel. Versión especial de Sleep(). Windows XP también proporciona el soporte adecuado para una biblioteca de fibras. si es el caso. Finaliza. NT. Aumenta el contador de espera del hilo y detiene su ejecución. cualquier hilo de un proceso puede acceder al espacio de direcciones de dicho proceso. a partir del cual se pueden crear tantos hilos como se desee. A continuación. A continuación entraremos más a fondo en la programación de los hilos en Win32. y una pila del kernel. 98. Proporciona un semi-manejador para el hilo actual. Las estructuras ETHREAD y KTHREAD están incluídas en el espacio del kernel. El bloque TEB es una estructura de datos del espacio de usuario a la que se accede cuando el hilo se encuentra ejecutándose en modo usuario. Los componentes generales de un hilo son: • • • Un identificador (ID) de hilo que identifique de forma unívoca al hilo. Finaliza el hilo actual. Los componentes principales de la estructura ETHREAD incluyen un puntero al proceso al que pertenece el hilo y la dirección de la rutina en la que el hilo inicia su ejecución. las pilas y el área de almacenamiento privado constituyen el contexto del hilo. TEB: bloque de entorno del hilo. Desvía los mensajes de un hilo a otro. Las principales estructuras de datos de un hilo son: • • • ETHREAD: bloque de hilo ejecutivo. Reduce el contador de espera y. Proporciona el ID del hilo actual. la estructura KTHREAD incluye la pila del kernel (utilizada cuando el hilo se está ejecutando en modo kernel) y un puntero al bloque de entorno TEB. la estructura TEB contiene el identificador del hilo. Sin embargo.

El argumento se puede definir indistintamente como LONG. lpParameter Este parámetro materializa el valor de 32 bits que se pasa a la función de inicialización del hilo. se accederá al hilo cada vez que se llamen las distintas funciones de hilos de la API Win32. En ese caso. una declaración válida sería: DWORD WINAPI ThreadProc( LPVOID lpParameter ). argumento de 32 bits y. como resultado de la función. El sistema no pone ningún límite al número de hilos de un proceso. Sólo después de ejecutar la función ResumeThread().pueden crear otros hilos dentro del proceso. Por ejemplo. debemos introducir el valor 0. se obtiene NULL como resultado. lo principal es que el tipo. pero se sobreentiende que un proceso no debería crear más hilos de los que realmente necesita. A través de este manejador. dwCreationFlags Si el hilo recién creado no se debe ejecutar de forma inmediata. . existe libertad para formular el prototipo. Si. en la compilación. por el contrario. la cual proporciona un manejador al nuevo hilo cada vez que se llama con éxito. en este parámetro se debe introducir la constante CREATE_SUSPENDED. se quiere iniciar el hilo inmediatamente. mediante la función GetLastError() podeos consultar un código de error ampliado. devuelve también un valor de 32 bits. Si no se llama a la función con éxito. El punto de partida para la creación de un nuevo hilo es la función CreateThread(). DWORD. se empezará a ejecutar el hilo. LPVOID o cualquier otro tipo. Por lo que respecta a la codificación de estos tipos. se traduce en un valor de 32 bits.