![Sistemas Operativos [Procesos]](https://thumb.docuespanol.com/thumbv2/123dok_es/2004036.0/cover.lg.webp)
Gestión de Procesos: Multiprogramación
Información del documento
Idioma | Spanish |
Formato | |
Tamaño | 499.96 KB |
Asignatura | Sistemas Operativos |
Tipo de documento | Apuntes de Clase |
Resumen
I.Procesos y Multiprogramación
Este documento aborda los conceptos fundamentales de procesos en sistemas operativos. Se describe la multiprogramación como la rápida conmutación entre diferentes procesos, cada uno con su propio contador lógico de programa, a pesar de existir un único contador físico de programa. En sistemas como UNIX, los procesos y sus descendientes forman grupos, compartiendo señales. El manejo de dispositivos E/S involucra vectores de interrupción que apuntan a los procedimientos de servicio.
1. Concepto de Proceso y sus Registros
El texto inicia definiendo un proceso como una entidad asociada a un conjunto de registros, incluyendo el PC (contador de programa) y el SP (stack pointer), esenciales para su ejecución. Se enfatiza que el sistema operativo conmuta periódicamente entre procesos, alternando su ejecución. Cada proceso, aunque compartiendo recursos físicos, posee su propio contador lógico de programa, gestionando de manera independiente su flujo de instrucciones. Esta gestión dinámica permite la ejecución simultánea (o aparente simultaneidad) de múltiples procesos, maximizando el uso de los recursos del sistema. La descripción inicial sienta las bases para comprender la complejidad de la gestión de procesos en un sistema operativo.
2. Multiprogramación y Contadores de Programa
El concepto de multiprogramación se introduce como una conmutación rápida entre procesos, permitiendo que el procesador trabaje eficientemente con varios programas. A pesar de que solo existe un contador físico de programa (hardware), se destaca que cada proceso mantiene su propio contador lógico de programa (software). Esto implica un mecanismo de gestión por parte del sistema operativo que guarda y restaura el estado de cada proceso durante la conmutación. La existencia de estos contadores lógicos es fundamental para la ilusión de paralelismo, al permitir que cada proceso tenga su propio flujo de ejecución independiente. Esta gestión precisa de mecanismos de interrupción y cambio de contexto eficiente, para no afectar el rendimiento del sistema.
3. Grupos de Procesos en UNIX y Manejo de Señales
En sistemas operativos tipo UNIX, se describe la formación de grupos de procesos, donde un proceso padre y sus procesos hijos forman una unidad. Una señal enviada desde el teclado al sistema operativo es recibida por todos los miembros del grupo de procesos asociados a dicho teclado, ilustrando un mecanismo de comunicación implícita entre procesos relacionados. Esta característica permite la coordinación de tareas entre procesos relacionados jerárquicamente, simplificando la gestión de entrada de datos y señales del usuario en entornos interactivos. La capacidad de un proceso de generar y enviar señales a otros procesos es parte crucial de la comunicación entre procesos en estos sistemas.
4. Dispositivos E S y Vectores de Interrupción
El documento explica el funcionamiento de los dispositivos de Entrada/Salida (E/S) y su interacción con el sistema operativo a través de vectores de interrupción. Cada dispositivo E/S tiene asociado un vector de interrupción, que es una ubicación de memoria que contiene la dirección del procedimiento de servicio de interrupción. Cuando un dispositivo E/S genera una interrupción, el hardware carga un nuevo contador de programa con la dirección del vector de interrupción, iniciando el manejo de la interrupción. Esta secuencia de acciones describe la interrupción como un evento asíncrono que cambia el flujo de ejecución del procesador, para atender las necesidades de comunicación con los dispositivos E/S.
5. Flujo de Ejecución en el Manejo de Interrupciones
Se detalla el flujo de ejecución en el manejo de una interrupción: primero, se ejecuta el servicio de interrupción, posiblemente escrito en C, que procesa la información del dispositivo (ej. leer datos de un buffer). Posteriormente, el planificador (scheduler) decide qué proceso ejecutar. Finalmente, el procedimiento en C regresa el control al código ensamblador, concluyendo el manejo de la interrupción. Esta secuencia muestra la interacción entre el hardware, el software en C y ensamblador, y el scheduler, ilustrando la eficiente gestión de las interrupciones para lograr la concurrencia y el manejo de dispositivos externos. El proceso de gestión de la interrupción es fundamental para la capacidad del sistema operativo de gestionar eventos asíncronos.
6. Tabla de Procesos y su Estructura
Se presenta una descripción de la tabla de procesos, incluyendo campos como apuntadores a segmentos de datos y texto, directorios raíz y de trabajo, el contador de programa (PC), y registros con variables de trabajo. La información contenida en esta tabla permite al sistema operativo realizar un seguimiento eficiente de todos los procesos en ejecución, facilitando la gestión de memoria, el acceso a archivos y recursos. El contador de programa, en particular, define el estado de ejecución de cada proceso, apuntando a la siguiente instrucción a ejecutar. Esta estructura de datos es esencial para la gestión de procesos concurrentes y la capacidad del sistema operativo de controlar y conmutar entre diferentes tareas. La organización de esta tabla optimiza la búsqueda de información crítica para cada proceso activo.
II.Subprocesos Threads Una Visión General
Los subprocesos o threads permiten múltiples ejecuciones dentro del mismo entorno de proceso, compartiendo el mismo espacio de direcciones. Son más ligeros que los procesos, facilitando su creación y destrucción. Su utilidad radica en la capacidad de realizar varias tareas concurrentes, mejorando el rendimiento, especialmente en operaciones E/S intensivas. Se mencionan funciones como pthread_create
, pthread_exit
, y pthread_join
como ejemplos de manejo de subprocesos.
1. Definición y Características de los Subprocesos
El documento define los subprocesos como una forma de lograr múltiples ejecuciones dentro del mismo entorno de proceso. A diferencia de los procesos, los subprocesos comparten el mismo espacio de direcciones, lo que los hace más eficientes en cuanto a recursos. Se les denomina a menudo "procesos ligeros" debido a su menor sobrecarga en comparación con la creación y gestión de procesos completos. Esta característica de compartir el espacio de direcciones simplifica la comunicación entre ellos, ya que no requieren mecanismos complejos de intercambio de información entre espacios de memoria separados. Los subprocesos, al igual que los procesos, pueden pasar por diferentes estados de ejecución, facilitando su gestión dentro del sistema operativo.
2. Funciones de Manejo de Subprocesos pthread
Se mencionan ejemplos concretos de funciones para el manejo de subprocesos usando la librería pthread: pthread_create
(para la creación de un nuevo subproceso especificando la función a ejecutar), pthread_exit
(para terminar la ejecución de un subproceso), y pthread_join
(para suspender la ejecución de un subproceso hasta que otro termine). Estas funciones ilustran la interfaz de programación disponible para la creación y sincronización de subprocesos. La disponibilidad de estas funciones de alto nivel abstrae la complejidad de la gestión de subprocesos, simplificando el desarrollo de aplicaciones concurrentes. La capacidad de controlar el ciclo de vida de los subprocesos y sincronizar su ejecución es crucial para la construcción de aplicaciones robustas y eficientes.
3. Ventajas y Aplicaciones de los Subprocesos
La utilidad de los subprocesos se explica mediante su capacidad para realizar varias tareas concurrentes dentro de un mismo proceso. Se destaca su eficiencia en comparación con la creación de múltiples procesos, especialmente en situaciones con numerosas operaciones de E/S. Un ejemplo ilustrativo es la escritura de un libro: el editor puede trabajar en diferentes capítulos simultáneamente utilizando subprocesos, mejorando la eficiencia general. Se plantea la situación de modificar todo el libro para enfatizar la capacidad de manejo de tareas concurrentes y la simplificación que esto representa. Esta capacidad de procesamiento paralelo mejora el rendimiento y la capacidad de respuesta de las aplicaciones, especialmente en entornos multitarea.
4. Ejemplo Servidor Web Multihilo
Se presenta un ejemplo práctico del uso de subprocesos en un servidor web. En este escenario, un subproceso despachador lee las solicitudes de páginas web, mientras que otros subprocesos se encargan de atender cada petición individual. Este ejemplo demuestra la capacidad de los subprocesos para manejar eficientemente múltiples solicitudes concurrentes, mejorando el rendimiento del servidor. Manteniendo las páginas web solicitadas con frecuencia en memoria principal se optimiza el rendimiento. El ejemplo clarifica la arquitectura de un servidor web multihilo, donde la concurrencia facilitada por los subprocesos permite una mayor capacidad de respuesta y eficiencia en el manejo de las peticiones de los usuarios.
5. Subprocesos en Espacio de Usuario vs. Espacio del Kernel
Se introduce la diferencia entre la implementación de subprocesos en el espacio de usuario y en el espacio del kernel. La implementación en el espacio del usuario ofrece mayor eficiencia al evitar llamadas al sistema, mientras que la implementación en el espacio del kernel proporciona una mejor gestión por parte del sistema operativo. La opción de mantener subprocesos a nivel de usuario, incluso en sistemas operativos que no los gestionan directamente, destaca la flexibilidad en el desarrollo de software concurrente. Se puntualiza que las funciones de almacenamiento e invocación de subprocesos son locales, aumentando la eficiencia al evitar interrupciones y cambios de contexto, minimizando el uso del caché. La implementación en el espacio de usuario es una estrategia clave para el manejo de la concurrencia en diferentes entornos.
III.Implementación de Subprocesos
La implementación de subprocesos puede ocurrir en el espacio del usuario o del kernel. La implementación en el espacio del usuario ofrece mayor eficiencia al evitar llamadas al sistema, mientras que la implementación en el espacio del kernel simplifica la gestión para el sistema operativo. Los subprocesos emergentes son una técnica para sistemas distribuidos donde se crea un nuevo subproceso por cada solicitud recibida. Se destaca la importancia de la gestión eficiente de recursos, evitando interferencias entre procesos.
1. Implementación de Subprocesos en Espacio de Usuario
El documento describe la implementación de subprocesos en el espacio de usuario, destacando su eficiencia. Cuando un subproceso termina, su información se guarda en la tabla de subprocesos, permitiendo al planificador seleccionar otro para su ejecución. La creación y destrucción de procesos implican una llamada al kernel para actualizar dicha tabla. Si un subproceso se bloquea, el kernel decide qué otro ejecutar. Este método evita nuevas llamadas al sistema no bloqueadoras, optimizando el rendimiento. La gestión se simplifica al no requerir interacciones directas con el kernel en cada cambio de contexto. Esta técnica resulta especialmente eficiente al minimizar la sobrecarga de las llamadas al sistema, que pueden ser costosas en términos de tiempo de procesamiento.
2. Multiplexación de Subprocesos Una Estrategia Híbrida
Se propone una estrategia híbrida que combina subprocesos en el kernel con subprocesos en el espacio del usuario a través de multiplexación. De esta forma, el kernel solo conoce los subprocesos del espacio del kernel, simplificando su gestión. Esta arquitectura permite que sistemas operativos sin soporte nativo para subprocesos de usuario puedan beneficiarse de la creación de subprocesos a nivel de aplicación, mejorando la eficiencia y la capacidad de respuesta. La multiplexación actúa como un intermediario, gestionando la asignación de los subprocesos de usuario a los recursos disponibles en el sistema. Esta arquitectura combina las ventajas de ambos enfoques: la eficiencia de los subprocesos de usuario y la gestión centralizada del kernel.
3. Subprocesos Emergentes en Sistemas Distribuidos
Se introduce el concepto de subprocesos emergentes, especialmente relevante en sistemas distribuidos. Cada mensaje o solicitud de servicio desencadena la creación de un nuevo subproceso para su procesamiento. Esta estrategia es útil en entornos donde la llegada de peticiones es impredecible. La creación de un subproceso dedicado por cada mensaje minimiza el tiempo de espera entre la recepción de la solicitud y su procesamiento. Esta técnica aumenta la capacidad de respuesta y escalabilidad del sistema al distribuir la carga entre múltiples subprocesos. La gestión de subprocesos emergentes requiere una estrategia de creación y destrucción eficiente para evitar una sobrecarga excesiva en el sistema.
IV.Comunicación y Sincronización entre Procesos
La comunicación entre procesos (IPC) es crucial, con tres situaciones básicas: pasar información entre procesos. La concurrencia plantea desafíos como las condiciones de competencia, ilustradas con el ejemplo de una cola de impresión. Para evitar problemas se utiliza la exclusión mutua, garantizando que solo un proceso acceda a recursos compartidos en las regiones críticas. Se exploran diferentes mecanismos de sincronización como variables de bloqueo, la solución de Peterson, y el uso de sleep
y wakeup
.
1. Comunicación Inter Procesos IPC
Se establecen tres situaciones básicas de comunicación inter-procesos (IPC): la transferencia de información de un proceso a otro, donde la salida de un proceso es la entrada de otro. Este tipo de comunicación secuencial es fundamental en la arquitectura de muchos sistemas, donde la ejecución de procesos se encadena para obtener un resultado final. Se necesita una gestión adecuada para asegurar la sincronización y evitar errores, dado que un proceso depende del resultado del anterior. La comunicación eficiente entre procesos es crucial para la correcta ejecución de programas, especialmente en tareas complejas.
2. Condiciones de Competencia El Problema de la Cola de Impresión
Se utiliza el ejemplo clásico de una cola de impresión para ilustrar las condiciones de competencia. Un proceso agrega un archivo a la cola (escribiendo su nombre en un directorio), mientras que otro proceso (el demonio de impresora) lo imprime y elimina de la lista. Si un proceso es interrumpido justo después de leer el estado de la cola, otro proceso puede modificar la cola antes de que el primer proceso pueda concluir su operación, generando inconsistencias. Este ejemplo ilustra como la falta de sincronización entre procesos concurrentes que acceden a recursos compartidos puede resultar en resultados inesperados e incorrectos. La gestión correcta de la concurrencia es fundamental para evitar este tipo de problemas.
3. Exclusión Mutua y Regiones Críticas
Para evitar las condiciones de competencia, se introduce el concepto de exclusión mutua. Se enfatiza que solo un proceso puede estar dentro de una región crítica a la vez, donde se accede a recursos compartidos. Se definen tres condiciones necesarias para la exclusión mutua correcta: 1) Dos procesos no pueden estar simultáneamente en sus regiones críticas; 2) No se pueden hacer suposiciones sobre la velocidad relativa de los procesadores; 3) Ningún proceso fuera de su región crítica puede bloquear a otros procesos. Estos principios garantizan la consistencia en el acceso a recursos compartidos, previniendo errores causados por la concurrencia. El diseño de mecanismos de exclusión mutua eficientes es esencial para el desarrollo de sistemas concurrentes robustos.
4. Mecanismos de Exclusión Mutua Variables de Bloqueo Sleep y Wakeup
Se exploran mecanismos de exclusión mutua, como el uso de variables de bloqueo, una solución en software donde una variable compartida indica si la región crítica está ocupada. Las operaciones de lectura y escritura de esta variable deben ser atómicas. Se discuten los problemas de la espera activa y el desperdicio de tiempo de procesador que esto conlleva. Para solucionarlo se sugieren las llamadas al sistema sleep
y wakeup
, las cuales permiten a un proceso bloquearse hasta que otro lo active, reduciendo el consumo de recursos del procesador. Se menciona el problema de inversión de prioridad, donde un proceso de alta prioridad puede bloquearse indefinidamente si un proceso de baja prioridad entra a su región crítica. La elección del mecanismo depende de las necesidades del sistema y las características específicas del entorno de ejecución.
V.Mecanismos de Sincronización Avanzada
Se discuten los semáforos, que permiten controlar el acceso a recursos compartidos, y los mutexes, una versión simplificada para la exclusión mutua. Se presentan ejemplos clásicos de problemas de concurrencia como el problema de la cena de los filósofos y el problema de los lectores y escritores, que ilustran los desafíos de la sincronización y el diseño de algoritmos eficientes para la gestión de recursos compartidos. Finalmente se describe el problema del barbero dormilón como otro ejemplo del uso de semáforos para la sincronización.
1. Semáforos Un Mecanismo de Sincronización
Se introduce el concepto de semáforo como una variable entera utilizada para la sincronización de procesos. Una operación up
incrementa el valor del semáforo, y si hay procesos bloqueados, uno de ellos puede continuar su ejecución. Si el semáforo tiene valor 0, indica que no hay llamadas wakeup
pendientes. Los semáforos proveen una forma de controlar el acceso a recursos compartidos de manera más flexible que la simple exclusión mutua, permitiendo contar el número de procesos que pueden acceder a un recurso. Su uso facilita la gestión de la concurrencia en escenarios donde se necesita un control más preciso sobre el acceso a recursos limitados.
2. Mutexes Exclusión Mutua Simplificada
Se describe el mutex como una versión simplificada del semáforo, utilizada cuando solo se necesita la capacidad de exclusión mutua. No se necesita la capacidad de contar del semáforo. Los mutexes permiten administrar la exclusión mutua con respecto a un recurso o fragmento de código. mutex_lock
asegura el acceso exclusivo a la región crítica, mientras que mutex_unlock
libera el recurso, permitiendo que otro proceso acceda. La simplicidad del mutex lo hace ideal para implementar la exclusión mutua en situaciones donde no se requiere un control más complejo del acceso a recursos.
3. El Problema de la Cena de los Filósofos
Se presenta el problema clásico de la cena de los filósofos como una ilustración de los desafíos de la sincronización. Cinco filósofos comparten una mesa circular con un tenedor entre cada plato. Cada filósofo necesita dos tenedores para comer, y si todos toman un tenedor simultáneamente, ninguno podrá comer. Este problema ejemplifica la necesidad de algoritmos de sincronización robustos que eviten bloqueos mutuos. La solución requiere un mecanismo que prevenga el escenario en que todos los filósofos toman un tenedor sin conseguir dos, resultando en una situación de bloqueo (deadlock). La correcta gestión de recursos compartidos es crucial para la ejecución exitosa del sistema.
4. El Problema de los Lectores y Escritores
Se utiliza el problema de los lectores y escritores para modelar el acceso a una base de datos. Múltiples lectores pueden acceder a la base de datos simultáneamente, pero solo un escritor puede modificarla a la vez. El desafío radica en diseñar un algoritmo que permita la lectura concurrente sin bloquear a los escritores, y viceversa. La solución requiere un mecanismo que coordine el acceso para evitar la pérdida de datos o la inconsistencia de la información. La correcta solución implica la consideración cuidadosa de las prioridades de lectura y escritura, así como la gestión de los tiempos de espera. La eficiencia del sistema depende de la correcta resolución del problema de sincronización.
5. El Problema del Barbero Dormilón
Se introduce el problema del barbero dormilón, donde un barbero duerme si no hay clientes. Los clientes llegan y despiertan al barbero si está durmiendo. Si el barbero está ocupado, los clientes esperan en una sala de espera con capacidad limitada. Si la sala está llena, el cliente se va. Este problema ilustra la necesidad de sincronización entre un productor (el cliente) y un consumidor (el barbero), y la gestión de una cola de espera con capacidad limitada. Se destaca la gestión de recursos compartidos (la silla del barbero y las sillas de espera) y la necesidad de evitar bloqueos, así como la atención a diferentes estados (barbero durmiendo, barbero ocupado, clientes esperando).