14 Jul

Definición de Sistema Operativo

Un sistema operativo se define como el conjunto de programas que controla la ejecución de aplicaciones y actúa como interfaz entre estas y el hardware del computador.

Objetivos de un Sistema Operativo

Los sistemas operativos se diseñan con los siguientes objetivos en mente:

  • Comodidad: Facilitar el uso del computador al usuario.
  • Eficiencia: Lograr que los recursos del sistema informático se utilicen de la manera más eficiente posible.
  • Capacidad de evolución: Permitir el desarrollo, verificación e introducción de nuevas funcionalidades sin interferir con los servicios existentes.

Funciones de un Sistema Operativo

El kernel, o núcleo, es el corazón del sistema operativo y gestiona todas las funciones vitales. Entre las funciones principales se encuentran:

  • Gestión de recursos: Asignar los recursos disponibles (memoria, almacenamiento, tiempo de procesamiento, etc.) a los programas en ejecución, evitar conflictos de acceso y registrar el consumo de recursos. El sistema operativo implementa políticas para una asignación efectiva.
  • Abstracción: Ocultar los detalles del hardware a los programadores, proporcionando una serie de abstracciones para que los programadores se enfoquen en las necesidades de los usuarios. El kernel configura espacios de direcciones, carga programas en memoria y gestiona la pila.
  • Aislamiento: En sistemas multiusuario y multitarea, cada proceso y usuario debe tener la ilusión de que el sistema está dedicado a su uso exclusivo, lo cual requiere el uso de hardware específico para la protección.
  • Ejecución de servicios para los programas: A través de la capa de servicios o llamadas al sistema, los programas pueden solicitar servicios del kernel, como la creación y destrucción de procesos, operaciones de E/S y manejo de errores.
  • Ejecución de los mandatos de los usuarios: El sistema operativo incluye un módulo llamado Shell que permite la interacción entre el usuario y el sistema, esperando órdenes, analizándolas y ejecutándolas en un bucle infinito.

Evolución Histórica de los Sistemas Operativos

La evolución de los sistemas operativos está ligada a la evolución tecnológica y al tipo de procesamiento. Se distinguen las siguientes etapas:

  • Etapa 1: Proceso en Serie

    El programador interactuaba directamente con el hardware sin sistema operativo. Se agrupaban programas con procesos similares.

  • Etapa 2: Sistema por Lotes Monoprogramado

    Se automatizó el procesamiento de programas agrupados en lotes, con un sistema monitor asistiendo al operador. Solo un programa residía en memoria a la vez (monoprogramación), y se utilizaban tarjetas perforadas.

  • Etapa 3: Sistema por Lotes Multiprogramado

    La aparición de los discos y el concepto de SPOOL (Simultaneous Peripheral Operation On Line) permitieron superponer la E/S de un trabajo con el procesamiento de otros, y que varios procesos residieran simultáneamente en memoria (multiprogramación), mejorando el aprovechamiento de la CPU. Requerían protección de memoria y del procesador. El usuario no tenía contacto con el computador.

  • Etapa 4: Sistemas de Tiempo Compartido

    Se extendió la multitarea a sistemas interactivos y multiusuarios con la aparición de terminales. Se introdujo la multitarea preventiva, donde el sistema operativo interrumpe periódicamente los procesos. Surgieron abstracciones como archivos y directorios, y el concepto de memoria virtual. El usuario tiene contacto con el programa.

  • Etapa 5: Sistemas de Propósito General

    Capaces de operar en lotes, multiprogramación, tiempo compartido y multiprocesador, presentando una capa de software más robusta entre el usuario y el hardware.

  • Etapa 6: Sistemas de PC, Sistemas Paralelos, Sistemas Integrados, Sistemas de Tiempo Real, etc.

    Se caracterizó por la especialización, simplificación y una mayor importancia a la productividad del usuario. Se desarrollaron sistemas operativos para PCs (inicialmente monotarea y monoprogramados, luego con SPOOL y en red), sistemas paralelos (multiprocesadores y multicomputadoras o distribuidos), sistemas de tiempo real, y sistemas operativos integrados.

Componentes de un Sistema Operativo

Se considera que un sistema operativo está formado por tres capas:

  • Núcleo (Kernel): Interacciona directamente con el hardware, gestionando recursos, interrupciones y memoria. Incluye la gestión de procesos, memoria, operaciones de E/S, almacenamiento secundario (archivos y directorios), y funciones de soporte (interrupciones, auditorías, seguridad).
  • Servicios (Llamadas al sistema): Ofrecen una interfaz (API) a los programas para solicitar servicios del sistema operativo, proporcionando una visión de «máquina extendida». Ejemplos incluyen manipulación de procesos, archivos, dispositivos, mantenimiento de información y comunicaciones.
  • Intérprete de mandatos o Shell: Es la interfaz con la que generalmente interactúan los usuarios (línea de comandos o GUI), aunque técnicamente no forma parte del sistema operativo. Permite la ejecución de otros programas.

Arquitectura de los Sistemas Operativos

La estructura de los componentes varía, clasificándose en:

  • Monolítica: Todos los componentes integrados en un único programa que se ejecuta en modo núcleo, sin una estructura clara. Ejemplos: MS-DOS y UNIX (en sus inicios). Dificulta añadir nuevas funcionalidades y no sigue el principio de ocultación de información.
  • Estructurados: Dividen el sistema en componentes más pequeños con funcionalidades específicas.
  • Por capas: Organizado como una jerarquía de capas, donde cada capa ofrece una interfaz a la superior y utiliza solo los servicios de la inferior. Ventajas: sencillez de construcción y depuración. Desventajas: dificultad para definir capas y bajo rendimiento por la sobrecarga. Ejemplo: THE.
  • Microkernels: La mayoría de los servicios se ejecutan en procesos de usuario, dejando solo una pequeña parte (el microkernel) en modo núcleo para gestión básica de memoria, procesos y comunicación entre cliente y servidores. Ventajas: flexibilidad, fiabilidad, facilidad de extensión y portabilidad. Desventajas: mayor sobrecarga en el tratamiento de servicios. Ejemplo: Windows NT (con algunas modificaciones).
  • Sistemas operativos modulares: El núcleo tiene componentes básicos y puede enlazar servicios adicionales a través de módulos cargables dinámicamente (LKMs). Común en UNIX modernos (Linux, macOS, Solaris) y Windows. Ofrecen flexibilidad y eficiencia.
  • Sistemas operativos híbridos: Combinan diferentes estructuras para abordar rendimiento, seguridad y usabilidad. Ejemplos: Linux, Windows, macOS, iOS, Android.
  • Nanokernels: Núcleos aún más pequeños que los microkernels, delegando casi todos los servicios a aplicaciones para minimizar la demanda de memoria del núcleo. Usados en sistemas muy específicos.
  • Máquinas virtuales: Abstraen el hardware creando múltiples entornos de ejecución aislados, dando la ilusión de tener computadoras personales independientes.
  • Exokernels: Particionan los recursos de hardware y asignan subconjuntos a cada máquina virtual de nivel de usuario, permitiendo que cada una ejecute su propio sistema operativo restringido a sus recursos asignados. Buscan eliminar las abstracciones forzadas del SO tradicional, dando libertad a los desarrolladores para gestionarlas. Ventajas: mejor rendimiento, uso eficiente de recursos, desarrollo y pruebas más sencilla. Desventajas: menor coherencia, diseño complejo de la interfaz. Ejemplo: Némesis, ExOS.

Llamadas al Sistema Operativo

Son la interfaz entre un proceso y el sistema operativo, permitiendo a los procesos solicitar servicios del kernel. Se clasifican en:

  • Control de procesos
  • Manipulación de archivos
  • Manipulación de dispositivos
  • Mantenimiento de información
  • Comunicaciones

Seguridad y Mecanismos de Protección

La seguridad busca garantizar la identidad de los usuarios (autenticación) y definir sus privilegios. Los mecanismos de protección incluyen:

  • Protección del procesador: Se utilizan modos de ejecución (modo usuario y modo núcleo o privilegiado) para restringir las instrucciones que pueden ejecutar los programas de usuario y proteger las áreas críticas del sistema operativo. El cambio de modo se realiza mediante interrupciones (instrucción TRAP).
  • Protección de E/S: Se evita el acceso indiscriminado a los periféricos prohibiendo el acceso directo de los programas de usuario al mapa de E/S. Las solicitudes de acceso deben realizarse a través del sistema operativo.
  • Protección de memoria: Se evita que un programa acceda a áreas de memoria no asignadas. En sistemas sin memoria virtual se utilizan registros límite y base. En sistemas con memoria virtual, se restringe el espacio de direcciones accesible en modo usuario y cada proceso tiene su propia tabla de páginas con información de protección (lectura, escritura, ejecución) gestionada por la MMU (Memory Management Unit).

Activación del Sistema Operativo

El sistema operativo se activa a través de:

  • Llamadas al sistema emitidas por programas.
  • Interrupciones producidas por periféricos.
  • Condiciones de excepción o error del hardware.

La activación se realiza mediante interrupciones, ya sea a través de la instrucción TRAP para solicitar servicios o por interrupciones internas o externas.

Repaso de las Características del Hardware de los Sistemas Informáticos

Un sistema informático moderno incluye una o más CPUs y controladores de dispositivos conectados a través de un bus compartido y memoria compartida. Los sistemas operativos tienen drivers para cada controlador.

Arranque de la Computadora

Proceso de cargar el kernel en memoria para su ejecución. Involucra un cargador de arranque (BIOS o UEFI) que se encuentra en un firmware no volátil. El programa de arranque carga el kernel, realiza diagnósticos e inicializa el sistema. Gestores de arranque como GRUB (para Linux/UNIX) y cargadores específicos en sistemas móviles (como LK en Android) son relevantes.

Estructura de los Sistemas Informáticos

Pueden ser uniprocesador (con una CPU de un solo núcleo y posiblemente procesadores de propósito especial) o multiprocesador (con dos o más procesadores). Los microprocesadores modernos contienen núcleos, unidades de interfaz de bus, caché multinivel, registros, y a veces controladores de memoria. El núcleo incluye la unidad de control, unidad aritmético-lógica, unidad de coma flotante, TLB, MMU, caché, contador de programa, registro de instrucción, etc. Los sistemas multiprocesador pueden ser SMP (multiprocesamiento simétrico, donde cada procesador realiza todas las tareas) o NUMA (acceso no uniforme a la memoria, donde cada CPU tiene su propia memoria local). También existen servidores Blade y sistemas en clúster (poco acoplados, para alta disponibilidad o alto rendimiento).

Ciclo de Instrucción

Proceso básico de ejecución de programas por la CPU, que consiste en captar una instrucción de la memoria y luego ejecutarla. Incluye etapas como actualización del contador de programa, captación de instrucción, decodificación, búsqueda de operandos, ejecución, cálculo y almacenamiento del resultado. El contador de programa (CP) y el registro de instrucción (RI) son importantes en este ciclo. Las acciones de las instrucciones se dividen en procesador-memoria, procesador-E/S, procesamiento de datos y control.

Interrupciones

Mecanismo por el cual el hardware o un proceso señala a la CPU para que suspenda temporalmente la ejecución del programa actual y atienda un evento. Requiere salvar el estado del computador para poder restaurarlo. Los modos de operación de la CPU (activo, espera, supervisor, problema, enmascarado, desenmascarado) son relevantes. Se deben salvar el contador de programa y el registro de estado (PSW). Existe una instrucción especial de retorno de interrupción (RETI). Las interrupciones pueden ser externas (hardware) o internas (software o excepciones/trampas). Las interrupciones por hardware pueden ser enmascarables o no enmascarables. Las interrupciones por software incluyen llamadas al supervisor (SVC) y verificación de programa. El procesador guarda el contexto en la pila y ejecuta una rutina del sistema operativo para atender la interrupción. El ciclo de interrupción incluye la concesión y el tratamiento. Se utilizan técnicas como interrupciones vectorizadas para determinar la dirección de la rutina de tratamiento. El manejo de interrupciones múltiples puede ser desactivando las interrupciones durante el procesamiento o utilizando prioridades.

Jerarquía de Memoria

Los sistemas utilizan una jerarquía de memoria con diferentes niveles de velocidad, costo y volatilidad: registros, caché, memoria principal (RAM), almacenamiento secundario (HDD, SSD), y almacenamiento terciario. La memoria principal es volátil, por lo que se utiliza almacenamiento secundario no volátil para el almacenamiento permanente.

Elementos para las Operaciones de Entrada/Salida

Gran parte del código del SO se dedica a la gestión de E/S. El acceso directo a memoria (DMA) se utiliza para transferencias de datos a gran escala sin intervención constante de la CPU.

Creación y Finalización de Procesos

Creación de Procesos

Un nuevo proceso se crea para ejecutar un programa. El sistema operativo debe llevar a cabo varias acciones al crear un proceso, incluyendo:

  • Asignar un identificador único al proceso.
  • Determinar la prioridad inicial del proceso.
  • Asignar espacio para la imagen del proceso (código, datos, pila). La imagen del proceso se compone de:
    • Sección de texto: el código ejecutable.
    • Sección de datos: variables globales.
    • Sección de la pila: almacenamiento temporal de datos al invocar funciones (como parámetros de funciones, direcciones de retorno y variables locales).
  • Establecer los enlaces apropiados en las colas de planificación (Listos o Listos/Suspendidos).
  • Crear o ampliar otras estructuras de datos, como un archivo de contabilidad asociado al proceso.

Finalización de Procesos

Un proceso puede finalizar por diversas razones, clasificadas como:

  • Finalización Normal: El proceso ejecuta una llamada de servicio del sistema operativo para indicar que ha terminado de ejecutarse.
  • Exceso de Límites: Se ha excedido el límite de tiempo; el proceso se ha ejecutado durante más tiempo que el límite de tiempo total especificado.
  • Memoria no disponible: El proceso requiere más memoria de la que el sistema puede proporcionar.
  • Violación de los límites: El proceso intenta acceder a una posición de memoria a la que no está permitido acceder.
  • Error de protección: El proceso intenta utilizar un recurso, como un archivo, que no está autorizado a utilizar, o intenta utilizarlo de forma inadecuada, como escribir en un archivo de solo lectura.
  • Error aritmético: El proceso intenta un cálculo prohibido, como la división por cero, o intenta almacenar números más grandes de lo que el hardware puede acomodar.
  • Fallo de E/S: Se produce un error durante la entrada o la salida.
  • Instrucción no válida: El proceso intenta ejecutar una instrucción inexistente.
  • Instrucción privilegiada: El proceso intenta utilizar una instrucción reservada para el sistema operativo.
  • Uso indebido de datos: Un dato es de tipo incorrecto o no está inicializado.
  • Intervención Externa: El proceso ha esperado más de un máximo especificado para que se produzca un determinado evento.
  • Intervención del operador o del sistema operativo: Por alguna razón, el operador o el sistema operativo ha terminado el proceso.
  • Relaciones entre Procesos: Cuando un proceso padre termina, el sistema operativo puede terminar automáticamente todos los procesos hijos de ese padre.
  • Solicitud del padre: Un proceso padre suele tener la autoridad para terminar con cualquiera de sus descendientes.

Al finalizar, el proceso es liberado del conjunto de procesos ejecutables. El sistema operativo puede retener temporalmente información para programas de contabilidad o utilidades de rendimiento.

Estados de un Proceso y Transiciones

Se identifican varios estados por los que puede pasar un proceso durante su ciclo de vida:

  • NUEVO: Un proceso que acaba de ser creado, y el sistema operativo ha realizado tareas de mantenimiento, pero aún no se ha comprometido a su ejecución. El código del programa reside en almacenamiento secundario.
  • LISTO: Un proceso en memoria principal, esperando su turno para ser ejecutado.
  • EN EJECUCIÓN: El proceso que actualmente está utilizando la CPU (en sistemas uniprocesador, solo un proceso a la vez).
  • BLOQUEADO / EN ESPERA: El proceso está en memoria principal pero está esperando un evento (E/S, liberación de un recurso, etc.).
  • LISTO / SUSPENDIDO: El proceso está en memoria secundaria, pero está listo para su ejecución tan pronto como sea cargado en memoria principal.
  • BLOQUEADO / SUSPENDIDO: El proceso está en memoria secundaria y bloqueado.
  • TERMINADO: Un proceso que ha sido liberado del conjunto de procesos ejecutables por el sistema operativo, ya sea porque se ha detenido o porque ha abortado por alguna razón.

Transiciones entre Estados de Procesos

Las transiciones entre estos estados se describen como:

  • Nuevo a Listo: El proceso es admitido en la cola de listos en memoria principal.
  • Nuevo a Listo/Suspendido: No hay suficiente espacio en memoria principal, por lo que el nuevo proceso se suspende directamente a memoria secundaria.
  • Listo a En Ejecución: El planificador de la CPU selecciona el proceso para su ejecución.
  • En Ejecución a Bloqueado: El proceso solicita un recurso o evento por el cual debe esperar.
  • En Ejecución a Listo: Ocurre una interrupción (por ejemplo, por tiempo excedido), y el proceso vuelve a la cola de listos para esperar su próxima oportunidad en la CPU.
  • En Ejecución a Listo/Suspendido: Un proceso de mayor prioridad en la cola de Bloqueado/Suspendido se desbloquea, y el sistema operativo expulsa el proceso en ejecución a la cola de Listos/Suspendidos para liberar memoria.
  • Bloqueado a Listo: El evento por el cual el proceso estaba esperando ocurre.
  • Listo a Listo/Suspendido: El sistema operativo suspende un proceso listo para liberar memoria.
  • Bloqueado a Bloqueado/Suspendido: El sistema operativo decide suspender un proceso bloqueado para liberar memoria.
  • Listo/Suspendido a Listo: El sistema operativo trae un proceso listo suspendido de vuelta a la memoria principal.
  • Bloqueado/Suspendido a Bloqueado: El sistema operativo trae un proceso bloqueado suspendido de vuelta a la memoria principal.
  • En Ejecución a Terminado: El proceso finaliza su ejecución o es terminado por alguna razón.
  • Listo a Terminado: Aunque no se muestra explícitamente, un proceso en estado Listo podría ser terminado (por ejemplo, por una solicitud del padre).
  • Bloqueado a Terminado: Similar al anterior, un proceso bloqueado podría ser terminado.

La suspensión de procesos se realiza por varias razones, incluyendo la necesidad de liberar memoria, acciones de un proceso padre, solicitudes de usuarios interactivos (depuración), consideraciones de tiempo (procesos periódicos) y como parte de auditorías del sistema.

Bloque de Control de Procesos (BCP)

El sistema operativo mantiene un bloque de control de procesos para cada proceso, que contiene información esencial para su gestión. Esta información se divide en varias categorías:

  • Información de identificación del proceso:
    • Identificadores del proceso (PID).
    • Identificador del proceso que creó a este proceso (proceso padre) (PPID).
    • Identificador del usuario (UID).
  • Información de estado del procesador:
    • Registros visibles por el usuario: Registros a los que puede acceder el programa en modo usuario.
    • Registros de estado y control:
      • Contador de programa: contiene la dirección de la siguiente instrucción a ejecutar.
      • Códigos de condición: resultan de la operación lógica o aritmética más reciente (por ejemplo, signo, cero, acarreo, igual, desbordamiento).
      • Información de estado: incluyen los flags de interrupciones habilitadas/deshabilitadas, modo ejecución.
    • Puntero de pila: apunta a la parte más alta de la pila del sistema asociada al proceso.
  • Información de control de procesos:
    • Información de planificación: Prioridad, punteros a colas.
    • Información de gestión de memoria: Punteros a tablas de segmentos y/o páginas que describen la memoria virtual asignada.
    • Propiedad y utilización de los recursos: Lista de recursos controlados (archivos abiertos), histórico de utilización de CPU y otros recursos.
    • Privilegios de proceso: Permisos para acceder a memoria e instrucciones.

El BCP es fundamental para la conmutación de contexto, donde el estado de un proceso se guarda en su BCP y el estado del siguiente proceso a ejecutar se carga desde su BCP.

Modos de Ejecución

Para proteger el sistema operativo y sus estructuras de datos, se utilizan dos modos de ejecución:

  • Modo de usuario: Es el modo menos privilegiado y su denominación se debe a que los programas de usuario suelen ejecutarse en este modo.
  • Modo sistema (o kernel o control): Es el modo más privilegiado, también llamado modo control o modo kernel. Este último término se refiere al núcleo del sistema operativo, que es la parte del sistema operativo que abarca las funciones importantes del sistema.

La razón de esta distinción es porque resulta necesario proteger el sistema operativo y las tablas clave del sistema operativo, como los bloques de control de procesos, de la interferencia de los programas de usuario. En modo kernel, el software tiene control completo del procesador, sus instrucciones, registros y memoria.

El procesador sabe en qué modo debe ejecutarse mediante un bit en la palabra de estado del programa (PSW). El cambio de modo ocurre típicamente cuando un usuario realiza una llamada al sistema o cuando una interrupción desencadena una rutina del sistema operativo, pasando al modo kernel. Al retornar de la llamada al sistema o de la rutina de interrupción, el modo se revierte al modo usuario.

Hilos (Threads)

Un hilo se define como «una unidad básica de utilización de la CPU (Unidad de despacho); comprende un ID de hilo, un contador de programa (CP), un conjunto de registros y una pila.» A diferencia de los procesos, los hilos dentro del mismo proceso «Comparte con otros hilos pertenecientes al mismo proceso su sección de código, su sección de datos y otros recursos del sistema operativo, como archivos abiertos y señales.»

Un proceso tradicional tiene un único hilo de control. Los procesos con múltiples hilos (multihilo) pueden ejecutar más de una tarea a la vez, lo que es especialmente beneficioso en sistemas multinúcleo.

Ventajas de los Hilos

  • Se tarda mucho menos en crear un nuevo hilo en un proceso existente que en crear un proceso nuevo.
  • Menos tiempo en la conmutación entre hilos del mismo proceso que entre procesos diferentes.
  • Mejora el rendimiento en sistemas multiprocesador al permitir la ejecución paralela de hilos.
  • Permite un mejor diseño modular de programas con actividades concurrentes (por ejemplo, procesamiento en segundo plano).

Estados de los Hilos

Al igual que los procesos, los hilos tienen estados: Ejecución, Listo y Bloqueado. Generalmente, los estados de suspensión no se asocian directamente a los hilos, sino al proceso que los contiene.

Operaciones con Hilos

  • Generación: Un proceso puede crear nuevos hilos dentro de sí mismo.
  • Bloqueo: Un hilo se bloquea cuando necesita esperar un evento.
  • Desbloqueo: Cuando el evento esperado ocurre, el hilo pasa al estado Listo.
  • Finalización: Los recursos del hilo (contexto de registro, pila) se desasignan.

Implementación de Hilos

Existen dos categorías principales de implementación:

  • Hilos a Nivel de Usuario (ULT): La gestión de hilos la realiza la aplicación a través de una biblioteca de hilos. El núcleo del sistema operativo no conoce la existencia de estos hilos.
    • Ventajas: Conmutación rápida (no requiere modo kernel), planificación específica de la aplicación, portabilidad entre sistemas operativos.
    • Desventajas: Llamadas al sistema bloqueantes pueden bloquear todo el proceso, no se aprovecha el multiprocesamiento real (solo un hilo del proceso puede ejecutarse a la vez).
  • Hilos a Nivel del Núcleo (KLT): La gestión de hilos la realiza directamente el núcleo del sistema operativo.
    • Ventajas: El núcleo puede planificar múltiples hilos del mismo proceso en diferentes procesadores; si un hilo se bloquea, otros hilos del mismo proceso pueden seguir ejecutándose; las propias rutinas del núcleo pueden ser multihilo.
    • Desventajas: La conmutación de hilos requiere un cambio de modo al núcleo, lo que introduce más sobrecarga en comparación con los ULT.

Modelos de Relación entre Hilos y Procesos

Se describen varios modelos de relación:

  • 1:1 (Uno a Uno): Cada hilo de usuario se mapea a un hilo del núcleo. (Ejemplos: Windows, Linux, implementaciones UNIX tradicionales). Proporciona más concurrencia que el modelo muchos-a-uno al permitir que otro hilo se ejecute cuando un hilo hace una llamada al sistema de bloqueo. También permite que varios hilos se ejecuten en paralelo en los multiprocesadores. La desventaja es la sobrecarga potencial de crear muchos hilos del núcleo.
  • M:1 (Muchos a Uno): Múltiples hilos de usuario se mapean a un único hilo del núcleo. (Ejemplos: Algunas versiones antiguas de Java). La gestión de los hilos la realiza la biblioteca de hilos en el espacio de usuario, por lo que es eficiente. Sin embargo, todo el proceso se bloqueará si un hilo hace una llamada al sistema que se bloquea. Además, como solo un hilo puede acceder al núcleo a la vez, varios hilos no pueden ejecutarse en paralelo en los multiprocesadores. Este modelo tiene limitaciones significativas para aprovechar el multiprocesamiento.
  • 1:M (Uno a Muchos): Un hilo puede migrar entre diferentes procesos o espacios de direcciones (investigado principalmente en sistemas operativos distribuidos como Clouds y Emerald).
  • M:M (Muchos a Muchos): Múltiples hilos de usuario se mapean a un número menor o igual de hilos del núcleo. (Ejemplo: TRIX, y muchos sistemas modernos como Windows, Solaris y Linux). Combina atributos de M:1 y casos 1:M. Ofrece flexibilidad y la capacidad de aprovechar el paralelismo sin las limitaciones del modelo M:1.

En sistemas operativos modernos, se favorecen los modelos 1:1 y M:M para lograr un equilibrio entre eficiencia y capacidad de concurrencia.

Planificación de Procesos y CPU

La planificación de procesos es fundamental para la multiprogramación, cuyo objetivo es mantener la CPU ocupada para maximizar su utilización, y para el tiempo compartido, que busca intercambiar la CPU entre múltiples procesos de manera que los usuarios puedan interactuar con cada programa mientras se ejecuta. El planificador de procesos selecciona un proceso disponible para ejecutarlo en un núcleo de la CPU, recordando que cada núcleo solo puede ejecutar un proceso a la vez. En sistemas con múltiples núcleos, varios procesos pueden ejecutarse simultáneamente, mientras que, en sistemas de un solo núcleo, los procesos deben esperar su turno. El grado de multiprogramación se refiere al número de procesos presentes en la memoria.

La idea clave de la multiprogramación es que cuando un proceso necesita esperar (generalmente por una operación de E/S), la CPU se le retira y se asigna a otro proceso, utilizando así el tiempo de espera de forma productiva. Los procesos generalmente se clasifican como gobernados por E/S (pasan más tiempo en operaciones de entrada/salida) o gobernados por la CPU (realizan cálculos intensivos y solicitan E/S con poca frecuencia). La correcta planificación de la CPU es crucial para el diseño del sistema operativo, ya que casi todos los recursos del computador se planifican antes de su uso.

A medida que los procesos entran al sistema, se colocan en una cola de espera. El sistema operativo utiliza varias colas de planificación para gestionar los procesos desde su creación hasta su finalización:

  • Cola de procesos: Contiene la identificación de todos los procesos en el sistema.
  • Cola de procesos listos (o cola de listos): Contiene punteros a los bloques de control de procesos que están listos para ejecutarse.
  • Colas de dispositivos (o colas de espera): Contienen los procesos que están esperando la finalización de una operación de E/S.

Los procesos se mueven entre estas colas a lo largo de su ciclo de vida. La selección de qué proceso ejecutar a continuación la realiza el planificador asociado a cada cola. Una representación común es un diagrama con la cola de listos y un conjunto de colas de espera. Los procesos pueden pasar de la cola de listos a ejecución, y luego a una cola de espera por E/S, a una cola de espera de un hijo, o ser interrumpidos y volver a la cola de listos. Este ciclo continúa hasta que el proceso termina.

La ejecución de un proceso consiste en ciclos de ráfagas de CPU seguidas de esperas de E/S. La duración de estas ráfagas varía, pero generalmente hay muchas ráfagas de CPU cortas y pocas largas. Esta distribución es importante para la selección del algoritmo de planificación.

Niveles de Planificación de la CPU

La planificación de la CPU implica seleccionar de la cola de listos y asignar un núcleo de CPU a un proceso. Esta función se puede clasificar en tres niveles:

  • Planificación a Largo Plazo (o de Admisión)

    Decide qué programas se admiten en el sistema como procesos, controlando el grado de multiprogramación. Se ejecuta con poca frecuencia.

  • Planificación a Mediano Plazo (o de Intercambio)

    Decide qué procesos se mantienen en la memoria principal y disponibles para su ejecución. Está relacionada con la función de intercambio (swapping).

  • Planificación a Corto Plazo (o de la CPU o Activador)

    Decide qué proceso listo se ejecutará a continuación. Se ejecuta con mucha frecuencia y debe ser rápido.

La planificación afecta directamente el rendimiento del sistema al determinar qué procesos progresan y cuáles esperan. Es esencialmente una gestión de colas para minimizar retrasos y optimizar el rendimiento.

Cambio de Contexto

El cambio de contexto es el proceso de guardar el estado del proceso actual y restaurar el estado de otro proceso para permitir la ejecución de este último. Es una sobrecarga ya que no se realiza trabajo útil durante este tiempo. La velocidad del cambio de contexto depende del hardware.

Políticas de Planificación

Las políticas de planificación definen la función de selección del planificador, que determina qué proceso listo se elige para ejecutar. Esta selección puede basarse en prioridades, requisitos de recursos o características de ejecución del proceso.

Decisiones de Planificación de la CPU

Las decisiones de planificación de la CPU pueden ocurrir en cuatro circunstancias: cuando un proceso pasa de ejecución a espera, de ejecución a listo, de espera a listo o cuando termina. Si la planificación solo ocurre en la primera y la última, se denomina no apropiativa (o cooperativa o sin expulsión). De lo contrario, es apropiativa (o con expulsión). La planificación apropiativa puede generar mayor sobrecarga pero ofrece un mejor servicio general al evitar que un proceso monopolice la CPU por mucho tiempo. Sin embargo, puede causar condiciones de carrera en datos compartidos. Los núcleos del sistema operativo también pueden ser no apropiativos o apropiativos, con implicaciones para la complejidad y la capacidad de respuesta en tiempo real.

El Despachador

El despachador es el módulo que asigna el control de la CPU al proceso seleccionado por el planificador. Esto implica cambiar el contexto, cambiar al modo de usuario y saltar a la ubicación adecuada en el programa del usuario. El tiempo que tarda el despachador se conoce como latencia de despacho. Los cambios de contexto pueden ser voluntarios (el proceso cede la CPU por un recurso) o no voluntarios (la CPU se retira al proceso).

Criterios de Planificación

Los criterios de planificación se utilizan para evaluar las políticas de programación y optimizar el comportamiento del sistema. Algunos criterios importantes incluyen:

  • Rendimiento (Tasa de procesamiento): Número de procesos completados por unidad de tiempo.
  • Tiempo de permanencia (Tiempo de respuesta para lotes): Tiempo total desde la presentación hasta la finalización del proceso.
  • Tiempo de espera: Suma de los periodos de espera en la cola de listos.
  • Tiempo de respuesta (para interactivos): Tiempo desde el envío de una solicitud hasta que comienza la respuesta.
  • Plazos (Tope): Cumplimiento de los tiempos de finalización establecidos.
  • Previsibilidad: Consistencia en el tiempo de ejecución y el costo.
  • Utilización del procesador: Porcentaje de tiempo que la CPU está ocupada.
  • Equidad: Trato igualitario a los procesos, evitando la inanición.
  • Aplicación de las prioridades: Favorecer los procesos de mayor prioridad.
  • Equilibrado de los recursos: Mantener ocupados todos los recursos del sistema.

Estos criterios pueden ser orientados al usuario (percepción del usuario) o orientados al sistema (eficiencia del procesador), y pueden estar relacionados con el rendimiento (cuantitativos) o no. El diseño de una política de planificación implica compromisos entre estos criterios, dependiendo de la naturaleza del sistema.

Algoritmos de Planificación Monoprocesador

Existen diversos algoritmos de planificación monoprocesador, categorizados por su uso en sistemas de procesamiento por lotes o sistemas interactivos.

Algoritmos para Sistemas por Lotes

En sistemas de procesamiento por lotes, algunos algoritmos comunes son:

  • FCFS (First Come First Served): El primer proceso en llegar a la cola de listos es el primero en ser ejecutado. Simple pero puede generar un «efecto convoy» donde procesos cortos esperan detrás de procesos largos.
  • SJF (Shortest Job First): Se asigna la CPU al proceso con la siguiente ráfaga de CPU más corta. Óptimo para minimizar el tiempo medio de espera, pero requiere conocer la duración de la siguiente ráfaga (generalmente estimada). Puede ser apropiativo (SRTFShortest Remaining Time First) o no apropiativo.
  • SPN (Shortest Process Next): Similar a SJF pero no apropiativo, selecciona el proceso con el tiempo de procesamiento más corto esperado.
  • HRRN (Highest Response Ratio Next): Selecciona el proceso con la mayor tasa de respuesta ((tiempo de espera + tiempo de servicio) / tiempo de servicio), favoreciendo trabajos cortos, pero también considerando la antigüedad de los trabajos largos.

Algoritmos para Sistemas Interactivos

En sistemas interactivos, se utilizan algoritmos como:

  • Planificación por Prioridades: A cada proceso se le asigna una prioridad y se ejecuta el de mayor prioridad. Puede ser apropiativa o no apropiativa. Un problema es la inanición de procesos de baja prioridad, que puede solucionarse con envejecimiento (aumentar gradualmente la prioridad con el tiempo de espera). Se puede combinar con Round Robin para procesos de igual prioridad.
  • Round Robin (RR): Cada proceso recibe una pequeña porción de tiempo (quantum) de la CPU. Si no termina, vuelve a la cola de listos. Efectivo para tiempo compartido, pero puede ser ineficiente si el quantum es demasiado pequeño o degenerar en FCFS si es demasiado grande.
  • Planificación mediante Colas Multinivel: La cola de listos se divide en varias colas con diferentes prioridades y algoritmos de planificación para cada una. Los procesos se asignan permanentemente a una cola. Debe haber planificación entre las colas (ej., prioridad fija apropiativa).
  • Planificación mediante Colas Multinivel con Retroalimentación: Similar a las colas multinivel, pero los procesos pueden moverse entre las colas según su comportamiento (ej., si usa demasiado CPU, baja de prioridad; si espera mucho, sube). Utiliza prioridad dinámica y a menudo expulsión por quantum.
  • Planificación Garantizada: Intenta cumplir la promesa de que si hay ‘n’ usuarios, cada uno recibirá aproximadamente 1/n de la potencia de la CPU.
  • Planificación de la Lotería: Se otorgan «boletos de lotería» a los procesos para acceder a los recursos (ej., tiempo de CPU). El proceso con el boleto ganador obtiene el recurso. La cantidad de boletos refleja la importancia del proceso.
  • Planificación Equitativa: Considera a qué usuario pertenece un proceso al planificar, asignando una fracción de la CPU a cada usuario independientemente del número de procesos.

Planificación en Sistemas de Tiempo Real

La planificación en sistemas de tiempo real es crucial cuando el tiempo es un factor esencial. Las tareas pueden ser de tiempo real duro (deben cumplir su plazo) o de tiempo real suave (blando) (el plazo es deseable pero no obligatorio). Los eventos pueden ser periódicos (a intervalos regulares) o aperiódicos (impredecibles). Los algoritmos pueden ser estáticos (decisiones antes de la ejecución) o dinámicos (decisiones en tiempo de ejecución). Algunos enfoques incluyen planificación estática dirigida por tabla, planificación estática expulsiva dirigida por prioridad (ej., algoritmo de tasa monótona), enfoques basados en la planificación dinámica y enfoques dinámicos de mejor esfuerzo.

Conceptos importantes en la planificación en tiempo real son la latencia (tiempo desde que ocurre un evento hasta que se le atiende), que incluye la latencia de interrupción y la latencia de despacho. La planificación basada en prioridades con preferencia es común, asignando las prioridades más altas a las tareas en tiempo real. La planificación por plazos (Earliest Deadline FirstEDF) prioriza la tarea con el plazo más cercano. La planificación de tasa monótona (RMS) asigna prioridades según los periodos (periodo más corto = mayor prioridad). Un problema es la inversión de prioridad (una tarea de alta prioridad debe esperar a una de baja), que puede resolverse con el protocolo de herencia de prioridad o el protocolo de techo de prioridad.

Planificación Multiprocesador y Multinúcleo

La planificación multiprocesador y multinúcleo considera sistemas con múltiples unidades de procesamiento. El multiprocesamiento asimétrico asigna la planificación y las E/S a un solo procesador maestro, mientras que el multiprocesamiento simétrico (SMP) permite que cada procesador se autoplanifique, utilizando una cola de espera común o colas por procesador. El uso de colas por procesador puede mejorar la afinidad del procesador (mantener un proceso en el mismo procesador para aprovechar la caché). El equilibrio de carga es importante para distribuir el trabajo uniformemente entre los procesadores. La granularidad del paralelismo (frecuencia de sincronización entre procesos) influye en la estrategia de planificación.

Planificación de Hilos en Multiprocesadores

En la planificación de hilos en multiprocesadores, existen enfoques como compartición de carga (cola global de hilos listos), planificación en pandilla (planificar un conjunto de hilos relacionados simultáneamente en un conjunto de procesadores), asignación de procesador dedicado (asignar un conjunto de procesadores a una aplicación durante su ejecución) y planificación dinámica (el número de hilos puede cambiar durante la ejecución).

Planificación en Procesadores Multinúcleo

Los procesadores multinúcleo (múltiples núcleos en un chip) pueden usar multihilo (múltiples hilos de hardware por núcleo) para mejorar el rendimiento. La planificación debe considerar tanto qué hilo de software ejecutar en cada hilo de hardware como cómo cada núcleo decide qué hilo de hardware ejecutar. La afinidad del procesador y la conciencia de la arquitectura de caché (compartida o dedicada) son importantes en la planificación multinúcleo. El multiprocesamiento heterogéneo (HMP) utiliza núcleos con diferentes características de rendimiento y consumo de energía.

Evaluación de Algoritmos de Planificación

La evaluación de los algoritmos de planificación es crucial para seleccionar la política adecuada. Los criterios de selección deben definirse primero, y luego los algoritmos pueden evaluarse mediante modelado determinista, análisis de colas, modelos de simulación o implementación real. La complejidad de los algoritmos y la sobrecarga que introducen también deben considerarse.

Concurrencia en Sistemas Operativos

La concurrencia es la propiedad de los sistemas operativos que permite la ejecución simultánea de múltiples procesos que potencialmente pueden interactuar. Se presenta en sistemas de multiprogramación con un único procesador (concurrencia simulada), multiprocesadores (concurrencia real) y sistemas distribuidos. Facilita la programación y puede acelerar cálculos, aunque presenta desafíos en la gestión de recursos y la depuración.

Procesos Independientes y Cooperativos

Los procesos pueden ser independientes (no se afectan mutuamente) o cooperativos (diseñados para trabajar juntos, compartiendo datos y comunicándose). La interacción entre procesos puede deberse a la competencia por recursos (requiriendo regulación por el SO) o a la necesidad de comunicación y sincronización para un objetivo común. Esta interacción se clasifica según el grado de percepción que los procesos tienen unos de otros, lo que conlleva problemas de control como el interbloqueo, la exclusión mutua y la inanición.

El Problema de la Sección Crítica

El problema de la sección crítica surge cuando múltiples procesos necesitan acceder a un recurso compartido. Una solución a este problema debe garantizar la exclusión mutua (solo un proceso a la vez en la sección crítica), el progreso (la decisión de quién entra no se pospone indefinidamente) y la espera limitada (un proceso que espera entrar no se retrasa indefinidamente por otros procesos).

Soluciones a la Sección Crítica

Existen diversas soluciones al problema de la sección crítica:

  • Deshabilitar interrupciones (solo en monoprocesadores).
  • Sincronización por hardware mediante instrucciones atómicas (con espera activa).
  • Algoritmos de software como el de Dekker (para dos procesos) y Peterson (para dos procesos con ciertas restricciones).
  • Variables atómicas para garantizar actualizaciones atómicas de una sola variable.
  • Bloqueos Mutex para proteger secciones críticas mediante las operaciones de adquirir y liberar el bloqueo.
  • Semáforos, que son variables enteras manipuladas mediante operaciones atómicas wait() y signal(), utilizados tanto para la exclusión mutua (semáforos binarios o mutex) como para la sincronización (semáforos contadores). Pueden ser fuertes (con política de cola FIFO) o débiles.
  • Monitores, que son construcciones del lenguaje de programación que proporcionan exclusión mutua implícita y sincronización mediante variables condición y las operaciones cwait() y csignal() (en el monitor de Hoare) o cnotify() y cbroadcast() (en el monitor de Lampson/Redell).

Comunicación Interprocesos (IPC)

La comunicación interprocesos (IPC) permite a los procesos cooperativos intercambiar información. Hay dos modelos principales:

  • Memoria compartida, donde una región de memoria es accesible por varios procesos, ofreciendo comunicación rápida pero requiriendo coordinación manual para evitar problemas de concurrencia.
  • Paso de mensajes, donde los procesos se comunican enviando y recibiendo mensajes. Puede ser directo (nombrando explícitamente al comunicador) o indirecto (a través de buzones de correo). La comunicación puede ser síncrona (con bloqueo) o asíncrona (sin bloqueo), y los mensajes pueden almacenarse en búferes de capacidad cero, limitada o ilimitada.

Operaciones Atómicas

Las operaciones atómicas son secuencias de instrucciones que se ejecutan de forma indivisible, sin ser interrumpidas. Son fundamentales para evitar condiciones de carrera y garantizar la integridad de los datos en entornos concurrentes. En sistemas monoprocesador, se pueden lograr deshabilitando interrupciones, mientras que en multiprocesadores se suelen utilizar instrucciones de hardware especiales. El concepto de atomicidad también es crucial en el contexto de las transacciones, donde una serie de operaciones deben tratarse como una unidad lógica indivisible.

Conceptos Clave de Concurrencia

  • Concurrencia: Definición y Arquitecturas

    La concurrencia es la capacidad de los sistemas operativos para ejecutar múltiples procesos simultáneamente, permitiendo la interacción entre ellos.

    Se presenta en tres arquitecturas:

    • Multiprogramación con un solo procesador: Simula simultaneidad alternando procesos rápidamente.
    • Multiprocesador: Ejecución real simultánea, al haber múltiples CPU que comparten memoria.
    • Multicomputadora o sistemas distribuidos: Procesadores independientes que se comunican por red mediante paso de mensajes.
  • Ventajas y Desventajas de la Concurrencia

    Ventajas:
    • Facilita la programación modular.
    • Acelera cálculos al dividir tareas.
    • Mejora el uso interactivo multiusuario.
    • Aprovecha mejor los recursos disponibles.
    Desventajas:
    • Complejidad en la gestión de recursos.
    • Dificultad en dividir cálculos.
    • Problemas como interbloqueo, exclusión mutua e inanición.
    • Errores no deterministas difíciles de depurar.
  • Tipos de Procesos Concurrentes

    • Independientes: No comparten datos ni se afectan entre sí.
    • Cooperativos: Comparten recursos, deben comunicarse y sincronizarse.
  • Interacción entre Procesos

    • Competencia: Por recursos compartidos, sin comunicación directa. Genera conflictos como:
      • Interbloqueo: Dos o más procesos esperan indefinidamente.
      • Exclusión mutua: Solo un proceso puede usar un recurso crítico a la vez.
      • Inanición: Un proceso nunca accede a un recurso porque siempre se le da a otros.
    • Cooperación por compartición: Los procesos acceden a los mismos datos (memoria, archivos, etc.). Deben mantenerse la integridad y coherencia de datos.
    • Cooperación por comunicación: Intercambio de mensajes. No se comparte espacio de memoria pero se sincronizan por el flujo de mensajes.
  • Comunicación Interprocesos (IPC)

    Modelos:
    • Memoria compartida: Acceso rápido, útil dentro de un solo sistema.
    • Paso de mensajes: Útil en sistemas distribuidos. Permite:
      • Comunicación directa (el proceso debe conocer el ID del otro).
      • Comunicación indirecta (a través de buzones).
    Modalidades:
    • Bloqueante (síncrono): El proceso espera hasta recibir o enviar.
    • No bloqueante (asíncrono): El proceso continúa sin esperar.
    Búferes (colas):
    • Capacidad cero: No se almacena nada, requiere sincronización inmediata.
    • Capacidad limitada o ilimitada: Permite almacenar mensajes según la cola.
  • Problemas de la Sección Crítica

    Ocurre cuando varios procesos acceden a una misma porción de código que manipula recursos compartidos.

    Condición de carrera: Resultado impredecible dependiendo del orden de ejecución.

    Soluciones clásicas:
    • Deshabilitar interrupciones (solo monoprocesadores).
    • Instrucciones atómicas (leer-escribir combinados, soporte de hardware).
    • Algoritmos: Dekker, Peterson (para 2 procesos).
    • Variables atómicas: Garantizan operaciones indivisibles.
    • Mutex (mutual exclusion): Bloqueo explícito.
    • Semáforos y Monitores: Control de acceso más estructurado.
    • Transacciones: Unidad lógica de trabajo con garantía de atomicidad.
  • Requisitos para Protocolos de Sección Crítica

    • Exclusión mutua: Solo un proceso en la sección crítica.
    • Progreso: No debe haber bloqueos innecesarios.
    • Espera limitada: Evitar inanición.
  • Diseño del Sistema Operativo en Contexto Concurrente

    El SO debe:

    • Mantener control de múltiples procesos.
    • Asignar recursos (CPU, memoria, archivos, E/S).
    • Proteger datos y garantizar independencia en la ejecución.
    • Detectar y manejar condiciones de carrera en estructuras internas del kernel.

Interbloqueo (Deadlock)

Un abrazo mortal, también conocido como interbloqueo o deadlock, se define como una situación en la que un conjunto de procesos quedan bloqueados permanentemente, cada uno esperando un recurso que está siendo retenido por otro proceso del mismo conjunto. Generalmente, esta espera es por la liberación de algún recurso solicitado que solo puede ser liberado por otro proceso que también está bloqueado en el mismo ciclo de espera.

Condiciones para el Interbloqueo

Para que ocurra un abrazo mortal, deben cumplirse cuatro condiciones de manera conjunta:

  • Exclusión mutua: Los recursos que son utilizados de forma no compartida solo pueden ser accedidos por un proceso a la vez. Si un proceso tiene un conjunto de recursos, otros procesos no pueden usarlos hasta que el primero haya terminado de utilizarlos y liberarlos.
  • Espera y retención: Un proceso que está esperando la asignación de un nuevo recurso no libera los recursos que ya tiene asignados.
  • Sin desalojo: Los recursos que ya han sido asignados a un proceso no pueden ser quitados de este a la fuerza mientras los necesite. Si un proceso tiene recursos y no se le pueden asignar otros que necesita, no se le pueden quitar los que ya posee.
  • Espera circular: Existe una cadena de dos o más procesos donde cada proceso está esperando un recurso que está retenido por el siguiente proceso en la cadena, y este a su vez está esperando un recurso que está retenido por otro proceso, cerrando el círculo.

Es importante destacar que las tres primeras condiciones son necesarias, pero no suficientes para que exista un abrazo mortal. La cuarta condición es una consecuencia potencial de las tres primeras, ya que, si estas se dan, puede producirse una secuencia de eventos que desemboque en una espera circular irresoluble. Las cuatro condiciones en conjunto constituyen una condición necesaria y suficiente para el abrazo mortal.

Clasificación de Recursos

Los recursos se pueden clasificar de varias maneras:

  • Reutilizables: Son aquellos que pueden ser usados por un proceso y luego liberados para que otros procesos los utilicen nuevamente, sin agotarse. Ejemplos incluyen procesadores, memoria principal y secundaria.
  • Consumibles: Son aquellos que se crean o producen y dejan de existir una vez que un proceso los usa. Ejemplos incluyen mensajes, semáforos e interrupciones.
  • Compartidos: Pueden ser usados simultáneamente por varios procesos.
  • Exclusivos: Solo pueden ser usados por un proceso a la vez.
  • Expropiables: Su estado puede ser guardado para una posterior restauración.
  • No expropiables: Su estado no puede ser restaurado a un instante previo a su expropiación.

El estado del sistema en cuanto a la asignación de recursos y procesos se puede representar mediante un grafo de asignación de recursos (GAR). Este es un grafo dirigido donde los nodos representan procesos (círculos) y recursos (cuadrados, con un círculo dentro por cada instancia del recurso). Las aristas representan:

  • Aristas de asignación: Van de un recurso a un proceso, indicando que el proceso tiene asignada una unidad de ese recurso.
  • Aristas de solicitud: Van de un proceso a un recurso, indicando que el proceso está esperando una unidad de ese recurso.

En un GAR, si no hay ciclos, no existe abrazo mortal. Si hay un ciclo y cada recurso en el ciclo tiene solo una instancia, entonces existe un abrazo mortal. Si hay ciclos y recursos con múltiples instancias, la existencia de un ciclo es una condición necesaria pero no suficiente para un abrazo mortal.

Alternativamente, el estado del sistema se puede representar mediante matrices:

  • Matriz de asignación (MA): Indica cuántas unidades de cada recurso están asignadas a cada proceso.
  • Matriz de solicitud (MS): Indica cuántas unidades de cada recurso está esperando cada proceso.
  • Vector de recursos existentes (VR): Indica el número total de unidades de cada recurso en el sistema.
  • Vector de recursos disponibles (VD): Indica el número de unidades de cada recurso que están libres en un momento dado.

Estrategias para Manejar el Interbloqueo

Existen varias estrategias para manejar los abrazos mortales:

  • Prevención: Consiste en diseñar el sistema de forma que sea imposible que se cumpla alguna de las cuatro condiciones necesarias para el abrazo mortal. Esto se puede hacer de forma indirecta (evitando las tres primeras condiciones) o directa (evitando la espera circular). Técnicas incluyen aplicar la exclusión mutua solo cuando sea necesario, asegurar que los procesos soliciten todos los recursos que necesiten al mismo tiempo, permitir la apropiación de recursos cuando sea factible, y definir un orden lineal para la solicitud de recursos. Sin embargo, estas estrategias pueden llevar a una baja utilización de los recursos.
  • Predicción (Evitación): Implica decidir dinámicamente si la concesión de una solicitud de recurso actual podría llevar a un abrazo mortal. Requiere que los procesos declaren por adelantado el máximo de recursos que pueden necesitar. Dos enfoques principales son la negativa de iniciación de procesos (no iniciar un proceso si sus demandas pueden causar interbloqueo) y la negativa de asignación de recursos (no conceder una solicitud si puede llevar a interbloqueo), como el algoritmo del banquero.
  • Detección y recuperación: No se restringe el acceso a los recursos, pero periódicamente se ejecuta un algoritmo para detectar si existe un abrazo mortal y, en caso afirmativo, se aplica una estrategia para recuperar el sistema. Los algoritmos de detección utilizan las matrices de asignación y solicitud, así como el vector de recursos disponibles, para identificar procesos bloqueados en un ciclo de espera. Las estrategias de recuperación incluyen abortar todos los procesos bloqueados, retroceder los procesos a un punto de control previo, abortar procesos sucesivamente hasta eliminar el interbloqueo, o apropiarse de recursos de forma sucesiva hasta romper el ciclo.
  • Ignorar: También conocido como el algoritmo del avestruz, consiste en ignorar el problema, asumiendo que los abrazos mortales son muy poco frecuentes o que su impacto es mínimo. Esta es la estrategia empleada en muchos sistemas operativos de propósito general.

Deja un comentario