Download Capitulo 1 - Página en Construcción

Document related concepts

Núcleo (informática) wikipedia , lookup

Sistema operativo wikipedia , lookup

Arquitectura de Windows NT wikipedia , lookup

Interrupción wikipedia , lookup

Windows NT wikipedia , lookup

Transcript
Resumen de Sistemas Operativos
Índice
Capítulo 1__________________________________Página 2
Capítulo 2__________________________________Página 5
Capítulo 3__________________________________Página 11
Capítulo 4__________________________________Página 15
Capítulo 5__________________________________Página 19
Capítulo 6__________________________________Página 25
Capítulo 9__________________________________Página 26
Capítulo 10_________________________________Página 28
Capítulo 7__________________________________Página 31
Capítulo 8__________________________________Página 32
Capítulo 11_________________________________Página 37
Capítulo 12_________________________________Página 41
Capítulo 13_________________________________Página 46
Capítulo 14_________________________________Página 50
Capítulo 15_________________________________Página 54
1
Capitulo 1
Introducción a los Sistemas Informáticos
1.1.
Elementos básicos
Al más alto nivel, un sistema informático consta de procesador, memoria y componentes de E/S, con uno o más módulos en
cada tipo. Existen cuatro elementos estructurales principales:
 Procesador: controla la operación del computador y lleva a cabo las funciones del procesamiento de datos.
 Memoria principal: Almacena los datos y los programas.
 Módulos de E/S: Transportan los datos entre el computador y su entorno exterior. El entorno exterior consta de una
variedad de dispositivos externos, incluyendo los dispositivos de memoria secundaria, los equipos de comunicación
y los terminales.
 Interconexión entre sistemas: ciertos mecanismos y estructuras que permiten la comunicación entre procesadores,
memoria principal y módulos de E/S.
Una de las funciones del procesador es intercambiar los datos con la memoria. Para este propósito, normalmente hace uso
de dos registros internos del procesador: un registro de direcciones de memoria (MAR, Memory Address Register), el cual
especifica la dirección en la memoria de la próxima lectura o escritura y un registro intermedio de memoria (MBR, Memory
Buffer Register), que contiene los datos que van a ser escritos en la memoria o que fueron leídos de la misma. Del mismo
modo, un registro de direcciones de E/S (I/O AR, Input/Output Address Register) especifica un dispositivo particular de E/S,
y un registro intermedio de E/S (I/O BR, Input/Output Buffer Register) intercambia datos entre un módulo de E/S y el
procesador.
1.2.
Registro del procesador
Los registros del procesador sirven para dos funciones:
 Registros visibles de usuario: permite al programador de lenguaje de maquina o ensamblador minimizar las
referencias a la memoria principal, optimizando el uso de estos registros.
 Registros de control de estado: Son utilizados por el procesador para el control de las operaciones y rutinas
privilegiadas del sistema operativo para controlar la ejecución de los programas.
Registros visibles de usuario
Un registro visible de usuario es aquel que puede ser referenciado por medio del lenguaje de máquina que ejecuta el
procesador y está generalmente disponible para todos los programas, incluyendo tanto los de aplicación como los del
sistema. Las clases de registro, que normalmente están disponibles, son los registros de datos, los registros de dirección y
los registros de códigos de condición.
Los registros de datos pueden ser asignados por el programador a diversas funciones.
Los registros de dirección contienen direcciones de la memoria principal de datos e instrucciones o contener una parte de la
dirección, que se utiliza en el cálculo de la dirección completa o efectiva.
Registros de control y de estado
Varios registros se emplean para controlar las operaciones del procesador. En la mayoría de las maquinas, la mayor parte
de estos registros no son visibles para los usuarios. Además de los registros MAR, MBR, I/O AR y I/O BR mencionados
anteriormente, los siguientes registros son esenciales en la ejecución de instrucciones:
 Contador de programa (PC, Program Counter): contiene la dirección de la instrucción a ser leída.
 Registros de instrucción (IR, Instruction Register): contiene la última instrucción leída.
Todos los diseños de procesadores incluyen además un registro o conjunto de registros, conocidos a menudo como palabra
de estado del programa (PSW, Program Status Word), que contiene la información de estado. Normalmente, la PSW
contiene códigos de condición junto a otra información de estado, como un bit que indica si las interrupciones están o no
habilitadas y un bit que indica el estado usuario o supervisor.
1.3.
Ejecución de instrucciones
Un programa para ser ejecutado por el procesador consta de un conjunto de instrucciones almacenadas en memoria. En su
forma más simple el procesamiento de instrucciones está formado por dos pasos: el procesador lee las instrucciones desde
la memoria y ejecuta cada una de ellas. La ejecución de un programa consiste en la repetición de este proceso de lectura y
ejecución de instrucciones. La ejecución de una instrucción puede involucrar varias operaciones y ello depende de la
naturaleza de la instrucción.
El procesamiento requerido para una instrucción se llama ciclo de instrucción.
Funciones de E/S
Los módulos de E/S pueden intercambiar datos directamente con el procesador. Al igual que el procesador puede iniciar
una lectura o escritura en la memoria, el procesador también puede leer datos de un módulo de E/S o escribir datos en un
módulo de E/S.
2
En algunos casos, es conveniente permitir que los intercambios de E/S se produzcan directamente con la memoria, para
revelar al procesador de la tarea de E/S. En tal caso, el procesador otorgará autoridad a un módulo de E/S para leer o
escribir en la memoria, de modo que la transferencia de E/S se produce sin obstruir el procesador. Esta operación se
conoce como acceso directo a la memoria (DMA, Direct Memory Access).
1.4.
Interrupciones
Las interrupciones aparecen, principalmente, como una vía para mejorar la eficacia del procesamiento. Por ejemplo, la
mayoría de los dispositivos externos son mucho más lentos que el procesador.
Clases de interrupciones
De programa: Generadas por alguna condición que se produce como resultado de la ejecución de una instrucción como el
desbordamiento aritmético, la división por cero, el intento de ejecutar una instrucción ilegal de la maquina o una referencia a
una zona de memoria que fuera del espacio permitido al usuario.
De reloj: Generadas por un reloj interno del procesador.
De E/S: Generadas por un controlador de E/S para indicar que una operación ha terminado normalmente o para indicar
diversas condiciones de error.
Por fallo de hardware: Generadas por fallos tales como un corte de energía o un error de paridad de la memoria.
Las interrupciones y el ciclo de instrucción
Con las interrupciones y el ciclo de instrucción se puede dedicar a la ejecución de otras instrucciones mientras una
operación de E/S está en proceso.
Para dar cabida a las interrupciones, se añade un ciclo de interrupción al ciclo de instrucción. En el ciclo de interrupción, el
procesador comprueba si ha ocurrido alguna interrupción, indicando por la presencia de una señal de interrupción si no hay
interrupciones pendientes, el procesador continúa con el ciclo de lectura y trae la próxima instrucción del programa en
curso. Si hay una interrupción pendiente, el procesador suspende la ejecución del programa en curso y ejecuta una rutina
de tratamiento de la interrupción.
Tratamiento de las interrupciones
Una interrupción desencadena una serie de sucesos, tanto en el hardware del procesador como en el software. Cuando un
dispositivo de E/S completa una operación de E/S, se produce en el hardware la siguiente secuencia de sucesos:
1. El dispositivo emite una señal de interrupción al procesador.
2. El procesador finaliza la ejecución de la instrucción en curso antes de responder a la interrupción.
3. El procesador pregunta por la interrupción, comprueba que hay una y envía una señal de reconocimiento al
dispositivo que generó la interrupción.
4. El procesador necesita ahora prepararse para transferir el control a la rutina de interrupción. Para empezar, es
preciso salvar la información necesaria para abandonar la ejecución del programa en curso en el punto de
interrupción.
5. El procesador carga ahora el contador del programa, con la ubicación de entrada del programa de tratamiento de la
interrupción, que responderá a esta interrupción.
Una vez que se ha cargado el contador de programa, el procesador continúa con el próximo ciclo de instrucción,
que comienza trayendo la próxima instrucción.
La ejecución de este programa se traduce en las operaciones siguientes:
6. En este punto, el contador del programa y la PSW relativa al programa interrumpido se han salvado en la pila del
sistema. En particular se necesita salvar el contenido de los registros del procesador, ya que estos registros pueden
ser utilizados por la rutina de tratamiento de interrupción.
7. La rutina de tratamiento de interrupción puede ahora proceder a procesar la interrupción. Esto incluirá un examen
del estado de la información relativa a la operación de E/S o a cualquier otro evento que haya causado la
interrupción.
8. Cuando se completa el tratamiento de la interrupción, se recupera de la pila los valores de los registros que se
salvaron y se restauran sobre los registros del procesador.
9. La operación final es restaurar los valores de la PSW y del contador del programa a partir de la pila.
Interrupciones múltiples
Pueden producirse múltiples interrupciones, por ejemplo, un programa puede estar recibiendo datos de una línea de
comunicaciones e imprimiendo resultados. La impresora generará una interrupción cada vez que se completa una operación
de impresión. El controlador de la línea de comunicaciones generará una interrupción cada vez que llega una unidad de
datos.
Hay dos enfoques para tratar las interrupciones múltiples. El primero es inhabilitar las interrupciones mientras se este
procesando una. Una interrupción inhabilitada quiere decir que el procesador ignorará la señal de interrupción. Si durante
este tiempo se produce una interrupción, este generalmente quedará pendiente y será comprobada por el procesador
después de que éste habilite las interrupciones.
La limitación de este enfoque es que no tiene en cuenta las prioridades relativas o necesidades críticas de tiempo.
Un segundo enfoque es definir prioridades para las interrupciones y permitir que una interrupción de una prioridad más alta
pueda interrumpir a la rutina de tratamiento de una interrupción de prioridad más baja.
Multiprogramación
Permite que varios programas de usuario estén activos a un mismo tiempo. Cuando el procesador tiene que tratar con una
serie de programas, el orden en que estos se ejecutan dependerá de su prioridad relativa y de si están esperando E/S.
Cuando un programa es interrumpido y se transfiere el control a la rutina de tratamiento de la interrupción, una vez que ésta
haya terminado, puede que no se devuelva el control inmediatamente al programa de usuario que estaba ejecutándose en
el momento de la interrupción.
3
1.5.
Jerarquía de la memoria
El tipo de memoria más rápida, pequeña y cara, consta de los registros internos del procesador. Normalmente, un
procesador tendrá unas pocas docenas de registros, aunque algunas máquinas poseen cientos de estos registros. Bajando
dos niveles se tiene la memoria principal, que es la memoria interna más importante del computador. La memoria principal
se suele ampliar con una pequeña memoria cache de alta velocidad.
Las tres formas de memoria descritas son, generalmente, volátiles y emplean tecnologías de semiconductores. Los datos se
almacenan de manera permanente en dispositivos externos de almacenamiento masivo, de los cuales los más comunes
son los discos duros y los dispositivos extraíbles, como disquetes, cintas y memorias ópticas. La memoria externa, no
volátil, también denominada memoria secundaria o auxiliar.
1.6.
Memoria Cache
Aunque la memoria cache es invisible para el sistema operativo, interactúa con otras partes del hardware de gestión de
memoria.
Principios de la cache
La memoria cache intenta obtener una velocidad cercana a la de las memorias más rápidas disponibles y, al mismo tiempo,
proporcionar una memoria grande al precio de las memorias de semiconductores, que son menos costosas. Existe una
memoria principal más lenta y relativamente grande, junto a una memoria cache más pequeña y más rápida. La cache
contiene una copia de una parte de la memoria principal. Cuando el procesador intenta leer una palabra de la memoria, se
comprueba si la palabra determinada está en la memoria cache. Si es así, la palabra se envía al procesador. Si no, un
bloque de memoria principal, formado por un número fijo de palabras se introduce en la cache y, después, la palabra se
envía al procesador.
Diseño de la cache
A medida que aumenta el tamaño de bloque de la cache, que es la unidad de intercambio de datos entre cache y la
memoria principal, la tasa de aciertos amentará.
Cuando se trae a la cache un nuevo bloque de datos, la función de traducción determina la posición de la cache que
ocupará el bloque. Dos limitaciones influyen en el diseño de la función de traducción. En primer lugar, cuando un bloque se
trae a la cache puede que otro tenga que ser remplazado. Convendría hacer esto de forma que se redujera la probabilidad
de reemplazar un bloque que se vaya a necesitar en un futuro cercano.
Si se modifica el contenido de un bloque de la cache, entonces hace falta escribirlo de nuevo en la memoria principal antes
de reemplazarlo. La política de escritura dicta cuándo tiene lugar la operación de escribir en memoria.
1.7
Técnicas de comunicación de E/S
Para las operaciones de E/S son posibles las tres técnicas siguientes:
 E/S programada
 E/S dirigida por interrupciones
 Acceso directo a memoria (DMA)
E/S programada
Cuando el procesador está ejecutando un programa y encuentra una instrucción de E/S, ejecuta ducha instrucción,
enviando una orden al módulo apropiado de E/S. Con E/S programada, el módulo de E/S llevará a cabo la acción requerida
y luego activará los bits apropiados en el registro de estado de E/S. El módulo de E/S no lleva a cabo ninguna otra acción
para avisar al procesador; de hecho ni lo interrumpe. Así pues, es responsabilidad del procesador comprobar
periódicamente el estado del módulo de E/S hasta saber que se ha completado la operación.
E/S dirigida por interrupciones
El problema de la E/S programada es que el procesador tiene que esperar un largo rato a que el módulo de E/S en cuestión
esté listo para recibir o transmitir más datos. El procesador, mientras está esperando, debe interrogar repetidamente por el
estado del módulo de E/S. Como resultado, el nivel de rendimiento del sistema en conjunto se degrada fuertemente.
Una alternativa es que el procesador envíe una orden de E/S al módulo y se dedique a hacer alguna otra tarea útil. El
módulo de E/S interrumpirá entonces al procesador para requerir sus servicios cuando esté listo para intercambiar los datos.
El procesador ejecuta entonces la transferencia de los datos y reanuda el procesamiento anterior.
Casi siempre existirán varios módulos de E/S en un sistema informático, así que hacen falta mecanismos que capaciten al
procesador para determinar qué dispositivo causó la interrupción y decidir, en caso de varias líneas de interrupción, de
forma que cada módulo de E/S envía una señal por una línea distinta. Cada línea tiene una prioridad diferente o, si no,
puede haber una única línea de interrupción, pero utilizando líneas adicionales para indicar la dirección del dispositivo.
Acceso directo a la memoria
La E/S dirigida por interrupciones, aunque es más eficiente que la simple E/S programada, todavía requiere de la
intervención activa del procesador para transferir los datos entre la memoria y un módulo de E/S y además cualquier
transferencia de datos debe recorrer un camino que pasa por el procesador.
La función de DMA se puede llevar a cabo por medio de un módulo separado sobre el bus del sistema o puede estar
incorporada dentro de un módulo de E/S. En cualquier caso, la técnica funciona como sigue. Cuando el procesador desea
leer o escribir un bloque de datos, emite una orden hacia el módulo de DMA, enviándole la información siguiente:
 Si lo que se solicita es una lectura o una escritura
 La dirección del dispositivo de E/S involucrado
 La dirección inicial de memoria desde la que se va a leer o a la que se va a escribir
 El número de palabras a leer o escribir
4
El procesador continúa entonces con otro trabajo. Habrá delegado la operación de E/S en el módulo de DMA y dicho
módulo es el que tendrá que encargarse de ésta. El módulo de DMA transfiere el bloque entero, una palabra cada vez,
directamente hacia o desde la memoria, sin pasar por el procesador. Cuando se completa la transferencia, el módulo de
DMA envía una señal de interrupción al procesador. De esta manera, el procesador se ve involucrado sólo al inicio y al final
de la transferencia.
Capitulo 2
Introducción a los Sistemas operativos
2.1 Funciones y objetivos de los sistemas operativos
Un sistema operativo es un programa que controla la ejecución de los programas de aplicación y que actúa como interfaz
entre las aplicaciones del usuario y el hardware de un computador. Puede considerarse que un sistema operativo tiene tres
objetivos:
 Comodidad: un sistema operativo hace que un computador sea más cómodo de utilizar.
 Eficiencia: un sistema operativo permite que los recursos de un sistema informático se aproveche de una manera
más eficiente.
 Capacidad de evolución: un sistema operativo debe construirse de modo que permita el desarrollo efectivo, la
verificación y la introducción de nuevas funciones en el sistema y, a la vez, no interferir en los servicios que brinda.
El sistema operativo como interfaz usuario/computador
Al usuario de estas aplicaciones se le llama usuario final y, generalmente, no tiene que ocuparse de la arquitectura del
computador. Por lo tanto, el usuario final ve al sistema informático en términos de aplicaciones. Las aplicaciones pueden
construirse con un lenguaje de programación y son desarrolladas por programadores de aplicaciones.
Algunos de estos programas se denominan utilidades e implementan funciones muy utilizadas que ayudan a la creación de
los programas, la gestión de los archivos y el control de los dispositivos de E/S.
Algunos de los programas se denominan utilidades e implementan funciones muy utilizadas que ayudan a la creación de
programas, la gestión de los archivos y el control de los dispositivos de E/S. El sistema operativo oculta al programador los
detalles del hardware y le proporciona una interfaz cómoda para utilizar el sistema.
De forma resumida, un sistema operativo ofrece servicios en las siguientes áreas:
 Creación de programas: ofrece múltiples funcionalidades y servicios, tales como los editores y los depuradores.
 Ejecución de programas: para ejecutar un programa, se necesita llevar a cabo un cierto número de tareas. Las
instrucciones y los datos se deben cargar en la memoria principal, los archivos y los dispositivos de E/S tienen que
ser iniciados y se deben preparar otros recursos. El sistema operativo administra todas estas tareas para el usuario.
 Acceso a los dispositivos de E/S: cada dispositivo de E/S requiere un conjunto propio y peculiar de instrucciones o
de señales de control para su funcionamiento. El sistema operativo proporciona una interfaz uniforme que oculta
estos detalles, de modo que el programador pueda acceder a los dispositivos utilizando lecturas y escrituras
simples.
 Acceso controlado a los archivos: En el caso de sistemas con varios usuarios trabajando simultáneamente, en el
sistema operativo el que proporciona los mecanismos de protección para controlar el acceso a los archivos.
 Acceso al sistema: el sistema operativo controla el acceso al sistema como un todo y los recursos específicos del
sistema.
 Detección y respuesta a errores: cuando un sistema informático está en funcionamiento puede producirse una serie
de errores. El sistema operativo debe dar una respuesta que elimine la condición de error con el menor impacto
posible sobre las aplicaciones que están en ejecución. La respuesta puede ser desde terminar el programa que
produjo el error hasta reintentar la operación o, simplemente, informar el error a la aplicación.
 Contabilidad: un buen sistema operativo debe recoger estadísticas de utilización de los diversos recursos y
supervisar parámetros de rendimiento tales como el tiempo de respuesta.
El sistema operativo como administrador de recursos
Un computador es un conjunto de recursos para el movimiento, almacenamiento y proceso de datos y para el control de
estas funciones. El sistema operativo es el responsable de la gestión de estos recursos.
El sistema operativo funciona de la misma manera que el software normal de un computador, es decir, es un programa o
una serie de programas ejecutados por el procesador.
El sistema operativo abandona con frecuencia el control y debe depender del procesador para recuperarlo.
El sistema operativo dirige al procesador en el empleo de otros recursos del sistema y en el control del tiempo de la
ejecución de otros programas. El sistema operativo cede el control del procesador, para hacer algún trabajo “útil” y luego lo
recupera durante el tiempo suficiente para preparar el procesador para llevar a cabo la siguiente parte del trabajo.
Una parte del sistema operativo está en la memoria principal. En esta parte está el núcleo (kernel), que incluye las funciones
utilizadas con más frecuencia en el sistema operativo y, en un momento dado, puede incluir otras partes del sistema
operativo que estén en uso. El resto de la memoria principal contiene datos y otros programas de usuario. Como se verá, la
asignación de este recurso (la memoria principal) es controlada conjuntamente por el sistema operativo y por el hardware de
gestión de memoria en el procesador.
2.2. Evolución de los sistemas operativos
Proceso en serie
5
En los primeros computadores el programador interactuaba directamente con el hardware del computador; no había sistema
operativo. La operación con estas máquinas era desde una consola consistente en unos indicadores luminosos, unos
conmutadores, algún tipo de dispositivo de entrada y una impresora. Los programas de código de máquina se cargaban a
través del dispositivo de entrada. Si se detenía el programa por un error, la condición de error se indicaba mediante
indicadores luminosos. Si el programa continuaba hasta su culminación normal, la salida aparecería en la impresora.
Sistemas sencillos de proceso por lotes
La idea central que está detrás del sencillo esquema de proceso por lotes, es el uso de un elemento de software conocido
como el monitor. Con el uso de esta clase de sistema operativo, los usuarios ya no tenían acceso directo a la máquina. En
su lugar, el usuario debía entregar los trabajos en tarjetas o en cintas al operador del computador, quien agrupaba
secuencialmente los trabajos por lotes y ubicaba los lotes enteros en un dispositivo de entrada para su empleo por parte del
monitor.
Sistemas por lotes con multiprogramación
Con el secuenciamiento automático de trabajos ofrecido por un sistema operativo sencillo por lotes, el procesador está
desocupado con frecuencia. El problema es que los dispositivos de E/S son lentos comparados con el procesador.
Se sabe que hay memoria suficiente para mantener el sistema operativo y un programa de usuario. Supongamos que hay
especio suficiente para el sistema operativo y dos programas de usuario. Ahora cuando un trabajo necesite esperar una
E/S, el procesador puede cambiar al otro trabajo, que probablemente no estará esperando a la E/S. Además se podría
ampliar la memoria para almacenar tres, cuatro o más programas e intercambiarlos. Este proceso es conocido como
multiprogramación o multitarea. Este es el punto central de los sistemas operativos moderno.
Sistemas de tiempo compartido
En un sistema de tiempo compartido múltiples usuarios acceden simultáneamente al sistema por medio de terminales,
donde el sistema operativo intercala la ejecución de cada programa de usuario en ráfagas cortas o cuantos (quantum) de
computación. De esta manera, si hay n usuarios que solicitan un servicio al mismo tiempo, cada usuario solo dispondrá, en
promedio, de 1/n de la velocidad efectiva del computador.
2.3. Logros principales
Cinco avances teóricos significativos en el desarrollo de los sistemas operativos:
 Los procesos
 La gestión de memoria
 La seguridad y la protección de la información
 La planificación y la gestión de recursos
 La estructura del sistema
Procesos
Se han dado muchas definiciones para el término proceso:
 Un programa en ejecución.
 Una instancia de un programa funcionando en un computador.
 La entidad que puede ser asignada al procesador y ejecutada por él.
 Una unidad de actividad caracterizada por un sencillo tratamiento de ejecución secuencial, un estado actual y
asociada a un conjunto de recursos del sistema.
Con muchos trabajos en progreso al mismo tiempo, donde cada uno tiene que realizar numerosos pasos ejecutados en una
manera secuencial, es casi imposible analizar todas las combinaciones posibles de secuencias de sucesos. En ausencia de
un método sistemático de coordinación y cooperación entre actividades, los programadores recurrían a métodos a priori,
basados en su comprensión del entorno que el sistema operativo tenía que controlar. Estos esfuerzos estaban expuestos a
errores sutiles de programación cuyos efectos podían observarse solamente si se producían ciertas secuencias de acciones
relativamente raras. Estos errores eran muy difíciles de diagnosticar. Aún cuando se detectase el error, resultaba muy difícil
determinar las causas. En líneas generales, había cuatro causas principales para dichos errores:
 Sincronización incorrecta: es frecuente el caso en el que una rutina debe ser suspendida a la espera de un suceso
en cualquier lugar del sistema. Un diseño incorrecto del mecanismo de señalización puede dar como resultado la
pérdida de señales o la recepción de señales duplicadas.
 Fallos de exclusión mutua: es habitual el caso en que más de un usuario o programa, intentan al mismo tiempo
hacer uso de un recurso compartido. Debe existir algún tipo de mecanismo de exclusión mutua, que permita que
sólo una rutina pueda realizar una transacción al mismo tiempo.
 Funcionamiento no determinista del programa: los resultados de un programa en particular deben depender
normalmente de una sola entrada del programa y no de las actividades de otros programas de un sistema
compartido. Pero cuando los programas comparten memoria y sus ejecuciones se intercalan en el procesador,
entonces pueden interferir con otros, sobrescribiendo zonas comunes de memoria de forma imprevisible.
 Interblqueos: es posible que dos o más programas estén suspendidos a la espera uno del otro.
Lo que se necesita para enfrentarse a estos problemas es un método sistemático de supervisación y control de los
diferentes programas que pueden están ejecutándose en el procesador. El concepto de proceso ofrece la base y se puede
considerar que está formado por las tres componentes siguientes:
 Un programa ejecutable
 Los datos asociados para el programa (variables, espacio de trabajo, buffers, etc)
 El contexto de ejecución del programa
EL contexto de ejecución o estado del proceso, incluye toda la información que el sistema operativo necesita administrar el
proceso y que el procesador necesita para ejecutarlo correctamente. Así pues, el contexto incluye contenidos en varios
6
registros del procesador, tales como el contador del programa y los registros de datos. También incluye información de
utilidad para el sistema operativo, como la prioridad del proceso y si el proceso está esperando la terminación de un suceso
particular de E/S.
El proceso se trata como una estructura de datos. Un proceso puede estar ejecutándose o esperando su ejecución. Todo el
estado del proceso en un instante determinado, está contenido en su contexto. Esta estructura permite el desarrollo de
técnicas potentes, que aseguran la coordinación y cooperación entre procesos.
Gestión de memoria
Los usuarios necesitan un entorno informático que de soporte a la programación modular y la utilización flexible de los
datos. Los administradores de sistemas necesitan un control eficiente y ordenado de la asignación del almacenamiento.
Para satisfacer estos requisitos, el sistema operativo tiene cinco responsabilidades principales en la gestión del
almacenamiento:
 Aislamiento del proceso: el sistema operativo debe procurar que cada proceso independiente no interfiera en los
datos y la memoria de ningún otro.
 Asignación y gestión automáticas: a los programas se les debe asignar memoria dinámicamente en la jerarquía de
memoria, según la vaya necesitando.
 Soporte para la programación modular: los programadores deben ser capaces de definir módulos de programa y de
crear, distribuir y alterar el tamaño de los módulos dinámicamente.
 Protección y control de acceso: compartir la memoria en algún nivel de la jerarquía de la memoria origina la
posibilidad de que un programa pueda direccional el espacio de memoria de otro programa. Algunas veces, esto es
conveniente, sobre todo cuando se necesita compartimiento en una aplicación en particular. En otros casos, esto
amenaza la integridad de los programas y del mismo sistema operativo. El sistema operativo debe permitir que las
secciones de memoria estén accesibles de diferentes maneras para los diversos usuarios.
 Almacenamiento a largo plazo: muchos programas de aplicaciones requieren medios para el almacenamiento de la
información durante largos periodos de tiempo, después de apagar la computadora.
Normalmente, los sistemas operativos satisfacen estos requerimientos mediante la memoria virtual y los servicios del
sistema de archivos. El sistema de archivos incorpora un almacenamiento a largo plazo en el que se almacena la
información en unos objetos denominados archivos.
La memoria virtual es un servicio que permite a los programas direccionar la memoria desde un punto de vista lógico, sin
depender del tamaño de la memoria principal física disponible. La memoria virtual fue concebida para cumplir las
necesidades de múltiples trabajos de usuario residentes concurrentes en la memoria principal y así no existiera un espacio
muerto entre la ejecución de los procesos sucesivos, mientras un proceso se envía al almacenamiento secundario y el
proceso que le sucede es traído de éste. Puesto que los procesos varían de tamaño, si el procesador cambia entre cierto
número de ellos es difícil introducirlos de forma contigua en la memoria principal. Por ello se introdujo el sistema de
paginación que permite que los procesos estén formados por varios bloques de tamaño fijo, denominados páginas. Un
programa hace referencia a una palabra mediante una dirección virtual formada por un número de página y un
desplazamiento dentro de la página. Cada página puede estar ubicada en un lugar cualquiera de la memoria principal. La
paginación es un sistema que proporciona una traducción dinámica entre la dirección virtual utilizada en el programa y la
dirección real o dirección física, en la memoria principal.
Con el hardware de traducción dinámica disponible, el siguiente paso lógico fue eliminar la necesidad de que todas las
páginas de un proceso residan simultáneamente en la memoria principal. Todas las páginas de un proceso se mantienen
sobre un disco. Cuando se esta ejecutando, solo alguna de sus paginas estarán en memoria principal. Si hace referencia a
una página que no está en la memoria principal, el hardware de gestión de memoria lo detecta y ejecuta un fallo de página
para que sea cargada.
Las instrucciones del lenguaje de programación pueden hacer referencia a los programas y a las posiciones de los datos en
la memoria virtual. El aislamiento de los procesos se puede lograr dándole a cada proceso una única parte de la memoria
virtual que no se solape con otra.
Seguridad y protección de memoria
Pueden construirse algunas herramientas de propósito general dentro de los computadores y de los sistemas operativos,
para dar soporte a una variedad de mecanismos de protección y seguridad. En general, interesan los problemas de control
de acceso a los sistemas informáticos y a la información almacenada en ellos.
Gran parte del trabajo que se ha realizado en la seguridad y protección de los sistemas operativos pueden agruparse, en
grandes líneas, en las tres categorías siguientes:
 Control de acceso: relativo a la regulación del acceso del usuario al sistema completo, a los subsistemas y a los
datos, así como a la regulación del acceso de los procesos a los recursos y objetos del sistema.
 Control de flujo de información: regula el flujo de datos dentro del sistema y su distribución a los usuarios.
 Certificación: relativo a la demostración de que el acceso y los mecanismos de control del flujo se llevan a cabo de
acuerdo con las especificaciones y a que éstas cumplen las políticas de protección y seguridad deseada.
Planificación y gestión de recursos
Una tarea clave del sistema operativo es administrar los recursos que tiene disponibles y planificar su utilización por parte
de los diferentes procesos en activo. Cualquier política de asignación de recursos y de planificación debe tener en cuenta
los tres factores siguientes:
 Equidad: normalmente, sería conveniente que a todos los procesos que compiten por el uso de un determinado
recurso les sea otorgado un acceso al recurso que sea aproximadamente igual y equitativo para ese recurso. Esto
es especialmente así para los trabajos de una misma clase, es decir, trabajos con demandas similares.
7

Sensibilidades diferenciales: por otro lado, el sistema operativo puede tener que discriminar diferentes clases de
trabajos con diferentes requerimientos de servicio. El sistema operativo debe intentar tomar decisiones de
asignación y planificación, que satisfaga la totalidad de los requerimientos.
 Eficiencia: el sistema operativo debe intentar maximizar la productividad, minimizar el tiempo de respuesta y, en el
caso de tiempo compartido, alojar a tantos usuarios como sea posible.
El sistema operativo mantiene una serie de colas, cada una de los cuales no es más que una simple lista de procesos
esperando algún recurso. La cola a corto plazo está formada por procesos que están en la memoria principal y están listos
para ejecutarse. Cualquiera de estos procesos podría ser el siguiente en usar el procesador. Depende del planificador a
corto plazo o distribuidor (dispatcher) el escoger a uno. Una estrategia habitual es asignar por turnos una cierta cantidad de
tiempo a cada proceso de la cola; esta técnica es conocida como turno rotatorio (round robin). También se pueden utilizar
niveles de prioridad u otro algoritmo de planificación.
Una cola a largo plazo es una lista de nuevos trabajos que esperan para usar el procesador. El sistema operativo añade los
trabajos al sistema transfiriendo un proceso desde la cola a largo plazo hacia la cola a corto plazo. En ese momento, al
proceso que se introduce se le debe asignar una parte de la memoria principal. De este modo, el sistema operativo debe
estar seguro de que no sobrecargar la memoria o el tiempo de procesamiento por admitir demasiados procesos en el
sistema. Hay una cola de E/S para cada dispositivo de E/S.
Estructura del sistema
Pueden llegar a existir tres problemas en los sistemas operativos: primero, los sistemas operativos cuando se entregan ya
están cronológicamente retrasados. Esto lleva a nuevos sistemas operativos y a actualizaciones anteriores. Segundo, los
sistemas tienen fallos latentes que se manifiestan en su práctico y que deben ser detectados y corregidos. Y, por último, su
rendimiento no es a menudo el que esperaba.
Para solucionar estos problemas se ha prestado mucha atención durante los últimos años a la estructura del software de los
sistemas operativos. El software debe ser modular. Esto ayuda a organizar el proceso de desarrollo de software y reduce
las tareas de diagnostico y detección de errores. Los módulos tienen que tener interfaces bien definidas entre sí y estas
interfaces deben ser tan simples como sea posible.
La programación modular por si sola no es suficiente. En su lugar, ha ido creciendo el uso de conceptos como los de niveles
jerárquicos y abstracción de la información. La estructura jerárquica de un sistema operativo moderno separa sus funciones
de acuerdo con su complejidad, su escala característica de tiempo y su nivel de abstracción. Se puede contemplar el
sistema como una serie de niveles. Cada nivel lleva a cabo un determinado subconjunto de funciones requeridas por el
sistema operativo. Este se basa en el nivel inferior para llevar a cabo funciones más primitivas y ocultar los detalles de
dichas funciones. A su vez, cada nivel ofrece servicios al nivel superior. En el mejor de los casos, los niveles deben estar
definidos de forma que los cambios en un nivel no requieran cambios en otros niveles.
2.4. Características de los sistemas operativos modernos
Existen sistemas operativos modernos que responden a nuevos desarrollos del hardware y nuevas aplicaciones. Entre
estos dispositivos de hardware clave están las máquinas multiprocesador, incrementos enormes de la velocidad de la
maquina, alta velocidad en los enlaces de las redes de comunicaciones e incremento en el tamaño y variedad de los
dispositivos de almacenamiento de memoria.
El porcentaje de cambios en las demandas de los sistemas operativos, requiere no solamente las modificaciones y mejoras
en las arquitecturas ya existentes, sino nuevas formas de organización del sistema operativo. Muchos de los diferentes
enfoques y elementos de diseño se han probado tanto en sistemas operativos experimentales como comerciales, y muchos
de ellos encajan dentro de las siguientes categorías:
 Arquitectura micronúcleo
 Multihilos
 Multiproceso simétrico
 Sistemas operativos modernos
 Diseño orientado a objetos.
La mayor parte de los sistemas operativos, hasta hace poco tiempo se caracterizaban por un gran núcleo monolítico. Gran
parte de la funcionalidad que se pensaba debía tener un sistema operativo la proporcionaba este gran núcleo, incluyendo la
planificación, sistema de archivos, redes, controladores de dispositivos, gestión de memoria y muchas cosa más.
La arquitectura micronúcleo asigna solamente unas pocas funciones esenciales al núcleo, incluyendo espacios de
direcciones, comunicación entre procesos (IPC) y planificación básica.
Otros servicios del SO los proporcionan procesos, algunas veces llamados servidores, que ejecutan en modo usuario y que
el micronúcleo trata a cualquier otra aplicación.
Los multihilos son una técnica por la cual un proceso, ejecutando una aplicación, se divide en hilos que pueden ejecutarse
concurrentemente. Se puede hacer la siguiente distinción:
 Hilo: unidad de trabajo que se puede expedir para su ejecución. Incluye un contexto del procesador y sus propias
áreas de datos para una pila. Un hilo se ejecuta secuencialmente y es interrumpible para que el procesador pueda
ceder el turno a otro hilo.
 Proceso: en conjunto de uno o más hilos y los recursos del sistema asociados. Esto se acerca mucho al concepto
de programa en ejecución. Al dividir una aplicación única en múltiples hilos, el programador tiene un gran control
sobre la modularidad de la aplicación y la coordinación de los sucesos relativos a la misma.
Los multihilos son muy útiles para las aplicaciones que ejecutan un número de tareas esenciales independientes que no
necesitan ser consecutivas.
8
Para conseguir una gran eficiencia y fiabilidad, se utilizó una técnica denominada multiproceso simétrico (SMP). Un
multiprocesador simétrico puede definirse como un sistema de computadores de un solo usuario con las siguientes
características:
 Existencia de múltiples procesadores
 Estos procesadores comparten la misma memoria principal y dispositivos de E/S
 Todos los procesadores pueden ejecutar las mismas funciones
El sistema operativo de un SMP planifica procesos o hilos por todos los procesadores. SMP tiene varias ventajas
potenciales sobre una arquitectura de un solo procesador, incluyendo las siguientes:
 Rendimiento: si el trabajo realizando por un computador puede organizarse de forma que algunas partes del mismo
puedan ejecutarse en paralelo, entonces un sistema con múltiple procesadores producirá un mayor rendimiento que
otro del mismo tipo con un solo procesador.
 Disponibilidad: en un multiprocesador simétrico, puesto que todos los procesadores pueden ejecutar las mismas
funciones, el fallo de un procesador no detiene la máquina. En vez de eso, el sistema puede continuar la función
con un rendimiento reducido.
 Crecimiento incremental: un usuario puede aumentar el rendimiento de un sistema añadiendo un procesador
adicional.
 Escalabilidad: los constructores pueden ofrecer una variedad de productos con diferentes precios y características
de rendimiento basándose en el número de procesadores que configuran el sistema.
Los multihilos y SPM frecuentemente se analizan juntos, pero ambos son de características independientes, aun en una
máquina de un solo procesador, los multihilos son útiles para estructurar las aplicaciones y los procesos del núcleo. Una
máquina SPM es útil para procesos sin hilos, porque varios procesos pueden ejecutarse en paralelo. Sin embargo, las dos
características se complementan entre sí y pueden utilizarse con efectividad conjuntamente.
Un sistema operativo distribuido proporciona la ilusión de un único espacio de memoria principal y un único espacio de
memoria secundaria, además de otros mecanismos de acceso unificados, como por ejemplo un sistema de archivos
distribuidos.
El diseño orientado a objetos impone a los procesos una disciplina para añadir extensiones modulares a un pequeño
núcleo. Al nivel del sistema operativo, una estructura basada en objetos permite a programadores personalizar un sistema
operativo sin tener que romper la integridad del sistema. La orientación a objetos también facilita el desarrollo de
herramientas distribuidas y sistemas operativos distribuidos abiertos.
2.5. Introducción a Windows 2000
Multitarea Monousuario
Una de las características más significativas de estos nuevos sistemas operativos es que, aunque siguen estando
orientados a dar soporte a un solo usuario interactivo, son sistemas operativos multitarea. Dos desarrollos principales han
disparado la necesidad de la multitarea en los computadores personales, estaciones de trabajo y servidores. Primero, con el
aumento de la velocidad y de la capacidad de memoria de los microprocesadores, junto con el apoyo de la memoria virtual,
las aplicaciones se han hecho más complejas e interrelacionadas. Por ejemplo, un usuario puede desear utilizar un
procesador de textos, un programa de dibujo y una hoja de cálculos simultáneamente.
Una segunda motivación para la multitarea es el crecimiento del procesamiento cliente/servidor. Con procesamiento
cliente/servidor, un computador personal o una estación de trabajo cliente y un sistema anfitrión servidor se unen para llevar
a cabo una aplicación particular. Los dos están conectados entre sí y a cada uno se le asigna la parte del trabajo que esté
acorde con sus capacidades. El cliente/servidor se puede ejecutar en una red local de computadores personales y
servidores, o por mediación de un enlace entre un sistema de usuario y un potente anfitrión, como puede ser un gran
computador.
Organización del sistema operativo
W2K no tiene una arquitectura micronúcleo pura. Como en una arquitectura micronúcleo pura, W2K es altamente modular.
Cada función del sistema es gestionada por un solo componente del sistema operativo. El resto del sistema operativo y las
funciones de acceso de todas las aplicaciones acceden a esta función a través del componente responsable que utiliza la
interfaz estándar. En principio, cualquier módulo puede ser eliminado, actualizado o remplazado sin volver a escribir el
sistema completo o sus interfaces de programas de aplicación estándar (APIS), a diferencia de un sistema micronúcleo
puro, W2K esta configurado para que la mayoría de las funciones externas al micronúcleo ejecuten en modo núcleo. La
razón es el rendimiento.
Uno de los objetivos de diseño de W2K es la compatibilidad, que sea capaz de ejecutar no solamente sobre máquinas Intel
sino sobre distintas plataformas de hardware. Para satisfacer esta mejora, la mayoría del ejecutor de W2K tiene la misma
visión del hardware subyacente,
utilizando la siguiente estructura en diseño:
 Capa de abstracción del hardware (HAL, Hardware Abstraction Layer): Establece una correspondencia entre las
órdenes y respuestas genéricas del hardware y aquellas que son propias de una plataforma específica. Aísla el
sistema operativo de las diferencias de hardware específicas de cada plataforma.
 Micronúcleo: Esta formado por las componentes más usadas y fundamentales del sistema operativo.
 Controladores de dispositivos: incluye tanto el sistema de archivos como los controladores de dispositivos de
hardware que traducen las llamadas funciones de E/S del usuario a peticiones a dispositivos hardware de E/S
específicos.
El ejecutor de W2K incluye módulos para las funciones específicas del sistema y proporciona una API para el software en
modo usuario. A continuación se expone una breve descripción de cada uno de los módulos del ejecutor:
9

Administrador de E/S: Proporciona un marco de trabajo a través del cual las aplicaciones acceden a los dispositivos
de E/S y es el responsable de distribuir los controladores de dispositivo entre los distintos procesos.
 Administrador de Objetos: Crea, gestiona y elimina los objetos del ejecutor de W2K y los tipos abstractos de datos,
que se utilizan para representar recursos tales como procesos, hilos y objetos sincronizados.
 Monitor de seguridad: impone la validación de acceso y generación de reglas de auditoria.
 Administrador de procesos/hilos: Crea y elimina objetos y sigue la pista de los objetos procesos e hilo.
 Servicios de llamadas a procesamiento local: Impone las relaciones cliente/servidor entre las aplicaciones y los
subsistemas del ejecutor dentro de un mismo sistema.
 Administrador de memoria virtual: traduce direcciones virtuales en el espacio de direcciones del proceso a páginas
físicas en la memoria del computador.
 Administrador de cache: Mejora el rendimiento de las E/S sobre archivos, haciendo que los datos del disco a los
que se ha hecho referencia recientemente residan en la memoria principal para un rápido acceso y difiere las
escrituras sobre disco manteniendo actualizaciones en la memoria durante un corto tiempo antes de enviarlas a
disco.
 Módulos para gráficos/ventanas: Crea las interfaces de pantalla orientadas a ventanas y gestiona los dispositivos
gráficos.
Procesos de usuario
W2K soporta 4 tipos básicos de procesos de usuario:
 Procesos de soporte de sistemas especiales: Como por ejemplo los servicios no proporcionados como parte del
sistema operativo W2K, como el proceso de inicio de sesión y gestión de sesión.
 Procesos del servidor: Otros servicios de W2K, como el registro de sucesos.
 Subsistemas de entorno: ofrecen los servicios nativos de W2K a las aplicaciones de usuario y de este modo
proporcionan un entorno de SO
 Aplicaciones de usuario.
Modelo Cliente/Servidor
El ejecutor, los subsistemas protegidos y las aplicaciones están estructuradas según él modelo cliente/servidor. La
arquitectura cliente/servidor es un modelo habitual en el procesamiento distribuido. Esta misma arquitectura puede
adoptarse para uso interno en un sistema único, como es el caso del W2K.
Cada subsistema del entorno y el subsistema de servicios del ejecutor se implementan como uno o más procesos. Cada
proceso espera la solicitud de un cliente para uno de sus servicios. Un cliente, que puede ser un cliente, que puede ser un
programa de aplicación u otro módulo del sistema operativo solicita un servicio enviando un mensaje. El mensaje es
encaminado a través del ejecutor hasta el servidor apropiado. El servidor lleva a cabo la operación solicitada y devuelve el
resultado o la información de estado por medio de otro mensaje, que se encamina a través del ejecutor de regreso al
cliente.
Las ventajas de una arquitectura cliente/servidor son las siguientes:
 Simplifica el ejecutor, se pueden añadir fácilmente nuevas API.
 Mejora la fiabilidad, cada módulo de servicio del ejecutor se ejecuta en un proceso independiente, con su propia
partición de memoria, protegido de otros módulos.
 Proporciona una base natural para el procesamiento distribuido. Normalmente, el procesamiento distribuido sigue el
modelo cliente/servidor, con llamadas a procedimiento remoto implementadas mediante clientes distribuidos,
módulos servidor e intercambio de mensajes entre clientes y servidores.
Hilos y SPM
Dos características importantes de W2K son el soporte para hilos y para multiproceso simétrico (SMP), las siguientes son
las características que utiliza W2k para dar soporte a los hilos y SPM:
 Las rutinas del sistema operativo se pueden ejecutar sobre cualquier procesador disponible y diferentes rutinas
pueden ejecutar simultáneamente sobre distintos procesadores.
 W2K soporta el uso de múltiples hilos de ejecución dentro de un mismo proceso. Los múltiples hilos del mismo
proceso pueden ejecutar simultáneamente sobre distintos procesadores.
 Los procesos servidor pueden utilizar múltiples hilos para procesar simultáneamente las solicitudes de más de un
cliente.
 W2K proporciona mecanismos para compartir datos y recursos entre procesos, así como capacidades flexibles de
comunicación entre procesos.
Objetos de Windows 2000
W2K se sustenta principalmente en los conceptos de diseño orientado a objetos. Este enfoque facilita el compartir recursos
y datos entre procesos y la protección de recursos de accesos no autorizados. Entre los conceptos claves del diseño
orientado a objetos empleados por W2K están los siguientes:
 Encapsulamiento: Un objeto consta de uno o más elementos de datos, llamados atributos, y uno o más
procedimientos que pueden actuar sobre los datos, llamados servicios. La única manera reacceder a los datos de
un objeto es invocando a uno de los servicios del mismo.
 Clases de objetos e instancias: Una clase de objeto es una plantilla que enumera los atributos y los servicios de un
objeto y define ciertas características del objeto. El sistema operativo puede crear instancias específicas de una
clase de objeto cada vez que lo necesite. Por ejemplo, hay una sola clase de objeto proceso y un objeto proceso
para cada uno de los procesos activos.
10

Herencia: No esta soportada en el nivel de usuario pero si, hasta cierto punto, en el ejecutor, por ejemplo los objetos
directorios son ejemplos de objetos contenedor. Una propiedad de un objeto contenedor es que los objetos que
contiene pueden heredar propiedades del propio contenedor.
 Polimorfismo: Internamente, W2K utiliza un conjunto común de funciones API para manipular cualquier tipo de
objeto; este es un tipo de polimorfismo.
No todas las entidades de W2K son objetos. Los objetos se usan en los casos en que los datos se abren para su accedo en
modo usuario o cuando el acceso a los datos está compartido o restringido. Entre las entidades representadas por objetos
se encuentran los archivos, los procesos, los hilos, los semáforos, los temporizadores y las ventanas. W2K crea y
administra todos los tipos de objetos de manera uniforme, a través de un administrador de objetos.
2.6. Sistemas Unix Clásicos
Descripción
El hardware básico está rodeado por el software del sistema operativo. El sistema operativo a menudo el núcleo del
sistema, o simplemente núcleo (kernel), para realizar su aislamiento de las aplicaciones y del usuario. Unix está equipado
con varios servicios e interfaces de usuario que se consideran parte del sistema. Estos pueden agruparse en un intérprete
de órdenes (shell), algún otro software de interfaz y las componentes del compilador de C. El nivel exterior está formado por
aplicaciones de los usuarios y la interfaz de usuario del compilador C.
La interfaz de llamadas al sistema es la frontera con el usuario y le permite al software de alto nivel el acceso a las
funciones específicas del núcleo. En el otro extremo, el sistema operativo contiene rutinas primitivas que interactúen
directamente con el hardware. Entre estas 2 interfaces, el sistema está dividido en dos partes fundamentales, una relativa al
control de los procesos y la otra relativa a la gestión de memoria, la planificación y expedición de los procesos y la
sincronización y comunicación entre los mismos. El sistema de archivos intercambia datos entre la memoria y los
dispositivos externos.
2.7. Sistemas Unix modernos
Conforme Unix evoluciona, el número de implementaciones diferentes prolifera y cada una ofrece alguna característica útil.
Historia
Linux aparece como una variante de Unix para la arquitectura de IBM PC. La versión inicial fue escrita por Linus Torvalds.
Desde entonces un gran número de personas, colaborando por Internet, ha contribuido al desarrollo de Linux, todos bajo el
control de Torvalds. Debido a que Linux es libre y está disponible su código fuente, muy pronto se convirtió en una
alternativa de otros Unix para estaciones de trabajo.
Estructura modular
La mayoría de los núcleos de Unix son monolíticos. Hay que recordar que un núcleo monolítico es aquel que incluye
prácticamente toda la funcionalidad del sistema operativo en un gran bloque de código que se ejecuta como un proceso
con un único espacio de direcciones. Todos los componentes funcionales del núcleo tienen acceso a todas las estructuras
de datos y rutinas internas. Si se hacen cambios en cualquier parte del sistema operativo monolítico típico, se deberían
reenlazar y reinstalar todos los módulos y rutinas y se deberá reinicializar el sistema antes de que los cambios tengan
efecto. Como resultado, resulta difícil cualquier modificación, como añadir un nuevo controlador de dispositivo o una función
del sistema de archivos.
Para solucionar este problema, Linux está organizado como un conjunto de bloques independientes denominado módulos
cargables. Los módulos cargables de Linux tienen 2 características importantes:
 Enlace dinámico: Un módulo del núcleo puede cargarse y enlazarse dentro del núcleo, mientras el núcleo
permanece en memoria y en ejecución. Un módulo puede ser también desenlazado y borrado de la memoria en
cualquier momento.
 Módulos apilables: Los módulos se organizan en una jerarquía.
Capitulo 3
Procesos
El diseño de un sistema operativo debe reflejar ciertos requisitos generales. La mayoría de los requisitos que debe
satisfacer un sistema operativo están expresados haciendo referencia a los procesos:
 El sistema operativo debe intercalar la ejecución de múltiples procesos para maximizar la utilización del procesador
ofreciendo a la vez un tiempo de respuesta razonable.
 El sistema operativo debe asignar recursos a los procesos en conformidad con una política específica, evitando, al
mismo tiempo el interbloqueo.
 El sistema operativo podría tener que dar soporte a la comunicación entre procesos y la creación de procesos por
parte del usuario.
3.1. Estados de un proceso
La misión principal del procesador es ejecutar las instrucciones de máquina que residen en la memoria principal. Estas
instrucciones se dan en forma de programas. Para que un programa se ejecute se debe crear un proceso o tarea para él.
Desde el punto de vista del procesador, éste ejecutara instrucciones de su repertorio en una secuencia dictada por los
valores cambiantes del registro contador del programa (PC, Program Counter). El comportamiento de un proceso individual
11
puede caracterizarse por la lista de secuencia de instrucciones que se ejecutan para dicho proceso. Dicho listado se llama
traza del proceso.
Un modelo de procesos de dos estados
El primer paso para diseñar un programa que controle los procesos es describir el comportamiento que se querría que
presenten los procesos.
El modelo más sencillo que puede construirse tiene en cuenta que, en un momento dado, un proceso puede estar
ejecutándose en el procesador o no. Así, un proceso puede estar en uno de dos estados: Ejecución o No Ejecución.
Cuando el sistema operativo crea un nuevo proceso, éste entra en el sistema en un estado de No Ejecución. El proceso
existe, es conocido por el sistema operativo y está esperando la oportunidad de ejecutarse. De cuando en cuando, el
proceso que está ejecutándose será interrumpido y el programa distribuidor del sistema operativo seleccionará un nuevo
proceso para que se ejecute. El proceso anterior pasa del estado de Ejecución al estado No Ejecución y uno de los otros
procesos pasará al estado de Ejecución.
Cada proceso debe representarse en forma que el sistema operativo pueda seguirle la pista, es decir, que debe haber
información relativa a cada proceso, incluyendo su estado actual y su posición en la memoria. Aquellos procesos que no
están ejecutándose tienen que guardarse en algún tipo de cola, para que esperen su turno de ejecución.
Creación de procesos
Cuando se añade un proceso a los que ya están administrando el sistema operativo, hay que construir las estructuras de
datos que se utilizan para esta administración y asignar el espacio de direcciones en la memoria principal para el proceso.
Estas acciones constituyen la creación de un nuevo proceso.
Cuatro sucesos comunes conducen a la creación de un proceso. En un entorno de trabajo por lotes, un proceso se crea
como respuesta a la emisión de un trabajo. En un entorno interactivo, se crea un proceso cuando un nuevo usuario intenta
conectarse. En ambos casos, el sistema operativo es el responsable de la creación del nuevo proceso. Un sistema
operativo también puede crear un proceso como parte de una aplicación. Por ejemplo, si un usuario solicita la impresión de
un archivo, el sistema operativo puede crear un proceso que gestione dicha impresión. Esto le permitirá al proceso
demandante continuar independientemente del tiempo que tarde en terminar la tarea de impresión.
Cuando un proceso genera otro, el proceso generador se conoce como proceso padrde y el proceso generado es el
proceso hijo. Normalmente, estos procesos emparentados necesitarán comunicarse y cooperar entre sí.
Terminación de procesos
Cualquier sistema informático debe ofrecer alguna forma para que un proceso pueda indicar que ha terminado. Un trabajo
por lotes debe incluir una instrucción de detención (halt) o una llamada explicita a un servicio del sistema operativo para la
terminación. En el primer caso, la instrucción halt generará una interrupción para avisar al sistema operativo que el proceso
ha concluido. En una aplicación interactiva, es la acción del usuario cuando termina el proceso.
Un modelo de cinco estados
En este modelo se diferencia en que el estado de no ejecución puede ser porque esta listo para ejecutarse o esta
bloqueado esperando que termine una E/S. La forma más natural de realizar este cambio es dividir el estado de No
Ejecución en dos estados: Listo y Bloqueado. Los 5 estados del nuevo diagrama son:
 Ejecución: El proceso que está actualmente en ejecución.
 Listo: Proceso que está preparado para ejecutarse, en cuanto se le dé la oportunidad.
 Bloqueado: Proceso que no puede ejecutar hasta que se produzca cierto suceso, como la terminación de una
operación de E/S.
 Nuevo: Proceso que se acaba de crear, pero aún no ha sido admitido por el sistema operativo en el grupo de
procesos ejecutables. Normalmente, un proceso nuevo no está cargado en la memoria principal.
 Terminado: Un procesos que ha sido excluido por el sistema operativo del grupo de procesos ejecutables, porque
se detuvo o porque fue abandonado por alguna otra razón.
Admitir
Nuevo
Expedir
Listo
Salir
Ejecución
Terminado
Fin del tiempo
Ocurre suceso
Espera suceso
Bloqueado
El sistema operativo puede definir un nuevo proceso en 2 pasos: Primero, el sistema operativo lleva a cabo algunas tareas
necesarias de gestión interna. Se lo asocia un identificador al proceso y se construyen y asignan algunas tablas necesarias
para gestionar el proceso. En este punto el proceso estará en el estado nuevo.
De igual forma, un proceso sale de un sistema en 2 pasos. Primero, el proceso termina cuando llega al punto neutral de
terminación, cuando se abandona debido a un error irrecuperable o cuando otro proceso con la debida autoridad hace que
el proceso abandone. La terminación pasa el proceso al estado Terminado. En este punto, el proceso ya no se elige más
para la ejecución.
Las posibles transiciones entre los estados de los procesos son:
Nulo  Nuevo: Se crea un nuevo proceso para ejecutar un programa.
Nuevo  Listo: El sistema operativo pasará un proceso del estado Nuevo al estado Listo cuando esté preparado para
aceptar un proceso más. La mayoría de los sistemas ponen un número límite en función del número de procesos existente o
en la cantidad de memoria virtual dedicada a los procesos existentes.
12
Listo  Ejecución: Cuando es el momento de seleccionar un nuevo proceso para ejecutar, el sistema operativo elige uno de
los procesos del estado Listo.
Ejecución  Terminado: El proceso que se esta ejecutando es finalizado por el sistema operativo si indica que terminó o si
se abandona.
Ejecución  Listo: La razón más común de esta transición es que el proceso que está en ejecución ha alcanzado el tiempo
máximo permitido de ejecución ininterrumpida. Hay otras causas alternativas, por ejemplo si el sistema operativo asigna
diferentes niveles de prioridad a los diferentes procesos.
Ejecución  Bloqueado: Un proceso se pone en el estado Bloqueado si solicita algo por lo que debe esperar.
Bloqueado  Listo: Un proceso que está en el estado Bloqueado pasará al estado Listo cuando se produzca un suceso que
estaba esperando.
Listo  Terminado: Por razones de claridad esta transición no se muestra en el diagrama de estados. En algunos casos un
padre puede terminar con un proceso hijo en cualquier momento. Además, si el padre termina, todos los procesos hijos
asociados con él pueden ser finalizados.
Bloqueado  Terminado: Se aplica lo mismo que en la transición de Listo  Terminado.
Procesos suspendidos
Necesidad de intercambio
En un sistema que no utiliza memoria virtual todos los procesos de todas las colas deben residir en la memoria principal.
La memoria contiene varios procesos y el procesador puede dedicarse a otro proceso cuando uno esté esperando. Pero el
procesador es tan rápido comparado con la E/S que suele ser habitual que todos los procesos de memoria estén esperando
por E/S. Así, incluso con la multiprogramación, el procesador podría estar desocupado la mayor parte del tiempo.
La memoria principal podría ampliarse para alojar más procesos, pero habría dos defectos en este enfoque. Primero, existe
un coste asociado con la memoria principal, que, aunque es pequeño en cuanto al precio por bit, comienza a acumularse
cuando se trata del megabyte y gigabyte de almacenamiento. Segundo, las necesidades de memoria de los programas han
crecido tan rápidamente como el costo de la memoria ha descendido. Por lo tanto, una memoria más grande significa
procesos mayores, pero no más procesos.
Otra solución es el intercambio, lo cual significa mover una parte del proceso o todo el proceso de la memoria principal al
disco. Cuando ninguno de los procesos en la memoria principal está en estado Listo, el sistema operativo pasa al disco uno
de los procesos que esté Bloqueado y lo lleva a la cola de Suspendidos. Esta es una cola de procesos existentes que han
sido sacados temporalmente de memoria principal o suspendidos. El sistema operativo trae entonces otro proceso de la
cola de suspendidos o acepta la solicitud de creación de un nuevo proceso. La ejecución continúa entonces con el nuevo
proceso que ha llegado.
El intercambio es una operación de E/S y por lo tanto existe la posibilidad que el problema empeore en vez de mejorar. Pero
como la E/S con el disco es, en general, la E/S más rápida de un sistema, el intercambio suele mejorar el rendimiento.
Al emplear el intercambio se debe añadir un nuevo estado al modelo del comportamiento de los procesos, el estado
Suspendido. Este estado Suspendido se divide en 2:
Bloqueado y Suspendido: EL proceso está en la memoria secundaria esperando un suceso.
Listo y Suspendido: El proceso está en memoria secundaria pero está disponible, para su ejecución tan pronto como se
cargue en la memoria principal.
Con un esquema de memoria virtual, es posible ejecutar un proceso que esté sólo parcialmente en la memoria principal. Si
se hace una referencia a una dirección del proceso que no está en la memoria principal, entonces debe traerse a la
memoria la parte apropiada del mismo.
Las nuevas transiciones con el estado Suspendido son:
Bloqueado  Bloqueado y Suspendido: Si no hay procesos Listos, entonces al menos un proceso Bloqueado se expulsa
para dar cabida a otro procesos que no este bloqueado.
Bloqueado y Suspendido  Listo y Suspendido: Esta transición se da cuando ocurre un suceso esperado como el término
de una E/S.
Listo y Suspendido  Listo: Cuando no hay procesos Listos en la memoria principal, el sistema operativo tendrá que traer
uno para continuar la ejecución. También puede darse que el proceso de Listo y Suspendido tenga mayor prioridad que el
de Listos.
Nuevo  Listo y Suspendido: Cuando se crea un nuevo proceso se lo puede añadir a la cola de listos o a la de Listos y
Suspendidos.
Ejecución  Listo y Suspendido: Un procesos en ejecución pasa al estado Listo cuando expira su fracción de tiempo
asignado. Sin embargo, si se está expulsando al proceso porque hay un proceso de prioridad mayor en la lista de
Bloqueados y Suspendidos que se acaba de desbloquear, entonces el sistema operativo podría pasar el proceso en
Ejecución directamente a la cola de Listos y Suspendidos, liberando el espacio en la memoria principal.
Razones para la suspensión de procesos
Intercambio: El sistema operativo necesita liberar suficiente memoria principal para cargar un proceso que está listo para
ejecutarse.
Otra razón del SO: El sistema operativo puede suspender a un proceso subordinado o de utilidad, o a un proceso que se
sospecha que sea el causante de un problema.
Solicitud de un usuario interactivo: Un usuario puede querer suspender la ejecución de un programa con fines de
depuración o en conexión con el uso de un recurso.
Temporización: Un proceso puede ejecutarse periódicamente y puede ser suspendido mientras espera el siguiente intervalo
de tiempo.
Solicitud del proceso padre: Un proceso padre puede querer suspender su ejecución de un descendiente para examinar o
modificar el proceso suspendido o para coordinar la actividad de varios descendientes.
13
3.2. Descripción de procesos
El sistema operativo es el que planifica y expide los procesos para su ejecución en el procesador, el que asigna los recursos
a los procesos y el que responde a las solicitudes de servicios básicos realizadas por el programa de usuario.
Estructuras de control del sistema operativo
El sistema operativo va a administrar los procesos y los recursos, entonces tiene que disponer de información sobre el
estado actual de cada proceso y de cada recurso. Para esto el sistema operativo construye y mantiene tablas de
información sobre la entidad que esta administrando.
Las tablas de memoria deben incluir la siguiente información:
 La asignación de memoria principal y secundaria
 Cualquier atributo de protección de bloques de memoria principal o virtual
 Cualquier información necesaria para gestionar la memoria virtual.
Las tablas de E/ son utilizadas por el sistema operativo para administrar los dispositivos y los canales de E/S del sistema
informático.
El sistema operativo también puede mantener tablas de archivos. Estas tablas ofrecen información sobre la existencia de
los archivos, su posición en la memoria secundaria, su estado actual y otros atributos.
El sistema operativo también debe mantener tablas de procesos para administrarlos.
Estructuras de control de procesos
En primer lugar el sistema operativo debe saber dónde está ubicado el proceso y, en segundo lugar, debe conocer los
atributos del proceso que son necesarios para su administración.
Ubicación de los procesos
Un proceso debe incluir un programa o conjunto de programas a ejecutar, asociados a estos programas hay un conjunto de
ubicaciones de datos para las variables locales y globales y las constantes definidas. Además, en la ejecución de un
programa entra en juego normalmente una pila que se utiliza para llevar la cuenta de las llamadas a procedimientos y los
parámetros que se pasan entre procedimientos. Por último, asociado a cada proceso hay una serie de atributos utilizados
por el sistema operativo para el control del proceso. Estos atributos se conocen como bloque de control de proceso. Esta
colección de programa, datos, pila y atributos puede llamarse imagen del proceso.
La ubicación de la imagen del proceso depende del esquema de gestión de memoria utilizado. Para que el sistema
operativo pueda administrar el proceso, al menos una pequeña parte de su imagen debe mantenerse en memoria principal.
Los otros bloques pueden mantenerse en memoria secundaria.
Atributos de los procesos
La información de los bloques de control de procesos se pueden agrupar en tres categorías generales:
 Identificación del proceso: El sistemas operativo le asigna a cada proceso un identificador único.
 Información del estado del procesador: Esta formada por el contenido de los registros del procesador cuando se
está ejecutando. Cuando se interrumpe el proceso, toda la información de los registros debe salvarse de forma que
pueda restaurarse cuando el proceso reanude su ejecución
 Información del control de proceso: Esta es la información adicional necesaria para que el sistema operativo
controle y coordine los diferentes procesos activos.
El papel del bloque de control de proceso
El bloque de control de proceso (PCB) es la estructura de datos más importante de un sistema operativo. Cada bloque de
control de proceso contiene toda la información de un proceso necesaria para el sistema operativo. Los bloques son leídos
o modificados por casi todos los módulos de un sistema operativo, incluyendo aquellos que tienen que ver con la
planificación, la asignación de recursos, el tratamiento de interrupciones y el análisis y supervisión del rendimiento. Puede
decirse que el conjunto de bloques de control de procesos define el estado del sistema operativo.
Varias rutinas del sistema operativo necesitan acceder a la información del bloque de control de procesos. No es difícil
proporcionar acceso directo a estas tablas. Cada proceso está dotado de un único ID que puede utilizarse como índice en
un atabla de punteros a los bloques de control de procesos. La dificultad no está en el acceso, sino más bien en la
protección. Existen 2 problemas:
 Un error en una sola rutina, como la del tratamiento de interrupciones, puede dañar los bloques de control de
proceso, lo que destruirá la capacidad del sistema para administrar los procesos efectuados.
 Un cambio de diseño en la estructura o en la semántica del bloque de control de proceso podría afectar a varios
módulos del sistema operativo.
Estos problemas se pueden solucionar exigiendo que todas las rutinas del sistema operativo pasen a través de una rutina
de gestión, cuya única tarea sería proteger los bloques de control de proceso y que se construirán en el único árbitro para
leer y escribir los bloques.
3.3. Control de procesos
Modos de ejecución
La mayoría de los procesadores soportan 2 modos de ejecución. Ciertas instrucciones solamente se pueden ejecutar en el
modo más privilegiado. Entre éstas están la lectura o modificación de registros de control, tales como la palabra de estado
del programa, instrucciones primitivas de E/S e instrucciones relativas a la gestión de memoria.
El modo menos privilegiado a menudo se conoce como modo de usuario y al modo más privilegiado se lo conoce como
modo núcleo.
La razón por la cual se usan 2 modos es para proteger al sistema operativo y las tablas importantes del mismo.
En el procesador hay un bit en la palabra de estado del programa (PSW) que indica el modo de ejecución.
14
Creación de procesos
Una vez que el sistema operativo decide crear un proceso éste puede proceder como sigue:
1. Asignar un único identificador al nuevo proceso
2. Asignar espacio para el proceso
3. Iniciar el bloque de control del proceso, La parte de información del estado del procesador normalmente se inicia
con la mayor parte de las entradas a cero, excepto para el contador del programa y los punteros de pilas del
sistema. La parte de información de control de procesador se inicia a partir de los valores estándares por omisión y
los atributos que se han solicitado para el proceso.
4. Establecer los enlaces apropiados. Por ejemplo, si el sistema operativo mantiene cada cola de planificación como
una lista enlazada, entonces el proceso nuevo se debe poner en la cola de Listos o de Listos y Suspendidos.
5. Crear o ampliar otras estructuras de control.
Cuando cambiar de proceso
Un cambio de proceso puede producirse en cualquier momento en que el sistema operativo haya tomado el control a partir
del proceso que está actualmente ejecutándose.
En primer lugar, se van a tener en cuenta las interrupciones del sistema, 2 clases de interrupciones del sistema, una
conocida como interrupción y otra conocida como trap. La primera es originada por algún tipo de suceso que es externo e
independiente del proceso que está ejecutándose, como la culminación de una operación de E/S. La segunda tiene que ver
con una condición de error o de excepción generada dentro del proceso que está ejecutándose.
En los trap, el sistema operativo determina si el error es fatal. Si lo es, el proceso que se estaba ejecutando pasa al estado
de Terminado y se produce un cambio de proceso. Si no es fatal, la acción del sistema operativo dependerá de la
naturaleza del error y del diseño del sistema operativo. Se puede intentar algún procedimiento de recuperación o,
simplemente, notificarlo al usuario.
Cambio de modo
Si hay alguna interrupción pendiente, el procesador hace lo siguiente:
1. Salva el contexto del programa que está ejecutándose
2. Asigna al contador de programa el valor de la dirección de comienzo de un programa de tratamiento de la
interrupción.
3. Cambia de modo de usuario a modo de núcleo para que el código que procesa la interrupción pueda incluir
instrucciones privilegiadas.
Cambio de estados de los procesos
Puede producirse un cambio en el modo sin cambiar el estado del proceso que está actualmente en estado de ejecución. Si
el proceso que estaba ejecutándose tiene que pasar a otro estado, el sistema operativo tiene que llevar a cabo cambios
sustanciales en su entorno. Los pasos involucrados en un cambio completo de proceso son los siguientes:
1. Salvar el contexto del procesador, incluyendo el contador del programa y otros registros.
2. Actualizar el bloque de control del proceso que estaba en estado de Ejecución.
3. Mover el bloque de control de proceso a la cola apropiada.
4. Seleccionar otro proceso para su ejecución.
5. Actualizar el bloque de control del proceso seleccionado.
6. Actualizar las estructuras de datos de la gestión de memoria. Esto puede hacer falta dependiendo de cómo se
gestione la traducción de direcciones.
7. Restaurar el contexto del procesador a aquél que existía en el momento en que el proceso seleccionado dejó por
última vez el estado de Ejecución, cargando los valores previos del contador de programa y de otros registros.
Capitulo 4
Hilos, SMP y Micronúcleos
4.1. Procesos e hilos
Un proceso incluye las 2 características siguientes:
 Unidad de propiedad de los recursos: Un proceso incluye un espacio de direcciones virtuales para mantener la
imagen del proceso y, de cuando en cuando, al proceso se le puede asignar el control o la propiedad de recursos
tales como la memoria principal, canales de E/S, dispositivos de E/S y archivos.
 Unidad de expedición: la Ejecución de un proceso sigue un camino de ejecución a través de uno o más programas.
Esta ejecución puede ser intercalada con otros procesos.
Para distinguir estas 2 características, la unidad de expedición se conoce como hilo o proceso ligero, mientras que la
unidad de propiedad de los recursos se la suele llamar proceso o tarea.
Multihilo
El término multihilo hace referencia a la capacidad de un sistema operativo para mantener varios hilos en ejecución dentro
de un mismo proceso.
En un entorno multihilo, un proceso se define como la unidad de protección y unidad de asignación de recursos. A los
procesos se les asocia los siguientes elementos:
 Un espacio de direcciones virtuales, que contiene la imagen del proceso.
 Acceso protegido a los procesadores, otros procesos archivos y recursos de E/S.
En un proceso puede haber 1 o más hilos, cada uno de los siguientes:
 El estado de ejecución del hilo
15

El contexto del procesador, que se salva cuando no está ejecutando; una forma de ver el hilo es como un contador
de programa independiente operando dentro de un proceso.
 Una pila de ejecución.
 Almacenamiento estático para las variables locales.
 Acceso a la memoria y a los recursos del proceso, compartidos con todos los otros hilos del mismo.
Mientras se está ejecutando un proceso, los registros del procesador están controlados por ese proceso y, cuando el
proceso no se está ejecutando, se salva el contenido de los registros. En un entorno multihilo continúa existiendo un solo
bloque de control de proceso y un espacio de direcciones de usuario asociados al proceso, pero ahora hay pilas separadas
para cada hilo, así como distintos bloques de control para cada hilo, que contienen los valores de los registros, prioridad y
otras informaciones relativas al estado de los hilos.
Así, todos los hilos de un proceso comparten el estado los recursos del proceso. Residen en el mismo espacio de
direcciones y tienen acceso a los mismos datos. Cuando un hilo modifica un dato en la memoria, los otros hilos utilizan el
resultado cuando acceden al dato.
Los beneficios clave de los hilos se derivan de las implicaciones de rendimiento:
1. Se tarda mucho menos tiempo en crear un nuevo hilo.
2. Se tarda mucho menos tiempo en terminar un hilo que un proceso.
3. se tarda mucho menos tiempo en cambiar entre dos hilos del mismo proceso.
4. Los hilos aumentan la eficiencia de la comunicación entre programas en ejecución. Puesto que los hilos de un
mismo proceso comparten memoria y archivos, pueden comunicarse entre sí sin invocar al núcleo.
Hay varias acciones que afectan a todos los hilos de un proceso y que el sistema operativo debe gestionar con los
procesos. La suspensión implica la descarga del espacio de direcciones fuera de la memoria principal. Puesto que todos los
hilos de un proceso comparten el mismo espacio de direcciones, todos deben entrar en el estado Suspendido al mismo
tiempo. De manera similar, la terminación de un proceso supone terminar con todos los hilos dentro de dicho proceso.
Funcionalidad de los hilos
Estado de un hilo
En general, no tiene sentido asociar estados de suspensión a hilos porque esos estados pertenecen al concepto de
proceso. En concreto, si un proceso está expulsado de la memoria principal, todos sus hilos deberían estadlo porque todos
comparten el espacio de direcciones del proceso.
Hay cuatro operaciones básicas relacionadas con el cambio de estado en hilos:
 Creación: Normalmente, cuando se crea un nuevo proceso, también se crea un hilo para ese proceso.
Posteriormente, un hilo de un proceso puede crear otros hilos dentro del mismo proceso.
 Bloqueo: Cuando un hilo necesita esperar por un suceso, se bloquea, salvando sus registros de usuario, el contador
de programa y punteros de pila. Ahora, el procesador podrá pasar a ejecutar otro hilo Listo.
 Desbloqueo: Cuando se produce un suceso por el que un hilo se bloqueo, el hilo pasa a la cola de listos.
 Terminación: Cuando un hilo finaliza, se liberan su contexto y sus pilas.
Sincronización de hilos
Todos los hilos de un proceso comparten el mismo espacio de direcciones y otros recursos, como los archivos abiertos.
Cualquier modificación de un recurso desde un hilo afecta al entorno del resto de los hilos del mismo proceso. Es necesario
sincronizar la actividad de los distintos hilos para que no interfieran unos con otros o corrompan las estructuras de datos.
El problema planteado y las técnicas empleadas en la sincronización de hilos son, en general, las mismas que para la
sincronización de procesos.
Hilos a nivel de usuario
En una aplicación ULT (User Level Thread) pura, todo el trabajo de gestión de hilos lo realiza la aplicación y el núcleo no es
consciente de la existencia de hilos. Es posible programar cualquier aplicación como multihilo mediante la biblioteca de
hilos.
Por defecto, una aplicación comienza su ejecución con un hilo. Esta aplicación y su hilo pertenecen a un único proceso,
gestionado por el núcleo. En cualquiera de los instantes en los que la aplicación se está ejecutando la aplicación puede
crear un nuevo hilo que se ejecuta dentro del mismo proceso. La creación la lleva a cabo ejecutando la utilidad de creación
de la biblioteca de hilos.
Son varias las ventajas de usar ULT en lugar de KLT (Kernel Level Thread):
1. El intercambio de hilos no necesita los privilegios de modo de núcleo, porque todas las estructuras de datos de
gestión de hilos están en el espacio de direcciones de usuario de un mismo proceso. Por lo tanto, el proceso no
debe cambiar a modo núcleo para gestionar hilos. Con ello se evita la sobrecarga de dos cambios de modo.
2. Se puede realizar una planificación específica. Por ejemplo para una aplicación puede ser mejor la planificación de
round robin y para otro mejor la planificación por prioridades.
3. Los ULT pueden ejecutar en cualquier sistema operativo. Para dar soporte a ULT no es necesario realizar cambios
en el núcleo. La biblioteca de hilos es un conjunto de utilidades de aplicación compartidas por todas las
aplicaciones.
Existen 2 desventajas en el uso de ULT en vez de KLT:
1. En un sistema operativo, la mayoría de las llamadas al sistema son bloqueadoras. Entonces cuando un ULT ejecuta
una llamada al sistema no sólo se bloquea ese hilo, sino que todos los hilos del proceso.
2. En una estrategia ULT pura, una aplicación multihilo no puede aprovechar las ventajas de los multiprocesadores. El
núcleo asigna un proceso a un solo procesador a la vez por lo tanto, sólo puede ejecutar un hilo de cada proceso en
cada instante.
16
Existen formas de evitar estos 2 problemas. Por ejemplo, ambos pueden superar escribiendo una aplicación en forma de
múltiples procesos en lugar de múltiples hilos. Pero esta solución elimina la principal ventaja de los hilos: cada cambio de
proceso es más costoso que un cambio de hilo, lo que produce mayor sobrecarga.
Otra forma de superar el problema del bloqueo de hilos es mediante una técnica llamada recubrimiento (jacketing). El
propósito del recubrimiento es convertir una llamada bloqueadora al sistema en otra no bloqueadora. Por ejemplo, en vez de
llamar directamente a una función del sistema para E/S, un hilo llama a una función de recubrimiento de E/S de aplicación.
El código de esta función comprueba si el dispositivo de E/S está ocupado. Si es así, el hilo pasa al estado Listo y cede el
control a otro hilo. Cuando, posteriormente, el hilo recibe de nuevo el control, comprueba el dispositivo de E/S otra vez.
Hilos a nivel de núcleo
En una aplicación KLT pura, todo el trabajo de gestión de hilos lo realiza el núcleo.
El núcleo mantiene la información de contexto del proceso como un todo y la de cada hilo dentro del proceso. El núcleo
realiza la planificación en función de los hilos. Este método resuelve los 2 principales inconvenientes de la solución ULT. En
primer lugar el núcleo puede planificar simultáneamente múltiples hilos del mismo proceso en múltiples procesadores. En
segundo lugar, si se bloquea uno de los hilos de un proceso, el núcleo puede planificar otro hilo del mismo proceso. Otra
ventaja de la solución KLT es que las propias funciones del núcleo pueden ser multihilo.
La principal desventaja de esta solución KLT comparada con la solución ULT es que el paso del control de un hilo a otro
dentro del mismo proceso necesita un cambio de modo a modo núcleo.
Aproximaciones combinadas
Algunos sistemas operativos ofrecen un mecanismo que combina ULT y KLT. En un sistema operativo combinado, la
creación de hilos, así como la mayor parte de la planificación y sincronización de los hilos de una aplicación se realiza por
completo en el espacio del usuario. Los múltiples ULT de una sola aplicación se asocian con varios KLT para cada
aplicación y máquina en particular para obtener el mejor resultado global.
Relación de muchos a muchos
En el sistema operativo Trix se utiliza esta relación, donde se tienen los conceptos de dominio y de hilo. Un dominio es una
entidad estática que consta de un espacio de direcciones y de unos puertos que a través de los cuales se envían y reciben
mensajes: un hilo es un camino sencillo de ejecución, con una pila de ejecución, el estado del procesador y la información
de planificación.
Al igual que los enfoques multihilo tratados hasta ahora, se pueden ejecutar varios hilos en un solo dominio, lo que aporta el
aumento de eficiencia expresado anteriormente. Sin embargo, también es posible que una actividad de un solo usuario, o
aplicación, se pueda llevar a cabo en varios dominios. En tal caso, existirá un hilo que se puede mover de un dominio a otro.
Relación de uno a muchos
Un proceso es un espacio de direcciones virtuales con un bloque de control de proceso asociado. Al crearse, un hilo se
comienza a ejecutar en un proceso invocando un punto de entrada a un programa de dicho proceso. Los hilos se pueden
mover de un espacio de direcciones a otro, atravesando de hecho las fronteras de una máquina. Al trasladarse, un hilo debe
llevar consigo cierta información, como el terminal de control, unos parámetros globales y unas guías de planificación.
4.2. Multiproceso simétrico
Al nivel de microoperaciones, se generan muchas señales de control al mismo tiempo. Durante mucho tiempo se ha
abordado el encauzamiento de instrucciones hasta el punto de solapar la lectura con la ejecución de operaciones. Ambas
son ejemplos de funciones en paralelo.
Existen 2 enfoques que ofrecen paralelismo mediante la duplicación de procesadores: multiproceso simétrico (SMP) y
agrupaciones (Cluster).
Arquitectura SMP
Flynn propone las siguientes categorías de sistemas informáticos:
 Flujo de instrucción simple / dato simple (SISD): Un único procesador ejecuta un único flujo de instrucciones para
operar sobre datos almacenados en una única memoria.
 Flujo de instrucción simple / datos múltiples (SIMD): Una única instrucción de máquina controla la ejecución
simultánea de varios elementos del proceso según una secuencia de bloqueos.
 Flujo de instrucción múltiple / dato simple (MISD): Se transmite una secuencia de datos a un conjunto de
procesadores cada uno de los cuales ejecuta una instrucción de la secuencia. Esta estructura no se ha
implementado nunca.
 Flujo de instrucción múltiple /datos múltiples (MIMD): un conjunto de procesadores ejecutan simultáneamente varias
secuencias de instrucciones sobre distintos conjuntos de datos.
En la organización MIMD, los procesadores son de carácter general, porque deben ser capaces de procesar todas las
instrucciones necesarias para realizar la transformación de datos adecuada. Estos sistemas se pueden subdividir en función
de la comunicación entre procesadores. Si cada procesador tiene una memoria dedicada, cada elemento del proceso es un
computador autocontenido. Cada sistema se denomina agrupación o multicomputador. Si los procesadores comparten
memoria, cada uno de ellos accede a programas y datos almacenados en la memoria compartida y se comunican entre sí
por medio de esa memoria; Estos se denominan multiprocesadores con memoria compartida.
Una posible clasificación general de los multiprocesadores con memoria compartida está basada en la forma en que se
asignan los procesos a los procesadores. Los 2 enfoques más importantes son: maestro / esclavo y simetría. En una
arquitectura maestro / esclavo, el núcleo del sistema operativo siempre ejecuta en un procesador determinado. El resto de
los procesadores solamente pueden ejecutar programas de usuario y, en ocasiones, utilidades del sistema operativo. El
maestro es el responsable de la planificación de procesos e hilos. Una vez que un proceso / hilo está activo, si un esclavo
necesita el servicio del sistema operativo debe enviar una petición al maestro y esperar a que se realice el servicio.
Las desventajas de esta solución son las siguientes:
17


Un fallo en el maestro pude producir una caída de todo el sistema.
El maestro puede llegar a ser un cuello de botella, porque él solo debe llevar a cabo toda la planificación y gestión
de procesos.
En un multiprocesador simétrico, el núcleo puede ejecutar en cualquier procesador y, normalmente, cada procesador se
autoplanifica a partir de una cola de procesos o hilos libres. El núcleo puede estar constituido como múltiples procesos o
hilos, lo que permite que haya partes del mismo que se ejecuten en paralelo. Con el enfoque SMP, el sistema operativo es
más complejo. Debe asegurarse de que dos procesadores no escojan el mismo proceso y que los procesos no se pierdan.
Consideraciones de diseño de un sistema operativo multiprocesador
Un usuario puede construir aplicaciones que usen múltiples procesos o múltiples hilos dentro de procesos sin tener en
cuanta si dispone de un solo procesador o muchos. De este modo, un sistema operativo multiprocesador debe ofrecer toda
la funcionalidad de un sistema multiprogramado, junto con las características adicionales para trabajar con múltiples
procesadores. Algunos puntos claves de diseño son los siguientes:
 Procesos o hilos concurrentes: Es necesario que las funciones del núcleo sean reentrantes, para permitir que
varios procesadores ejecuten el mismo código del núcleo al mismo tiempo. Cuando varios procesadores ejecutan
las mismas o distintas partes del núcleo, se deben gestionar las estructuras y tablas del mismo de un modo
adecuado para evitar interbloqueo y las operaciones no válidas.
 Planificación: Se deben evitar los conflictos ya que la planificación se puede realizar en cualquier procesador.
 Sincronización: Cuando varios procesos activos pueden acceder a espacios de memoria o recursos compartidos,
es necesario tomar precauciones para ofrecer una sincronización eficaz.
 Gestión de memoria: La gestión de memoria en un multiprocesador debe solucionar todos los problemas
encontrados en los monoprocesadores. Además, el sistema operativo necesita explotar la capacidad de
paralelismo del hardware, como las memorias multipuerto, para obtener el mejor rendimiento. Es necesario
coordinar los mecanismos de paginación de los distintos procesadores para garantizar la consistencia cuado varios
procesadores comparten una página o segmento y deciden reemplazarla.
 Fiabilidad y tolerancia a los fallos: El sistema operativo debe realizar una degradación proporcional en caso de fallo
de un procesador.
4.3. Micronúcleos
Un micronúcleo es un pequeño núcleo del sistema operativo que proporciona las bases para ampliaciones modulares.
Arquitectura micronúcleo
En los sistemas operativos monolíticos, cualquier procedimiento, podía prácticamente, llamar a cualquier otro. El sistema
operativo Multics creció a 20 millones de líneas de código. Para gestionar esta escala de desarrollo de software se
necesitaron técnicas de programación modular. Concretamente se desarrollaron los sistemas operativos por capas, en los
que las funciones se organizaban jerárquicamente y sólo se produce entre capas adyacentes.
La filosofía en que se basa el micronúcleo es que sólo las funciones absolutamente esenciales se construyen sobre un
micronúcleo y se ejecutan en modo usuario.
Ventajas de la organización micronúcleo
Algunas de las ventajas son:
 Uniformidad de interfaces: Los procesos no necesitan diferenciar entre servicios de usuario y de núcleo, ya que
todos los servicios se utilizan mediante el paso de mensajes.
 Extensibilidad: Permiten añadir nuevos servicios al conjunto de servicios ya existentes en alguna de las áreas
funcionales. En la arquitectura micronúcleo cuando se añade una nueva característica sólo es necesario modificar o
añadir los servidores implicados.
 Flexibilidad: No sólo se pueden añadir nuevas características al sistema operativo, sino que se pueden reducir las
características actuales para dar lugar a una implementación más pequeña y eficiente.
 Portabilidad: No es probable que se mantenga indefinidamente el actual monopolio de Intel sobre la mayoría de los
segmentos de computadores. Entonces, la portabilidad pasará a ser una característica importante en un sistema
operativo. En la arquitectura micronúcleo, todo o, al menos la mayoría del código específico del procesador está en
el micronúcleo. De este modo, los cambios necesarios para portar un sistema a un nuevo procesador son menores
y tendientes a estar ordenados en agrupaciones lógicas.
 Fiabilidad: Un pequeño micronúcleo puede probarse de un modo muy riguroso. El uso de un pequeño número de
interfaces de programa de aplicación (API) aumenta la probabilidad de producir código de calidad para los servicios
del sistema operativo externos al núcleo.
 Soporte a sistemas distribuidos: El micronúcleo ofrece, por si mismo, soporte a sistemas distribuido, incluidas
agrupaciones controladas por un sistema operativo distribuido.
 Soporte a sistemas operativos orientados a objetos: Una arquitectura micronúcleo trabaja adecuadamente en el
entorno de un sistema operativo orientado a objetos.
Rendimiento de micronúcleos
Una desventaja potencial, citada con frecuencia, de los micronúcleos es su rendimiento. Consume más tiempo construir y
enviar un mensaje, o aceptar y decodificar la respuesta, a través del micronúcleo que mediante una simple llamada al
sistema.
Diseño de micronúcleo
Debido a que los distintos micronúcleos muestran un amplio rango de tamaños y funcionalidades, no es posible establecer
reglas estrictas acerca de que funciones debe ofrecer y que estructuras debe incluir un micronúcleo.
18
Un micronúcleo debe incluir aquellas funciones que dependen directamente del hardware y cuya funcionalidad es necesaria
para dar soporte a las aplicaciones y servidores que ejecutan en modo de núcleo. Estas funciones se engloban en las
siguientes categorías generales: Gestión de memoria a bajo nivel, comunicación entre procesos y gestión de interrupciones
y E/S.
Gestión de memoria a bajo nivel
El micronúcleo tiene el control del concepto de hardware de espacio de direcciones, para permitir implementar la protección
en el proceso. Mientras que el micronúcleo es responsable de traducir cada página virtual en un marco de página físico, la
función principal de la gestión de memoria se puede implementar fuera del mismo, incluyendo la protección de los espacios
de direcciones de los procesos, el algoritmo de reemplazo de páginas y el resto de la lógica de la paginación. Existen 3
operaciones que puede dar soporte a la paginación y gestión de memoria externas:
 Cesión: el propietario de un espacio de direcciones (un proceso) puede ceder varias de sus páginas a otro proceso.
El núcleo retira esas páginas del espacio de direcciones del proceso que las cede y las asigna al proceso elegido.
 Asociación: Un proceso puede asociar cualquiera de sus páginas al espacio de direcciones de otro, de forma que
ambos procesos tienen acceso a estas páginas. De esta forma se crea memoria compartida entre los dos procesos.
El núcleo mantiene la asignación de las páginas al propietario original, pero proporciona una asociación que permite
acceder al otro proceso.
 Rellenado: un proceso puede reclamar cualquier página concedida o asociada a otro.
Comunicación entre procesos
Los mensajes son mecanismos básicos de comunicación entre procesos o hilos en un sistema operativo con micronúcleo.
Un puerto es, en esencia, una cola de mensajes destinados a un proceso en particular. Cada puerto tiene asociada una lista
de capacidades de acceso que indica qué proceso puede comunicarse con éste. El núcleo mantiene los identificadores de
puerto en su lista de capacidades de acceso. Un proceso puede obtener acceso a un puerto enviando un mensaje al núcleo
indicándole la nueva capacidad de acceso.
Gestión de interrupciones
El micronúcleo puede reconocer interrupciones, pero no gestionarlas. En lugar de eso, se genera un mensaje desde el
proceso de usuario en ese momento asociado a esa interrupción. El micronúcleo convierte las interrupciones en mensajes,
pero no está involucrado en la gestión de interrupciones específicas para el dispositivo.
Capitulo 5
Concurrencia: Exclusión mutua y sincronización
5.1. Principios generales de la concurrencia
En un sistema multiprogramado con un único procesador, los procesos se intercalan en el tiempo para dar apariencia de
ejecución simultánea. En un sistema multiprocesador no sólo es posible intercalar los procesos, sino también
superponerlos.
En estos temas surgen las siguientes dificultades:
1. Compartir recursos globales está lleno de riesgos. Por ejemplo, si dos procesos hacen uso al mismo tiempo de la
misma variable global y ambos llevan a cabo tanto lecturas como escrituras sobre la variable, el orden en que se
ejecuten las lecturas y escrituras, es critico.
2. Para el sistema operativo resulta difícil gestionar la asignación óptima de recursos.
3. Resulta difícil localizar el error de programación porque los resultados no son, normalmente reproducibles.
Todas las dificultades anteriores se presentan también en los sistemas multiprocesador, ya que también en ellos es
impredecible la velocidad relativa en ejecución de los procesos.
Es necesario proteger las variables globales compartidas y otros recursos globales compartidos. La única forma de hacerlo
es controlar el código que accede a la variable.
Labores del sistema operativo
1. El sistema operativo debe ser capaz de seguir la pista de los distintos procesos activos con el PCB.
2. El sistema operativo debe asignar y retirar los distintos recursos a cada proceso activo. Entre estos recursos se
incluyen: Tiempo de procesador, Memoria, Archivos y Dispositivos de E/S.
3. El sistema operativo debe proteger los datos y los recursos físicos de cada proceso contra injerencias no
intencionadas de otros procesos.
4. Los resultados de un proceso deben ser independientes de la velocidad relativa a la que se realiza la ejecución de
otros procesos concurrentes.
Para comprender cómo se puede abordar la independencia de la velocidad, hace falta estudiar las formas en las que los
procesos pueden intercalar.
Interacción entre procesos
 Los procesos no tienen conocimiento de los demás: estos son procesos independientes que no están pensados
para operar juntos.
 Los procesos tienen un conocimiento indirecto de los otros: Los procesos no conocen necesariamente a los otros
por sus identificadores de proceso, pero comparten el acceso a algunos objetos, como un buffer de E/S.
 Los procesos tienen un conocimiento directo de los otros: los procesos son capaces de comunicarse con los demás
por el identificador de proceso y están diseñados para trabajar conjuntamente en alguna actividad.
Competencia entre procesos por los recursos
19
En el caso de que haya procesos en competencia, se deben solucionar tres problemas de control. El primero es la
necesidad de exclusión mutua. Supóngase que dos o más procesos quieren acceder a un único recurso no compatible,
como una impresora. Durante el curso de la ejecución, cada proceso enviará órdenes al dispositivo de E/S, recibiendo
información de estado, y enviando o recibiendo datos. A estos recursos se les llamará recursos críticos y la parte del
programa que los utiliza se la conoce como sección crítica del programa. Es importante que sólo un programa pueda
acceder a su sección crítica del programa.
Hacer que se cumpla la exclusión mutua crea 2 problemas de control adicional. Uno es el interbloqueo (deadlock).
Considérese 2 procesos P1 y P2 y dos recursos, R1 y R2. donde cada proceso necesita acceder a ambos recursos para
llevar a cabo una parte de su función. En tal caso, es posible que se presente la siguiente situación: el sistema operativo
asigna R1 a P2 y R2 a P1. Cada proceso está esperando a uno de los dos recursos. Ninguno liberará el recurso que ya
posee hasta que adquiera el otro y realice la función para la que necesita ambos. Los 2 procesos están interbloqueados.
Un último problema de control es la inanición. Por ejemplo si existen 3 procesos P1, P2 y P3, necesitan acceder
periódicamente al recurso R. la situación que se tiene que dar es la siguiente: P1 está en posesión del recurso y tanto P2
como P3 están parados, esperando al recurso. Cuando P1 abandona su sección crítica tanto P2 como P3 deben poder
acceder a R. Suponiendo que se le concede el acceso a P3 y que, antes de que termine su sección crítica, P1 solicita
acceso de nuevo. Si el sistema operativo le concede el acceso a P1 una vez que P3 termine y se concede el acceso a P1 y
P3 alternativamente, se puede negar indefinidamente a P2 el acceso al recurso, aunque se produzca una situación de
interbloqueo.
Cooperación entre procesos por compartimiento
En caso de cooperación por compartimiento comprende los procesos que interactúan con otros sin tener conocimiento
explícito de ellos. Por ejemplo, varios procesos pueden tener acceso a variables compartidas, archivos o bases de datos
compartidas. Los procesos pueden emplear y actualizar los datos compartidos sin hacer referencia a otros procesos, pero
son conscientes de que estos otros pueden tener acceso a los mismos datos.
Cooperación entre procesos por comunicación
Cuando los procesos cooperan por comunicación, los distintos procesos participan en una labor común que uno a rodos los
procesos. La comunicación es una manera de sincronizar o coordinar las distintas actividades.
Requisitos para usar la región crítica
La región crítica de un proceso es la fase o etapa de la vida de ese proceso concurrente la cual puede acceder a un recurso
crítico para modificarlo o alterarlo. Es un trozo de código en el que se utiliza un recurso compartido y que se ejecuta de
forma exclusiva.
Cualquier servicio o capacidad que dé soporte para la mutua exclusión debe cumplir los requisitos siguientes:
1. Mutua exclusión: Solo 1 proceso a la vez puede estar ejecutando la región crítica.
2. Progreso: Un proceso fuera de la región crítica no debe impedir la entrada de otro proceso a la misma. Sólo los
procesos que quieren entrar a la región crítica deben participar en la decisión.
3. Espera limitada: Un proceso debe poder entrar a la región crítica después de un número limitado de intentos.
4. Abandono: Un proceso debe dejar a la región crítica después de un tiempo finito.
5. Penalidad: Un proceso no puede consumir tiempo de ejecución mientras espera por un recurso.
6. Privilegio: No debe hacer ningún proceso privilegiado que monopolice la región crítica.
Hay varias formas de satisfacer los requisitos de exclusión mutua. Una manera es dejar la responsabilidad a los procesos
que deseen ejecutar concurrentemente. Así pues, tanto si son programas de sistema como de aplicación, los procesos
deben coordinarse unos con otros para cumplir la exclusión mutua, sin ayuda por parte del lenguaje de programación o del
sistema operativo. Estos métodos se conocen como soluciones por software. Aunque las soluciones por software son
propensas a errores y una fuerte carga de proceso. El segundo método que se propone es el uso de instrucciones de la
máquina a tal efecto. Estas tienen la ventaja de reducir la sobrecarga pero, sin embargo, se verá que no son interesantes
como soluciones de carácter general. El tercer método consiste en dar algún tipo de soporte en el sistema operativo o en un
lenguaje de programación.
5.2. Exclusión mutua: soluciones por Software
Pueden implementarse soluciones por software para los procesos concurrentes que se ejecutan en máquinas
monoprocesador o multiprocesador con una memoria principal compartida. Normalmente, estas soluciones suponen que
existe una exclusión mutua elemental en el acceso a la memoria. Es decir, los accesos simultáneos (lectura o escritura) a la
misma posición de memoria se hacen en serie, por medio de algún tipo de árbitro de memoria, aunque el orden en el que se
conceden los accesos no se concede por adelantado.
Algoritmo de Dekker
Primer intento
Se reserva una posición de memoria global llamada turno. Un proceso (P0 o P1) que desee ejecutar su sección crítica
primero examina el contenido de turno. Si el valor de turno es igual al número de proceso, el proceso puede continuar con
su sección crítica. En otro caso, el proceso se ve obligado a esperar. El proceso en espera lee repetitivamente el valor de
turno hasta que puede entrar en su sección crítica. Este procedimiento se denomina espera activa porque un proceso
frustrado no puede hacer nada productivo hasta que obtiene permiso de entrar en su sección crítica.
Después de que un proceso haya obtenido acceso a su sección crítica y haya terminado con ella, debe actualizar el valor de
turno para el otro proceso.
Esta solución garantiza el cumplimiento de la exclusión mutua, pero tiene dos inconvenientes. Primero, los procesos deben
alternarse de forma estricta en el uso de sus secciones críticas; así, el ritmo de ejecución viene dictado por él más lento.
Un problema mucho mas serio es que si un proceso falla, el otro proceso se bloquea permanentemente. Esto es cierto tanto
si un proceso falla en su sección crítica como fuera de ella.
20
Proceso 0
While (turno!=0)
// No hacer nada;
//Sección critica;
turno=1;
Proceso 1
While (turno!=1)
//no hacer nada
//Sección crítica
turno=0;
Segundo intento
El problema de la primera tentativa es que se almacenaba el nombre del proceso que podía entrar en su sección crítica
cuando, de hecho, lo que hace falta tener es información del estado de ambos procesos. En realidad, cada proceso debería
tener su propia llave de la sección crítica para que, si uno de ellos falla, el otro pueda seguir accediendo a su sección crítica.
Para cumplir este requisito se define un vector booleano señal, donde señal[0] se corresponde con P0 y señal[1] con P1.
Cada proceso puede examinar el valor de señal del otro, pero no modificarlo. Cuando un proceso desea entrar en su
sección crítica, comprueba periódicamente la variable señal del otro hasta que tiene el valor falso, lo que indica que el otro
proceso no está en su sección crítica. Entonces, asigna a su propia señal el valor cierto y entra en su sección crítica.
Cuando deja su sección crítica, asigna falso a su señal.
Si uno de los procesos falla fuera de la sección crítica, incluyendo el código, para dar valor a las variables señal, el otro
proceso no se queda bloqueado. Sin embargo si un proceso falla en su sección crítica o después de haber asignado cierto a
su señal, el otro proceso estará bloqueado permanentemente.
Esta solución es peor que el primer intento porque no siempre se garantiza la exclusión mutua. Siguiendo la siguiente
secuencia:
P0 ejecuta la sentencia while y encuentra la señal[1] en falso
P1 ejecuta la sentencia while y encuentra la señal[0] en falso
P0 pone señal[0] a cierto y entra en su sección crítica
P0 pone señal[1] a cierto y entra en su sección crítica
Puesto que ambos procesos están en sus secciones críticas, el programa es incorrecto. El problema está en que la solución
propuesta no es independiente de la velocidad de ejecución relativa de los procesos.
Proceso 0
Proceso 1
While (señal[1])
While (señal[0])
// No hacer nada;
// No hacer nada;
señal[0]=cierto;
señal[1]=cierto;
//Sección critica;
//Sección critica;
señal[0]=falso;
señal[1]=falso;
Tercer intento
El segundo intento falla porque un proceso puede cambiar su estado después de que otro proceso lo ha comprobado pero
antes de que pueda entrar en su sección crítica.
Esta solución garantiza la exclusión mutua, pero origina un problema más. Si ambos procesos ponen sus variables señal a
cierto antes de que ambos hayan ejecutado la sentencia while, cada uno pensará que el otro ha entrado en su sección
crítica y provocará un interbloqueo.
Proceso 0
Proceso 1
señal[0]=cierto;
señal[1]=cierto;
While (señal[1])
While (señal[0])
// No hacer nada;
// No hacer nada;
//Sección critica;
//Sección critica;
señal[0]=falso;
señal[1]=falso;
Cuarto intento
En el tercer intento, un proceso fijaba su estado sin conocer el estado del otro. El interbloqueo se produce porque cada
proceso puede insistir en su derecho a entrar en la sección crítica; no hay opción para volver atrás desde esta situación. Se
puede intentar arreglar esto haciendo que los procesos sean más educados: deben activar su señal para indicar que desean
entrar en la sección crítica, pero deben estar listos para desactivar la variable señal y ceder la preferencia a otro proceso. La
exclusión mutua aún no esta garantizada con un razonamiento similar al seguido con el estudio del tercer intento.
Considerando la siguiente secuencia de sucesos:
P0 pone señal[0] a cierto
P1 pone señal[1] a cierto
P0 comprueba señal[1]
P1 comprueba señal[0]
P0 pone señal[0] a falso
P1 pone señal[1] a falso
P0 pone señal[0] a cierto
P1 pone señal[1] a cierto
21
Esta secuencia podría prolongarse indefinidamente y ningún proceso podría entrar en su sección crítica. Estrictamente
hablando, esto no es un interbloqueo, porque cualquier cambio en la velocidad relativa de los procesos rompería este ciclo y
permitiría a uno entrar en la sección crítica. Esta situación se denomina bloqueo vital (livelock). El interbloqueo se produce
cuando un conjunto de procesos desean entrar en sus secciones críticas pero ninguno lo consigue. Con el bloque vital hay
posibles secuencias de ejecución con éxito, pero también es posible describir una o más secuencias en las que los
procesos nunca entran en su sección crítica.
Proceso 0
Proceso 1
señal[0]=cierto;
señal[1]=cierto;
While (señal[1])
While (señal[0])
{
{
señal[0]=falso;
señal[1]=falso;
// Esperar;
// Esperar;
señal[0]=cierto;
señal[1]=cierto;
}
}
//Sección critica;
//Sección critica;
señal[0]=falso;
señal[1]=falso;
Una solución correcta
Se hace necesario imponer algún orden en la actividad de los dos procesos para evitar el problema de cortesía mutua que
se acaba de observar. La variable turno del primer intento puede usarse en esta labor; en este caso la variable indica qué
proceso tiene prioridad para exigir a la entrada a la sección crítica.
Es posible describir ésta como sigue. Cuando P0 quiere entrar en su sección crítica, pone su señal a cierto. A continuación,
comprueba la variable señal de P1. Si está en falso, P0 puede entrar inmediatamente en su sección crítica. En otro caso, P0
consulta turno. Si encuentra que turno=0, sabe que es momento de insistir y comprueba periódicamente el valor de señal
para P1. en algún momento P1 se percatará de que es momento de ceder y asignará falso a su señal permitiendo continuar
a P0. Después de que P0 haya ejecutado su sección crítica, pone su señal a falso para liberar la sección crítica y pone turno
a 1 para traspasar el derecho.
5.3. Exclusión mutua: soluciones por hardware
Inhabilitación de interrupciones
En una máquina monoprocesador, la ejecución de procesos concurrentes no puede superponerse; los procesos solo
pueden intercalarse. Es más, un proceso continuara hasta que solicite un nuevo servicio del sistema operativo o hasta que
sea interrumpido. Por lo tanto, para garantizar la exclusión mutua, es suficiente con impedir que un proceso sea
interrumpido. Esta capacidad puede ofrecerse en forma de primitivas definidas por el núcleo del sistema para Habilitar o
inhabilitar interrupciones.
Puesto que la sección crítica no puede ser interrumpida, la exclusión mutua está garantizada. Sin embrago, el precio de
esta solución es alto. Un segundo problema es que esta técnica no funciona en arquitecturas multiprocesador. Cuando el
sistema tenga más de un procesador, es posible que haya más de un proceso ejecutándose al mismo tiempo. En este
caso, inhabilitar interrupciones no garantiza la exclusión mutua.
Instrucción comparar y fijar
Instrucción comparar y fijar (TAS, Test And Set) se puede definir de la siguiente forma:
booleano TS(int i)
{
If (i == 0)
{
i = 1;
return cierto;
}
else
{
return falso;
}
}
La instrucción examina el valor del argumento i. Si el valor es 0 lo cambia por 1 y devuelve cierto. En otro caso, el valor no
se modifica y devuelve falso. La función comparar y fijar (TAS) se ejecuta atómicamente en su totalidad, es decir, no esta
sujeta a interrupciones.
Se da un valor 0 inicial a una variable compartida cerrojo. El único proceso que puede entrar en su región crítica es el que
encuentre cerrojo igual a 0. Todos los demás procesos intentan entrar y pasan a un modo de espera activa. Cuando un
proceso abandona su sección crítica, vuelve a poner cerrojo a 0; en ese momento sólo uno de los procesos que esperan
obtendrá acceso a su sección crítica.
La instrucción intercambiar
22
Esta instrucción intercambia el contenido de un registro con el de una posición de memoria. Durante la ejecución de la
instrucción, se bloquea el acceso a la posición de memoria de cualquier otra instrucción que haga referencia a la misma
posición.
Propiedad es de las soluciones con instrucciones de máquina
El uso de instrucciones especiales de la máquina para hacer cumplir la exclusión mutua tiene varias ventajas:
 Es aplicable a cualquier número de procesos en sistemas con memoria compartida, tanto de monoprocesador como
de multiprocesador.
 Es simple y fácil de verificar.
 Puede usarse para disponer de varias secciones críticas; cada sección crítica puede definirse con su propia
variable.
Algunas desventajas importantes son las siguientes:
Se emplea espera activa, puede producirse inanición o puede producirse interbloqueo.
5.4. Semáforos
El principio fundamental es el siguiente: dos o más procesos pueden cooperar por medio de simples señales, de forma que
se pueda obligar a detener a un proceso en una posición determinada hasta que reciba una señal específica.
Se pueden contemplar los semáforos como variables que tienen un valor entero sobre el que se definen las tres
operaciones siguientes:
1. Un semáforo puede iniciarse con un valor no negativo.
2. La operación wait disminuye el valor del semáforo. Si el valor se hace negativo, el proceso se bloquea.
3. La operación signal incrementa el valor del semáforo. Si el valor no es positivo, se desbloquea un proceso
bloqueado por una operación wait.
Las primitivas wait y signal se suponen atómicas, es decir, no pueden ser interrumpidas y cada rutina puede considerarse
como un paso indivisible. Una versión mas limitada de los semáforos es conocida como semáforo binario. Un semáforo
binario sólo permite tomar los valores 0 y 1. Tanto en los semáforos como en los semáforos binarios se emplea una cola
para mantener los procesos esperando en el semáforo. La cuestión reside en el orden en que se retiran los procesos de
dicha cola. La política mas equitativa es la FIFO; el proceso que ha estado bloqueado durante más tiempo se libera de la
cola; un semáforo cuya definición incluye esta estrategia se denomina semáforo robusto. Un semáforo que no especifica el
orden en el que se retiran los procesos de la cola es un semáforo débil.
Problema del productor/consumidor
El planteo general es el siguiente: uno o más productores generan ciertos tipos de datos y los sitúan en un buffer. Un único
consumidor saca elementos del buffer uno a uno. El sistema debe impedir la superposición de operaciones sobre el buffer.
Sólo un agente (productor/consumidor) puede acceder al buffer en un instante dado.
El productor puede generar elementos y almacenarlos en el buffer a su propio ritmo. En cada ocasión, se incrementa el
índice (ent) en el buffer. El consumidor procede de forma similar, pero debe estar seguro de que no intenta leer de un buffer
vacío. Por lo tanto, el consumidor debe asegurarse de que el productor ha progresado por delante de él (ent > sal) antes de
continuar.
5.5. Monitores
Los monitores son estructuras de lenguaje de programación que ofrecen una funcionalidad equivalente a la de los
semáforos y que son más fáciles de controlar.
Monitores con señales
Un monitor es un módulo de software que consta de uno o más procedimientos, una secuencia de inicio y unos datos
locales. Las características básicas de un monitor son las siguientes:
1. Las variables de datos locales están sólo accesibles para los procedimientos del monitor y no para los
procedimientos externos.
2. Un proceso entra en el monitor invocando a un o de sus procedimientos.
3. Sólo un proceso puede estar ejecutando en el monitor en un instante dado. Cualquier otro proceso que haya
invocado al monitor quedará suspendido mientras espera a que el monitor esté disponible.
Para que resulten útiles en el proceso concurrente, los monitores deben incluir herramientas de sincronización. Por ejemplo,
supóngase que un proceso llama a un monitor y, mientras está en el monitor, debe suspenderse hasta que se cumpla
alguna condición. Hace falta un servicio para que el proceso no sólo este suspendido, sino que libere el monitor y otro
proceso pueda entrar. Más tarde, cuando se cumpla la condición y el monitor esté de nuevo disponible, el proceso tiene que
reanudarse y tiene que permitírsele volver a entrar en el monitor en el punto de suspensión.
Un monitor proporciona sincronización por medio de las variables de condición que se incluyen dentro dentro del monitor y
que son accesibles sólo desde dentro. Hay dos funciones para operar con las variables de condición:
 cwait(c): Suspende la ejecución del proceso que llama bajo la condición c. El monitor está ahora disponible para ser
usado por otros procesos.
 csignal(c): Reanuda la ejecución de algún proceso suspendido después de un cwait bajo la misma condición. Si hay
varios procesos, elige uno de ellos; si no hay ninguno, no hace nada.
La ventaja que tienen los monitores sobre los semáforos es que todas las funciones de sincronización están confinadas
dentro del monitor. Una vez que un monitor está correctamente programado, el acceso al recurso protegido es correcto para
todos los procesos. Con los semáforos, en cambio, el acceso al recurso es correcto sólo si todos los procesos que acceden
al recurso están correctamente programados.
Monitores con notificación por difusión
23
Los monitores anteriores presentan algunas dificultades:
1. Si el proceso que ejecuta el csignal no ha terminado en el monitor, hace falta dos cambios de proceso adicionales:
uno para suspender el proceso y otro para reanudarlo cuando el monitor este disponible.
2. Cuando se ejecuta un csignal, debe activarse inmediatamente un proceso de la cola de la condición
correspondiente y el planificador debe asegurarse de que ningún otro proceso entra al monitor antes de la
activación.
El nuevo monitor provee un método diferente que supera los problemas mencionados. La primitiva csignal se reemplaza por
cnotify. Cuando un proceso que está en el monitor ejecuta un cnotify, origina una notificación hacia la cola de cierta
condición, pero el proceso que dio la señal puede continuar ejecutando. El resultado de la notificación es que el proceso de
la cabeza de la cola de esa condición será en el futuro cercano, cuando el monitor esté disponible.
Una modificación útil que se puede asociar a la primitiva cnotify es establece un temporizador de guarda. Un proceso que
ha estado esperando durante el intervalo máximo de guarda será situado en el estado de listo independientemente de si se
ha notificado la condición. Cuando el proceso se active, éste comprueba la condición y continúa ejecutando si es que éste
se cumple. El temporizador entonces lo que impide es la inanición indefinida de un proceso. Siguiendo la norma de notificar
a los procesos en lugar de reactivarlos a la fuerza, se puede añadir una primitiva de difusión cbroadcast. Esta primitiva
provoca que todos los procesos que están esperando alguna condición se sitúen en el estado Listo. Las dos ventajas que
presenta este tipo de monitores con respecto al anterior son que el segundo es menos propenso a errores y además
presenta un método más modular de construcción de programas.
Desventajas:
 Son un concepto del lenguaje de programación.
 No sirven para procesos distribuidos.
5.6. Paso de mensajes
Cuando los procesos interactúan unos con otros, se deben satisfacer dos requisitos básicos: la sincronización y la
comunicación. Los procesos tienen que sincronizarse para cumplir la exclusión mutua; los procesos cooperantes pueden
necesitar intercambiar información. Un método posible para ofrecer ambas funciones es el paso de mensajes. El paso de
mensajes tiene la ventaja adicional de que se presta a ser implementado en sistemas distribuidos, así como en sistemas
multiprocesador y monoprocesador de memoria compartida.
Sincronización
La comunicación se debe a que un proceso recibe un mensaje, obtiene los datos enviados por otro proceso y la
sincronización se produce porque un mensaje solo puede ser recibido después de ser enviado.
Cuando se ejecuta la primitiva send en un proceso, hay 2 posibilidades: o bien el proceso emisor se bloquea hasta que se
recibe el mensaje o no se bloquea. Análogamente, cuando un proceso ejecuta una primitiva recive, hay 2 posibilidades:
1. Si previamente se ha enviado algún mensaje, éste es recibido y continúa la ejecución.
2. Si no hay ningún mensaje esperando entonces o bien el proceso se bloqueara hasta que llega un mensaje o el
proceso continúa ejecutando, abandonando el intento.
Así es que tanto el emisor como el receptor pueden ser bloqueantes o no.
Envío bloqueante, recepción bloqueante: Esta técnica se conoce como Rendervouz y permite una fuerte sincronización
entre procesos.
Envío no bloqueante, recepción bloqueante: Probablemente la combinación mas útil.
Envió no bloqueante, recepción no bloqueante: nadie tiene que esperar.
Direccionamiento
Los distintos esquemas para hacer referencia a los procesos en las primitivas send y recive se encuadran dentro de dos
categorías: Direccionamiento directo e indirecto. Con el direccionamiento directo, la primitiva send incluye una identificación
específica del proceso destino. La primitiva recive se puede gestionar de dos formas. Una posibilidad requiere que el
proceso designe explícitamente un proceso emisor. Así pues, el proceso debe conocer de antemano de que proceso espera
un mensaje. Esto suele ser eficaz para procesos concurrentes y cooperantes. En otros casos, sin embargo es imposible
especificar el proceso de origen por anticipado.
El otro enfoque es el direccionamiento indirecto. En este caso, los mensajes no se envían directamente del emisor al
receptor, sino a una estructura compartida formada por colas que guardan los mensajes temporalmente.
Una ventaja del direccionamiento indirecto es que se desacopla a emisor y receptor, permitiendo una mayor flexibilidad en
el uso de los mensajes. La relación entre emisores y receptores puede ser uno a uno, muchos a uno, uno a muchos o
muchos a muchos.
Formato de mensajes
El formato de mensajes depende de los objetivos del servicio de mensajería y de si el servicio se ejecuta en un computador
independiente o en un sistema distribuido. Para algunos sistemas operativos, los diseñadores han elegido mensajes cortes
y de tamaño fijo para minimizar el procesamiento y el coste de almacenamiento. Si se va a pasar una gran cantidad de
datos, los datos pueden ponerse en un archivo y el mensaje simplemente hará referencia a ese archivo. Una solución más
flexible es permitir mensajes de longitud variable.
Exclusión mutua
Suponiendo que se usan las primitivas recive bloqueantes y send no bloqueantes. Un conjunto de procesos concurrentes
comparten un buzón, exmut, que puede ser usado por todos los procesos para enviar y recibir. El buzón contiene
inicialmente un único mensaje, de contenido nulo. Un proceso que desea entrar en su sección crítica intenta primero recibir
el mensaje. Si el buzón está vacío, el proceso se bloquea. Una vez que un proceso ha conseguido el mensaje, ejecuta su
sección crítica y, después, devuelve el mensaje al buzón. De este modo, el mensaje funciona como un testigo (token) que
se pasa de un proceso a otro.
24
Capitulo 6
Concurrencia: Interbloqueo e Inanición
6.1. Principios del interbloqueo
El interbloqueo se puede definir como un bloqueo permanente de un conjunto de procesos que compiten por los recursos
del sistema o bien se comunican unos con otros.
Recursos reutilizables
Un recurso reutilizables es aquel que puede ser usado con seguridad por un proceso y no se agota con el uso. Los
procesos obtienen unidades de recursos que liberan posteriormente para que otros procesos las reutilicen. Como ejemplos
de recursos reutilizables se tienen los procesadores, canales de E/S, memoria principal y secundaria.
Como ejemplo de interbloqueo de recursos reutilizables, considérense dos procesos que compiten por el acceso exclusivo
a un archivo D del disco y a una unidad de cinta T. El interbloqueo se produce si cada proceso retiene un recurso y solicita
el otro.
Recursos consumibles
Un recurso consumible es aquel que puede ser creado y destruido. Normalmente, no hay límite en el número de recursos
consumibles de un tipo en particular. Cuando un proceso adquiere un recurso éste deja de existir. Como por ejemplo los
recursos consumibles están las interrupciones, señales, mensajes e información en buffer de E/S.
Condiciones de interbloqueo
En la política del sistema operativo, deben darse tres condiciones para que pueda producirse un interbloqueo:
1. Exclusión mutua: Sólo un proceso puede usar un recurso a la vez.
2. Retención y espera: un proceso puede retener unos recursos asignados mientras espera que se le asignen otros.
3. No apropiación: ningún proceso puede ser forzado a abandonar un recurso que retenga.
Puede existir interbloqueo con estas tres condiciones, pero no puede existir con sólo estas tres condiciones. Para que se
produzca el interbloqueo, se necesita una cuarta condición:
4. Círculo vicioso de espera: existe una cadena cerrada de procesos, cada uno de los cuales retiene, al menos, un
recurso que necesita el siguiente proceso de la cadena.
6.2. Prevención del interbloqueo
La estrategia de prevención del interbloqueo consiste a grandes rasgos, en diseñar un sistema de manera que esté excluida
la posibilidad de interbloqueo. Los métodos para prevenir el interbloqueo son de dos tipos. Los métodos indirectos consisten
en impedir la aparición de alguna de las tres condiciones necesarias antes mencionadas. Los métodos directos consisten en
evitar la aparición del círculo vicioso de espera. Se examinarán a continuación las técnicas relacionadas con cada una de
las cuatro condiciones.
Exclusión mutua
En general, la primera de las cuatro condiciones no puede anularse. Si el acceso a un recurso necesita mutua exclusión, el
sistema operativo debe soportar la exclusión mutua.
Retención y espera
La condición de retención y espera puede prevenirse exigiendo a todos los procesos soliciten todos los recursos que
necesiten a un mismo tiempo y bloqueando el proceso hasta que todos los recursos puedan concederse simultáneamente.
Esta solución resulta eficiente por dos factores. En primer lugar, un proceso puede estar suspendido durante mucho tiempo,
esperando que se concedan sus solicitudes de recursos, cuando de hecho podría haber avanzado con sólo algunos de los
recursos. En segundo lugar, los recursos asignados a un proceso pueden permanecer sin usarse durante períodos
considerables, tiempo durante el cual se priva del acceso a otros procesos.
No apropiación
La condición de no apropiación puede prevenirse de varias formas. Primero, si a un proceso que retiene ciertos recursos se
le deniega una nueva solicitud, dicho proceso deberá liberar sus recursos anteriores y solicitarles de nuevo, cuando sea
necesario, junto con el recurso adicional. Por otra parte, si un proceso solicita un recurso que actualmente está retenido por
otro proceso, el sistema operativo puede expulsar al segundo proceso y exigirle que libere sus recursos.
Circulo vicioso de espera
La condición de círculo vicioso de espera puede prevenirse definiendo una ordenación lineal de los tipos de recursos. Si un
proceso se le ha asignado recursos de tipo R, entonces sólo podrá realizar peticiones posteriores sobre los recursos de los
tipos siguientes a R en la ordenación.
6.3. Predicción del interbloqueo
Una forma de resolver el problema del interbloqueo, que se diferencia sutilmente de la prevención, es la predicción del
interbloqueo. En la prevención de interbloqueo, se obliga a las solicitudes de recursos a impedir que sucediera, por lo
menos, alguna de las cuatro condiciones de interbloqueo. Esto se hace indirectamente, impidiendo la aparición de una de
las tres condiciones necesarias o directamente, impidiendo la aparición de un círculo vicioso de espera. Con predicción del
interbloqueo, por otro lado, se puede alcanzar las tres condiciones necesarias, pero se realizan con elecciones acertadas
para asegurar que nunca se llega al punto de interbloqueo. La predicción, por lo tanto permite más concurrencia que la
prevención. Con la predicción del interbloqueo, se decide dinámicamente si la petición actual de asignación de un recurso
25
podría, de concederse, llevar potencialmente a un interbloqueo. La predicción del interbloqueo necesita, por lo tanto,
conocer las peticiones futuras de recursos.
6.4. Detección del interbloqueo
Las estrategias de prevención del interbloqueo son muy conservadoras; solucionan el problema del interbloqueo limitando el
acceso a los recursos e imponiendo restricciones a los procesos. En el lado opuesto, las estrategias de detección del
interbloqueo no limitan el acceso a los recursos ni restringen las acciones de los procesos. Con detección del interbloqueo,
se concederán los recursos que los procesos necesitan siempre que sea posible. Periódicamente, el sistema operativo
ejecuta un algoritmo que permite detectar la condición de círculo vicioso.
Algoritmo de detección del interbloqueo
El control del interbloqueo puede llevarse a cabo tan frecuentemente como las solicitudes de recursos o con una frecuencia
menor, dependiendo de la probabilidad de que se produzca el interbloqueo. La comprobación en cada solicitud de recursos
tiene 2 ventajas: conduce a una pronta detección y el algoritmo es relativamente simple.
Un algoritmo de detección de interbloqueo utiliza la matriz Asignación y un vector Disponible, además se emplea una matriz
solicitud (Q) definida en forma que Qij representa la cantidad de recursos del tipo j asociados al proceso i. El algoritmo
funciona marcando los procesos que no están interbloqueados. Inicialmente, todos los procesos están sin marcar. A
continuación, se llevan a cabo los siguientes pasos:
1.
Marcar cada proceso que tiene una columna de la matriz, asignación a cero.
2.
Iniciar el vector temporal W con el vector Disponible
3.
Buscar el índice i tal que el proceso i no esté actualmente marcado y la columna
i-ésima de Q sea menor o igual que W. Es decir Qik<=Wk para 1<=K<=m. Si no se
encuentra, el
algoritmo ha terminado.
4.
si se encuentra la columna, marcar el proceso i y sumar la columna
correspondiente
de la matriz. Asignación a W. Es decir, Wi= Wk + Aik para
1<= k <= m. Volver al paso 3.
Existe interbloqueo si y sólo si hay procesos no marcados al terminar el algoritmo. Cada proceso no marcado está
interbloqueado. Nótese que este algoritmo no garantiza la inexistencia de interbloqueo; eso dependerá del orden en que se
concedan las solicitudes. Todo lo que hace es determinar si se produce el interbloqueo.
Recuperación
Las técnicas siguientes son posibles enfoques, enumeradas en orden creciente de sofisticación:
1.
Abortar todos los procesos interbloqueados
2.
Retroceder cada proceso interbloqueado hasta algún punto de control definido previamente y volver a ejecutar
todos los procesos. Es necesario que haya disponibles unos mecanismos de retroceso y reinicio en el sistema.
3.
Abortar sucesivamente procesos interbloqueados hasta que deje de haber interbloqueado.
4.
Apropiarse de recursos sucesivamente hasta que deje de haber interbloqueo. Como en el punto 3, se debe
emplear una selección basada en el coste y hay que ejecutar de nuevo el algoritmo de detección después de
cada apropiación. Un proceso que pierde un recurso por apropiación debe retroceder hasta un momento
anterior a la adquisición de ese recurso.
Para los puntos (3) y (4), el criterio de selección podría ser uno de los siguientes, consistentes en escoger el proceso con:
 La menor cantidad de tiempo de procesador consumido hasta ahora
 El menor número de líneas de salida producidos hasta ahora
 El mayor tiempo restante estimado
 El menor número total de recursos asignados hasta ahora
 La prioridad mas baja
6.5. Una estrategia integrada de interbloqueo
El lugar de intenta diseñar un servicio del sistema operativo que emplee sólo una de las estrategias, puede ser más eficiente
usar diferentes estrategias en diferentes situaciones:
 Agrupar los recursos en un numero de clases diferentes
 Usar la estrategia de ordenación lineal definida anteriormente para la prevención de círculos viciosos de espera e
impedir el interbloqueo entre clases de recursos.
 Dentro de cada clase de recursos, emplear el algoritmo más apropiado para dicha clase.
Capitulo 9
Planificación de monoprocesadores
9.1. Tipos de planificación
El propósito de la planificación del procesador consiste en asignar los procesos al procesador o los procesadores para que
sean ejecutados a lo largo del tiempo. En muchos sistemas, la actividad de planificación se divide en tres funciones
independientes: planificación a largo, medio y corto plazo.
La planificación a largo plazo se lleva a cabo al crear un proceso nuevo. La planificación a medio plazo forma parte de la
función de intercambio.
26
Esta es la decisión de añadir un proceso a los que se encentran, al menos parcialmente, en la memoria principal y por lo
tanto disponibles para la ejecución. La planificación a corto plazo consiste en decidir qué proceso en estado Listo será el
que se ejecute a continuación.
Planificación a largo plazo
La planificación a largo plazo determina cuáles son los programas admitidos en el sistema. De esta forma, controla el grado
de multiprogramación.
Planificación a medio plazo
La planificación a medio plazo forma parte de la función de intercambio.
Planificación a corto plazo
El planificador a corto plazo, también conocido como distribuidor (dispatcher), es el de ejecución más frecuente y toma
decisiones con un mayor detalle sobre el proceso que se ejecutará a continuación.
9.2. Algoritmos de planificación
Criterios de la planificación a corto plazo
El criterio más empleado establece dos clasificaciones. En primer lugar, se puede hacer una distinción entre los criterios
orientados al usuario y los orientados al sistema. Los criterios orientados al usuario se refieren al comportamiento del
sistema tal y como lo perciben los usuarios o los procesos individuales.
Otros criterios están orientados al sistema, esto es, se centran en el uso efectivo y eficiente del procesador.
Otra forma de clasificación es considerar los criterios relativos al rendimiento del sistema y los que no lo son. Los criterios
relativos al rendimiento son cuantitativos y, en general, pueden evaluarse fácilmente. Algunos ejemplos son el tiempo de
respuesta y la productividad. Los criterios no relativos al rendimiento son, en cambio, cuantitativos y no pueden ser
evaluados o analizados fácilmente. Un ejemplo de estos criterios es la previsibilidad.
Criterios orientados al usuario, criterios de rendimiento
Tiempo de retorno: Es el intervalo de tiempo transcurrido entre el lanzamiento de un proceso y su finalización.
Tiempo de respuesta: Para un proceso interactivo, es el intervalo de tiempo transcurrido desde que se emite una solicitud
hasta que comienza a recibir la respuesta.
Plazos: Cuando se pueden especificar plazos de terminación de un proceso, la disciplina de planificación debe subordinar
otras metas a la maximización del porcentaje de plazos cumplidos.
Criterios orientados al usuario, otros criterios
Previsibilidad: Un determinado trabajo se debe ejecutar aproximadamente en el mismo tiempo y con el mismo coste sin
importar la carga del sistema.
Criterios orientados al sistema, criterios relativos al rendimiento
Productividad: la política de planificación debe intentar maximizar el número de procesos terminados por unidad de tiempo.
Utilización del procesador: Es el porcentaje de tiempo en el que el procesador está ocupado.
Criterios orientados al sistema, otros criterios
Equidad: En ausencia de directrices de usuario o de otras directrices ofrecidas por el sistema, los procesos deben ser
tratados de igual forma y ningún proceso debe sufrir inanición.
Prioridades: Cuando se asignan prioridades a los procesos, la política de planificación debe favorecer a los procesos de
mayor prioridad.
Equilibrio de recursos: La política de planificación debe mantener ocupados los recursos del sistema.
Uso de prioridades
En muchos sistemas, cada proceso tiene una prioridad asignada y el planificador seleccionará siempre a un proceso de
mayor prioridad antes que a los de menor prioridad.
Un problema de los esquemas puros de planificación por prioridades es que los procesos de prioridad más baja pueden
sufrir inanición. Este problema ocurre si siempre hay un flujo continuo de procesos listos de alta prioridad. Para superar este
problema, la prioridad de un proceso puede cambiar en función de su edad o su historial de ejecución.
Primero en llegar, primero en servirse
Cada vez que un proceso esté listo para ejecutarse, se incorpora a la cola de listos. Cuando un proceso actual cesa su
ejecución, se selecciona el proceso más antiguo de la cola.
FCFS (first come first serve) rinde mucho mejor con procesos largos que con procesos cortos.
Turno Rotatorio
Un modo sencillo de reducir la penalización que sufren los trabajos cortos con FCFS es considerar la apropiación
dependiente de un reloj. La más simple de estas políticas se denomina planificación por turno rotatorio (RR, Round Robin).
Periódicamente, se genera una interrupción de reloj. Cuando se genera la interrupción, el proceso que está ejecutando se
sitúa en la cola de Listos y se selecciona el siguiente trabajo, según FCFS.
Con la política del turno rotatorio, la cuestión principal del diseño es la longitud del cuanto de tiempo o fracción que se va a
usar. Si el cuanto es muy pequeño, los procesos cortos pasan por el sistema rápidamente. Por otro lado, se produce una
sobrecarga en la gestión de las interrupciones de reloj y en la ejecución de las funciones de planificación y expedición.
Una desventaja del turno rotatorio es el tratamiento que hace de los procesos con carga de procesador y con carga de E/S.
Generalmente, un proceso con carga de E/S tiene ráfagas de procesador más cortas que un proceso con carga de
procesador. Si hay una mezcla de procesos con carga de procesador y con carga de E/S, ocurrirá lo siguiente: un proceso
con carga de E/S utiliza el procesador durante un período corto y después se bloquea en la E/S; Espera a que se complete
la operación de E/S y entonces vuelve a la cola de Listos. Por otro lado, un proceso con carga de procesador generalmente
hace uso de un cuanto de tiempo completo cuando se ejecuta e inmediatamente retorna a la cola de Listos. Así pues, los
procesos con carga de procesador tienden a recibir una porción desigual de tiempo de procesador, lo que origina un
27
rendimiento pobre de los procesos con carga de E/S, un mal aprovechamiento de los dispositivos de E/S y un incremento de
la variabilidad del tiempo de respuesta.
Se propone una modificación del turno rotatorio que se denomina turno rotatorio virtual (VRR, Virtual Round Robin) y que
evita esta desigualdad. La nueva característica consiste en una cola FCFS auxiliar a la que se desplazan los procesos una
vez que son liberados de la espera por E/S. Al tomar una decisión sobre el siguiente proceso a expedir, los procesos de la
cola auxiliar tienen preferencia sobre los de la cola principal de Listos. Cuando se expide un proceso desde la cola auxiliar,
no se puede ejecutar más que un tiempo igual al cuanto básico menos el tiempo total de ejecución consumido desde que
fue seleccionado por última vez en la cola de listos.
Primero el proceso más corto
La política de primero el proceso más corto (SPN, Short Process Next) se selecciona el proceso con menor tiempo
esperado de ejecución.
Una dificultad que plantea la política SPN es la necesidad de conocer o, por o menos, estimar el tiempo exigido por cada
proceso.
Un riesgo que existe en SPN es la posibilidad de inanición para los procesos largos mientras exista un flujo continuo de
procesos cortos.
Menor tiempo restante
La política del menor tiempo restante (SRT, Short Remaining Time) es una versión preferente del SPN, en la que el
planificador siempre elije al proceso que le queda menos tiempo esperado de ejecución. Cuando se añade un nuevo
proceso a la cola de Listos, puede quedarle un tiempo esperado de ejecución menor que al proceso que está ejecutándose
en ese momento. Por consiguiente, el planificador puede apropiarse del procesador siempre que un proceso nuevo esté
listo.
Primero el de mayor tasa de respuesta
Se ha empleado el tiempo de retorno normalizado, que es la razón entre el tiempo de retorno y el tiempo de servicio, como
el valor a destacar. Para cada proceso individual, se desea minimizar esta razón, así como minimizar el valor medio de
todos los procesos.
R = (w + s) / s
R: Tasa de respuesta
w: Tiempo consumido esperando al procesador
s: Tiempo de servicio esperado
Si el proceso con este valor se expide inmediatamente, R es igual al tiempo de retorno normalizado. Nótese que el valor
mínimo es 1 alcanzando cuando un proceso entra por primera vez en el sistema.
Hasta ahora, la regla de planificación ha sido cuando el proceso actual termina o se bloquea, se elige el proceso listo con un
valor mayor a R.
Realimentación
Si no se dispone de ninguna información sobre la longitud relativa de los diversos procesos, no se puede emplear ninguno
de los algoritmos anteriores (SPN, SRT). Otra forma de dar preferencia a los trabajos más cortos consiste en penalizar a los
trabajos que han estado ejecutándose durante más tiempo. Dicho de otro modo, si no es posible utilizar como base el
tiempo de ejecución restante, se empleará el tiempo de ejecución consumido hasta el momento.
Cuando un proceso entra por primera vez en el sistema, se sitúa en RQ0. Cuando vuelve al estado de Listo, después de su
primera ejecución, se incorpora a RQ1. Después de cada ejecución siguiente, se le degradará al nivel inmediatamente
inferior de prioridad.
Un problema que representa el sencillo esquema anterior es que el tiempo de retorno de los procesos mayores puede
alargarse de forma alarmante. En realidad, puede ocurrir inanición si llegan regularmente nuevos trabajos al sistema. Para
compensar, se puede variar el tiempo de apropiación en función de la cola: a un proceso planificado para RQ0 dispone de 1
unidad de tiempo de ejecución hasta ser expulsado; a un proceso planificado para RQ1 se le permite ejecutar durante 2
unidades de tiempo y así sucesivamente.
Capítulo 10
Planificación de multiprocesadores y en tiempo real
10.1. Planificación de multiprocesadores
Los sistemas de multiprocesador pueden clasificarse de la siguiente manera:
 Agrupación o multiprocesador débilmente acoplado o distribuido: Consta de un conjunto de sistemas relativamente
autónomos, donde cada procesador tiene su propia memoria principal y sus propios canales de E/S.
 Procesadores especializados funcionalmente: Un buen ejemplo son los procesadores de E/S. Los procesadores
especializados están controlados por el procesador principal y le ofrecen servicios.
 Multiprocesador fuertemente acoplado: Consta de un conjunto de procesadores que comparten una memoria
principal común y se encuentran bajo el control integrado de un sistema operativo.
Granularidad
Una buena forma de caracterizar los multiprocesadores y situarlos en el contexto de otras arquitecturas es considerar la
granularidad de la sincronización o frecuencia de sincronización entre los procesos de un sistema. Es posible distinguir 5
categorías de paralelismo que definen el grado de granularidad:
 Paralelismo independiente: Con paralelismo independiente, no existe sincronización explícita entre procesos. Cada
uno representa una aplicación o trabajo separado e independiente. Un uso clásico de este tipo de paralelismo se da
28
en sistemas de tiempo compartido. Cada usuario está ejecutando una aplicación en particular, como un procesador
de textos o una hoja de cálculo.
 Paralelismo de grano grueso y muy grueso: Con el paralelismo de grano grueso y muy grueso, existe una
sincronización entre los procesos pero es muy burda. Este tipo de situación se maneja fácilmente con un conjunto
de procesos concurrentes ejecutándose en un monoprocesador multiprogramado y puede verse respaldado por un
multiprocesador con escasos cambios o incluso ninguno en el software del usuario.
 Paralelismo de grano medio: El programador especifica explícitamente el posible paralelismo de la aplicación.
 Paralelismo de grano fino: El paralelismo de grano fino significa el uso del paralelismo mucho más complejo que el
que se consigue con el uso de hilos.
Elementos de diseño
En la planificación de un multiprocesador se deben considerar tres puntos interrelacionados:
 La asignación de procesos a los procesadores.
 El uso de multiprogramación en los procesadores individuales.
 La expedición real de los procesos.
Asignación de procesos a los procesadores
Si se asigna un proceso a un procesador de forma permanente, desde su activación hasta su terminación, entonces debe
mantenerse una cola a corto plazo dedicada para cada procesador. Una ventaja de este método es que puede existir una
sobrecarga menor en la función de planificación porque la asignación al procesador se realiza una sola vez y para siempre.
Además, el uso de procesadores dedicados permite una estrategia conocida como planificación por grupos o pandillas, que
se trata más adelante.
Una desventaja de la asignación estática es que un procesador puede estar desocupado, con su cola vacía, mientras que
otro procesador tiene trabajos pendientes. Para prevenir esta situación, se puede usar una cola común. Todos los procesos
van a una cola global y son ejecutados en cualquier procesador que esté disponible. De este modo, durante la vida de un
proceso, éste se puede ejecutar en diferentes procesadores en momentos diferentes.
Sin reparar en si los procesos están dedicados a los procesadores, hace falta una forma de asignar los procesos a los
procesadores. Se pueden utilizar dos métodos: arquitectura maestro/esclavo y arquitecturas simétricas. En la arquitectura
maestro/esclavo, las funciones clave del núcleo del sistema operativo siempre ejecutan en un determinado procesador. Los
otros procesadores pueden ejecutar sólo programas de usuario. El maestro es el responsable de la planificación de
trabajos. Una vez que un proceso está activo, si el esclavo necesita un servicio, debe enviar una solicitud al maestro y
esperar a que el servicio se lleve a cabo. Esta solución es bastante simple y exige pequeñas mejoras sobre el sistema
operativo multiprogramado del monoprocesador. La resolución de conflictos se simplifica, puesto que un procesador tiene
control de toda la memoria y todos los recursos de E/S. Las desventajas de esta solución son 2:
1. Un fallo en el maestro hace caer todo el sistema.
2. El maestro puede llegar a ser un cuello de botella del rendimiento.
En una arquitectura simétrica, el sistema operativo pude ejecutar en cualquier procesador y cada procesador autoplanifica
con el conjunto de procesadores disponibles. Esta solución complica el sistema operativo ya que debe asegurarse que dos
procesadores no seleccionen el mismo proceso y que los procesos no se pierdan en el camino desde la cola. Se deben usar
técnicas para resolver y sincronizar las solicitudes concurrentes de recursos.
Uso de la multiprogramación
Cuando cada proceso se asigna estáticamente a un procesador durante todo su ciclo de vida, surge una nueva cuestión.
En los multiprocesadores tradicionales, que tratan con sincronización de grano grueso o independiente, está claro que cada
procesador individual debería ser capaz de alternar entre varios procesos para conseguir una alta utilización y, por lo tanto,
un mejor rendimiento. Sin embargo, cuando se trabaja con aplicaciones de grano medio ejecutando en muchos
procesadores, la situación es menos clara. Cuando hay varios procesadores disponibles, no resulta tan importante que cada
procesador está ocupado al máximo. En su lugar, se debe tratar de obtener el mejor rendimiento, en promedio, para las
aplicaciones.
Expedición de un proceso
Se ha visto que un sistema monoprocesador multiprogramado, el uso de prioridades o algoritmos de planificación
sofisticados basados en la utilización anterior pueden mejorar el rendimiento sobre la simple estrategia FIFO. Cuando
hablamos de multiprocesadores, estas complejidades pueden ser innecesarias o incluso contraproducentes y una estrategia
sencilla puede ser más efectiva con una sobrecarga menor.
Planificación de procesos
En la mayoría de los sistemas multiprocesador tradicionales, los procesos no se asignan a los procesadores de forma
dedicada. En su lugar, hay una cola única para todos los procesadores o, si se utiliza algún tipo de esquema de prioridades,
existirán varias colas, según la prioridad, alimentando todas a una reserva común de procesadores
Planificación de hilos
Como se ha visto, con los hilos el concepto de ejecución se separa del resto de la definición de un proceso. Una aplicación
puede implementarse como un conjunto de hilos que cooperan y ejecutan concurrentemente en el mismo espacio de
direcciones.
Puesto que la penalización por el intercambio de hilos es mínima, comparada con el intercambio de procesos, estos
beneficios se llevan a cabo a bajo coste. Sin embargo, toda la potencia de los hilos se hace más evidente en un sistema
multiprocesador. En este entorno los hilos pueden emplearse para obtener paralelismo real en las aplicaciones. Si los
diversos hilos de una aplicación se ejecutan simultáneamente en distintos procesadores, se posibilita un aumento drástico
del rendimiento.
Entre las diversas propuestas de planificación de hilos para multiprocesadores y de asignación de procesadores, destacan
los siguientes cuatro métodos:
29

Reparto de carga: Se mantiene una cola global de hilos listos y cada procesador, cuando está ocioso, seleccionara
un hilo de la cola.
 Planificación por grupos: Se planifica un conjunto de hilos afines para su ejecución en un conjunto de procesadores
al mismo tiempo, según una relación de uno a uno.
 Asignación dedicada de procesadores: Es el enfoque opuesto al reparto de carga y ofrece una planificación
implícita definida por la asignación de hilos a los procesadores.
 Planificación dinámica: El número de hilos en un programa se puede cambiar en el curso de la ejecución.
Reparto de carga
Tiene las siguientes ventajas:
 La carga se distribuye uniformemente entre los procesadores, asegurando que ningún procesador está ocioso
mientras haya trabajo disponible.
 No es necesario un planificador centralizado. Cuando un procesador está libre, la rutina de planificación del sistema
operativo se ejecuta en este procesador para seleccionar un nuevo hilo.
Algunas desventajas del reparto de carga son:
 La cola central ocupa una región de memoria a la que se debe acceder con exclusión mutua. Así pues, si muchos
procesadores buscan trabajo al mismo tiempo, puede convertirse en un cuello de botella.
 Es improbable que los hilos expulsados reanuden su ejecución en el mismo procesador. Si cada procesador
dispone de una cache local, el uso de la cache será menos eficiente.
 Si todos los hilos son tratados como una reserva común de hilos, es improbable que todos los hilos de un programa
consigan acceder a los procesadores al mismo tiempo.
Planificación por grupos
Tiene las siguientes ventajas:
 Si procesos relativamente próximos se ejecutan en paralelo, pueden reducirse los bloqueos por sincronización, se
pueden necesitar menos intercambios de procesos y se incrementará el rendimiento.
 La sobrecarga de planificación puede reducirse debido a que una sola decisión afecta a varios procesadores y
procesos al mismo tiempo.
Una razón obvia por la que la planificación por grupos mejora el rendimiento de una sola aplicación es que se minimizan los
intercambios de procesos.
Asignación dedicada de procesadores
Una forma extrema de planificación por grupos, consiste en dedicar un grupo de procesadores a una aplicación mientras
dura la aplicación. Es decir, cuando se planifica una aplicación, se asigna cada uno de sus hilos a un procesador que
permanece dedicado a ese hilo hasta que la aplicación termine su ejecución.
Este método podría parecer demasiado dispendioso en tiempo de procesador. Si un hilo de una aplicación se bloquea en
espera de una E/S o por sincronización con otro hilo, el procesador de dicho hilo quedará desocupado: No hay
multiprogramación de procesadores. Se pueden plantear dos observaciones en defensa de esta estrategia:
1. En un sistema masivamente paralelo, con decenas o cientos de procesadores, cada uno de los cuales representa
una pequeña parte del coste del sistema, la utilización del procesador no es tan importante como medida de la
efectividad o el rendimiento.
2. La anulación total del intercambio de procesos durante el tiempo de vida de un programa dará como resultado una
aceleración sustancial del programa.
Cuanto mayor es el número de hilos, peor es el rendimiento obtenido, debido a que aumenta la frecuencia de expulsión de
hilos y de replanificación.
Planificación dinámica
En algunas aplicaciones, es posible emplear un lenguaje y unas herramientas del sistema que permitan cambiar
dinámicamente el número de hilos de un proceso. Esto permite al sistema operativo ajustar la carga y mejorar así la
utilización.
El sistema operativo es responsable de repartir los procesadores entre los trabajos. Cada trabajo emplea los procesadores
de su partición para procesar un subconjunto de sus tareas ejecutables, organizando estas tareas en hilos. A las
aplicaciones individuales se les deja la decisión sobre el subconjunto a ejecutar, además de a qué hilo suspender cuando se
expulsa un proceso. Este método puede no resultar conveniente para todas las aplicaciones. Sin embargo, algunas
aplicaciones podrían limitarse a un único hilo, mientras que otras podrían ser programadas para sacar partido de estas
características del sistema operativo.
Con este método, la responsabilidad de la planificación del sistema operativo se limita fundamentalmente a la asignación del
procesador y actúa según la siguiente política: cuando un trabajo solicita uno o más procesadores:
1. Si hay procesadores desocupados se basan en satisfacer la petición
2. En otro caso, si el trabajo que realiza la petición está recién llegado, se le asigna un procesador individual
quitándoselo a algún proceso que tenga más de un procesador asignado.
3. Si no se puede satisfacer alguna parte de la petición, queda pendiente hasta que un procesador pase a estar
disponible o hasta que el trabajo anule la petición.
Al liberar uno o más procesadores:
4. Explorar la cola de peticiones de procesador no satisfechas. Asignar un solo procesador a cada trabajo de la lista
que no tiene aún procesador. Después, recorrer la lista de nuevo, asignando el resto de procesadores según FCFS.
30
Capítulo 7
Gestión de Memoria
En un sistema monoprogramado, la memoria principal se divide en dos partes: una para el sistema operativo (monitor
residente, núcleo) y otra para el programa que se ejecuta en ese instante. En un sistema multiprogramado, la parte de
usuario de la memoria debe subdividirse aún más para hacer sitio a varios procesos. La tarea de subdivisión la lleva a cabo
dinámicamente el sistema operativo y se conoce como gestión de memoria.
7.1. Requisitos de la gestión de memoria
Son 5 los requisitos que se proponen:
 Reubicación
 Protección
 Compartición
 Organización Lógica
 Organización Física
Reubicación
Se busca poder cargar y descargar los procesos activos en la memoria principal para maximizar el uso del procesador,
manteniendo una gran reserva de procesos listos para ejecutarse.
Protección
Cada proceso debe protegerse contra interferencias no deseadas de otros procesos, tanto accidentales como
intencionadas. Así pues, el código de un proceso no puede hacer referencia a posiciones de memoria de otros procesos,
con fines de lectura o escritura, sin permiso.
Nótese que es el procesador y no el sistema operativo el que debe satisfacer las exigencias de protección de memoria. Esto
es debido a que el sistema operativo no puede anticiparse a todas las referencias a la memoria que hará un programa.
Compartimiento
Cualquier mecanismo de protección que se impone debe tener flexibilidad de permitir el acceso de varios procesos a la
misma zona de memoria principal. Por ejemplo, si una serie de procesos están ejecutando el mismo programa, resultaría
beneficioso permitir a cada proceso que acceda a la misma copia del programa, en lugar de tener cada uno una copia
aparte.
Organización lógica
De esta forma casi invariable, la memoria principal de un sistema informático se organiza como un espacio de direcciones
lineal o unidimensional que consta de una secuencia de bytes o palabras. La memoria secundaria, físicamente, se organiza
de forma similar.
Organización física
La memoria del computador se organiza en al menos dos niveles: memoria principal y memoria secundaria. La memoria
principal ofrece un acceso rápido con un coste relativamente alto. Además, la memoria principal es volátil, es decir, no
proporciona almacenamiento permanente. La memoria secundaria es más lenta y mas barata que la memoria principal y,
normalmente, no es volátil. De este modo una memoria secundaria de gran capacidad puede permitir un almacenamiento a
largo plazo de programas y datos, al tiempo que una memoria principal pequeña mantiene los programas y datos de uso
actual.
7.2. Partición de la memoria
La tarea principal del sistema de gestión de memoria es cargar los programas en la memoria principal para su ejecución en
el procesador. En caso todos los sistemas multiprogramados modernos, esta tarea requiere un sofisticado esquema llamado
memoria virtual. La memoria virtual está a su vez, basada en el uso de dos técnicas básicas: Segmentación y paginación.
Particiones estáticas
En la mayoría de los esquemas de gestión de memoria, se puede suponer que el sistema operativo ocupa una parte fija de
la memoria principal y que el resto de la memoria está disponible para ser usado por varios procesos. El esquema más
sencillo de gestión de la memoria disponible es dividir en regiones con límites fijos.
Tamaños de partición
Una posibilidad es emplear particiones de igual tamaño.
Las particiones estáticas de igual tamaño plantean 2 dificultades:
 Un programa puede ser demasiado grande para caber en la partición.
 El uso de la memoria principal es extremadamente ineficiente. Cualquier programa, sin importar lo pequeño que
sea, ocupará una partición completa. Este fenómeno, en el que se malgasta el espacio interno de una partición
cuando el bloque de datos es cargado es más pequeño que la partición, se denomina fragmentación interna.
Pueden reducirse aunque no solventarse, ambos problemas por medio del empleo de distintos tamaños.
Algoritmo de ubicación
Con particiones del mismo tamaño. Mientras haya alguna partición libre, puede cargarse un proceso en esa partición. Si
todas las particiones están ocupadas con procesos que no están listos para ejecutarse, uno de esos procesos debe sacarse
para hacer sitio a un nuevo proceso.
Con particiones de distintos tamaños, hay 2 maneras de hacer posibles de asignar los procesos a las particiones. La forma
más simple es asignar cada proceso a la partición más pequeña en la que quepa. La ventaja de este enfoque es que se
minimiza la fragmentación interna. Sin embargo, aunque esta técnica parece óptima desde el punto de vista de la partición
individual, no lo es desde el punto de vista del sistema global.
31
El uso de particiones de distinto tamaño proporciona cierto grado de flexibilidad a las particiones estáticas. Además, ambos
tipos de esquemas de partición estática son relativamente simples y exigen un software del sistema operativo y una
sobrecarga de procesamiento mínimos. Sin embrago, se plantean las siguientes desventajas:
 El número de particiones fijas especificadas en el momento de la generación del sistema limita el número de
procesos activos (no suspendidos) en el sistema.
 Puesto que los tamaños de partición se programan en el momento de la generación del sistema, los trabajos
pequeños no hacen un uno eficiente del espacio de particiones.
Particiones dinámicas
Para superar algunas de las dificultades del particionamiento estático, se desarrollo una solución denominada partición
dinámica.
Con la partición dinámica, las particiones son variables en número y longitud. Cuando se carga un proceso en memoria
principal, se le asigna exactamente tanta memoria como necesita y no más. Al particionar de esta manera ocurre la
fragmentación externa y se refiere al hecho de que la memoria externa a todas las particiones se fragmenta cada vez más,
quedando huecos entre las asignaciones.
Una técnica para vencer la fragmentación externa es la compactación: de vez en cuando el sistema operativo desplaza los
procesos para que estén contiguos, de esta forma que toda la memoria liberada quede junta en un bloque.
Algoritmo de ubicación
Puesto que la compactación de memoria consume tiempo, el diseñador del sistema operativo tiene que decidir
adecuadamente como asignar un proceso a memoria (como llenar los huecos). Cuando llega el momento de cargar o traer
un proceso a memoria, y si hay libre más de un bloque de memoria de tamaño suficiente, el sistema operativo debe decidir
cual asignar.
Los tres algoritmos de ubicación que se pueden considerar son el de mejor ajuste (best-fit), el de primer ajunte (first-fit) y el
del siguiente ajuste (next-fit). El mejor ajuste elije el bloque de tamaño más próximo al solicitado. El primer ajuste comienza
recorriendo la memoria desde el principio y escoge el primer bloque disponible que sea suficientemente grande. El siguiente
ajuste recorre la memoria desde el lugar de la última ubicación y elige el siguiente bloque que disponible que sea
suficientemente grande.
7.3. Paginación
Tanto las particiones de tamaño fijo como las de tamaño variable hacen un uso ineficiente de la memoria; las primeras
generan fragmentación interna, mientras que las segundas originan fragmentación externa. Supóngase, no obstante, que la
memoria principal se encuentra dividida en trozos iguales de tamaño fijo relativamente pequeños y que cada proceso está
dividido también en pequeños trozos de tamaño fijo y del mismo tamaño que los de memoria. En tal caso, los trozos del
proceso, llamados páginas, pueden asignarse a los trozos libres de memoria, llamados marcos de páginas.
El sistema operativo mantiene una lista de los marcos libres. Para aplicar este esquema de paginación, el tamaño de página
y, por lo tanto, el tamaño del marco, debe ser potencia de 2.
Dos son las consecuencias de usar tamaño de páginas con potencia de 2. Primero el esquema de dirección lógica
transparente al programador, al ensamblador y el montador. Cada dirección lógica de un programa (número de página y
desplazamiento) es idéntica a su dirección relativa. Segundo, resulta relativamente sencillo realizar una función de hardware
para llevar a cabo la traducción de direcciones dinámicas durante la ejecución.
7.4. Segmentación
Otro modo de subdividir el programa es la segmentación. En este caso, el programa y sus datos asociados se dividen en un
conjunto de segmentos. No es necesario que todos los segmentos de todos los programas tengan la misma longitud,
aunque existe una longitud máxima de segmento. Como en la paginación, una dirección lógica segmentada consta de 2
partes, en este caso un número de segmento y un desplazamiento.
Como consecuencia del empleo de segmentación de distintos tamaño, la segmentación resulta similar a la partición
dinámica.
La diferencia en comparación con la partición dinámica, radica en que, con la segmentación, un programa puede ocupar
más de una partición y éstas no tienen porque estar contiguas. La segmentación elimina la fragmentación interna pero,
como la partición dinámica, sufre de fragmentación externa. Sin embargo, debido a que los procesos se dividen en un
conjunto de partes más pequeñas la fragmentación externa será menor.
Mientras que la paginación es transparente al programador, la segmentación es generalmente visible y se ofrece como
ventaja para la organización de los programas y datos.
Otra consecuencia del tamaño desigual de los segmentos es que no hay una correspondencia simple entre las direcciones
lógicas y las direcciones físicas.
Capítulo 8
Memoria Virtual
8.1. Estructuras de hardware y de control
Son dos las características de la paginación y la segmentación:
1. Todas las referencias a la memoria dentro de un proceso son direcciones lógicas que se traducirán dinámicamente
a direcciones físicas durante la ejecución.
32
2. Un proceso puede dividirse en varias partes (páginas o segmentos) y no es necesario que estas partes se
encuentren contiguas en la memoria principal durante la ejecución.,
Si estas dos características están presentes, no será necesario que todas las páginas o todos los segmentos de un proceso
estén en la memoria durante la ejecución.
Se empleará el término fragmento para referirse tanto a páginas como a segmentos, dependiendo de si emplea paginación
o segmentación.
Se llamará conjunto residente del proceso a la parte de un proceso que está realmente en la memoria principal.
Si el procesador encuentra una dirección lógica que no está en la memoria principal, genera una interrupción que indica un
fallo de acceso a la memoria. El sistema operativo pone el proceso interrumpido en estado bloqueado y toma el control.
Para que la ejecución de este proceso siga más tarde, el sistema operativo necesita traer a la memoria principal el
fragmento del proceso que contiene la dirección lógica que provocó el fallo de acceso. Para ello, el sistema operativo emite
una solicitud de Lectura de E/S, el sistema operativo puede expedir otro proceso para que se ejecute mientras que se
realiza la operación de E/S. Una vez que el fragmento deseado se ha traído a la memoria principal y se ha emitido la
interrupción de E/S, se devuelve el control del sistema operativo, que coloca el proceso afectado en el estado de Listo.
Como los procesos se ejecutan sólo en memoria principal, a esta memoria se le llama memoria real. Pero un programador o
usuario percibe en potencia una memoria mucho mayor, que está situada en el disco. Esta última se conoce como memoria
virtual. La memoria virtual permite una multiprogramación muy efectiva y releva al usuario de las rígidas e innecesarias
restricciones de memoria principal
Memoria virtual y cercanía de referencias
Demasiados intercambios de fragmentos conducen a lo que se conoce como hiperpaginación (trashing): El procesador
consume mas tiempo intercambiando fragmentos que ejecutando instrucciones de usuario. Las formas de evitar la
hiperpaginación fueron una de las tareas de investigación más importantes de los 70 y llevaron a un buen número de
algoritmos complejos pero efectivos.
Los argumentos anteriores se basan en el principio de cercanía, que afirma que las referencias a los datos y al programa
dentro de un proceso tienden a agruparse. Por lo tanto, es valida la suposición de que durante cortos periodos de tiempo, se
necesitarán sólo unos pocos fragmentos de proceso. Además, sería posible hacer predicciones inteligentes sobre qué
fragmentos de un proceso se necesitarán en un futuro cercano y así evitar la hiperpaginación.
Paginación
El termino memoria virtual se asocia normalmente con sistemas que emplean paginación, aunque también se puede usar
memoria virtual basada en la segmentación.
Cada entrada de la tabla de páginas contiene el número de marcos de la página correspondiente en la memoria principal.
Cuando se considera un esquema de memoria virtual basado en la paginación se necesita la misma estructura, una tabla de
páginas. Nuevamente, es normal asociar una única tabla de páginas con cada proceso. Las entradas de la tabla de páginas
pasan a ser más complejas. Puesto que sólo algunas de las páginas de un proceso pueden estar en la memoria principal,
se necesita un bit en cada entrada de la tabla para indicar si la página correspondiente está presente (P) en la memoria
principal o no lo está. Si el bit indica que la página está en la memoria, la entrada incluye también el número de marco para
esta página.
Otro bit de control es necesario en la entrada de la tabla de páginas es el bit de modificación (M) para indicar si el contenido
de la página correspondiente se ha alterado desde que la página se cargó en la memoria principal. Si no ha habido
cambios, no es necesario escribir la página cuando sea sustituida en el marco que ocupa actualmente.
Estructura de la tabla de páginas
Buffer de traducción adelantada
Cada referencia a la memoria virtual puede generara dos accesos a la memoria: uno para obtener la entrada de la tabla de
páginas correspondiente y otro para obtener el dato deseado. Un esquema sencillo de memoria virtual podría tener el efecto
de doblar el tiempo de acceso a la memoria. Para solucionar este problema, la mayoría de los esquemas de memoria virtual
hacen uso de una cache especial para las entradas de la tabla de páginas, llamadas generalmente buffer de traducción
adelantada (TLB Traslation Lookside Buffer). Esta cache funciona del mismo modo que una memoria cache y contiene
aquellas entradas de la tabla de páginas usadas hace menos tiempo. Dada una dirección virtual, el procesador examinará
primero la TLB. Si la entrada de la tabla de páginas buscada está presente (un acierto en la TLB), se obtiene el número de
marco y se obtiene la dirección real. Si no se encuentra la entrada de la tabla de páginas buscada (un fallo en la TLB), el
procesador emplea el número de página como índice para buscar en la tabla de páginas del proceso y examinar la entrada
correspondiente de la tabla de páginas. Si se encuentra activo el bit de presencia, es que la página está en la memoria
principal y el procesador puede obtener el número de marco de la entrada de la tabla de páginas para formar la dirección
real. El procesador, además, actualiza la TLB para incluir esta nueva entrada de la tabla de páginas. Por último, si el bit de
presencia no está activo, es que la página basada no está en la memoria principal y se produce un fallo en el acceso a la
memoria, llamado fallo de página. En este punto, se abandona el ámbito del hardware y se invoca al sistema operativo, que
carga la página necesaria y actualiza la tabla de páginas.
Tamaño de página
Hay varios factores que considerar. Uno es la fragmentación interna. Sin duda, cuando menor sea el tamaño de página
menor será la cantidad de fragmentación interna. Cuando menor sea la página, mayor será el número de páginas que se
necesitan por proceso. Un número mayor de páginas por proceso significa que las tablas de páginas serán mayores.
Para complicar la cuestión se puede considerar el efecto que tiene el tamaño en el porcentaje de fallos de páginas. Si el
tamaño de páginas es muy pequeño, normalmente estarán disponibles en la memoria principal un gran número de páginas
para cada proceso. Después de un tiempo, todas las páginas de la memoria contendrán parte de las referencias más
recientes del proceso. Debido a ello, la tasa de fallos de página será menor. Cuando se incrementa el tamaño de página
33
cada parte individual contendrá posiciones cada vez más distantes de cualquier referencia reciente. Así pues, se atenúa el
efecto del principio de cercanía y comienza a aumentar la tasa de fallos de páginas.
Por último, el diseño del tamaño de página está relacionado con el tamaño de la memoria física principal. Al mismo tiempo
que la memoria principal se hace mayor, el espacio de direcciones que emplean las aplicaciones también crece.
Segmentación
Implicaciones de la memoria virtual
Los segmentos pueden ser distintos tamaños, incluso de forma dinámica. Las referencias a la memoria constan de una
dirección de la forma (número de segmento, desplazamiento).
Esta organización ofrece al programador varias ventajas sobre un espacio de direcciones no segmentado:
1. Con memoria virtual segmentada, a la estructura de datos se le puede asignar a su propio segmento y el sistema
operativo expandirá o reducirá el segmento cuando se necesite
2. Permite modificar y recopilar los programas independientemente, sin que sea necesario recopilar o volver a montar
el conjunto de programas por completo.
3. Se presenta a la compartición entre procesos. Un programador puede situar un programa de utilidades o una tabla
de datos en un segmento que puede ser referenciado por otros procesos.
4. Se presenta a la protección. Puesto que un segmento puede ser construido para albergar un conjunto de
procedimientos y datos bien definidos, el programador o el administrador del sistema podrá asignar los permisos de
acceso de la forma adecuada.
Organización
Cada entrada de la tabla de segmentos contiene la dirección de comienzo del segmento correspondiente de la memoria
principal, así como su longitud. La misma estructura – una tabla de segmentos – se necesitará al hablar de un esquema de
memoria virtual basado en la segmentación. Nuevamente, es normal asociar una única tabla de segmentos a cada proceso.
En este caso, sin embargo, las entradas de la tabla de segmentos pasan a ser más complejas. Puesto que sólo algunos de
los segmentos de un proceso estarán en la memoria principal, se necesita un bit en cada entrada de la tabla de segmentos
para indicar si el segmento correspondiente está presente en la memoria principal.
Otro bit de control necesario en la entrada de la tabla de segmentos es un bit de modificación que indique si el contenido del
segmento correspondiente ha sido modificado desde que se cargó por última vez en la memoria principal. Si no ha habido
cambios, no será necesario escribir en el disco el segmento cuando llegue el momento de reemplazarlo en el espacio que
ocupa actualmente.
Paginación y segmentación combinadas
Tanto la paginación como la segmentación tienen sus ventajas. La paginación, que es transparente al programador, elimina
la fragmentación externa y, de este modo, aprovecha la memoria principal de forma eficiente. Puesto que los fragmentos
que se cargan y descargan de la memoria principal son de tamaño fijo e iguales, es posible construir algoritmos de gestión
de memoria sofisticados que aprovechen mejor el comportamiento de los programas. La segmentación, que es visible para
el programador, tiene las ventajas antes citadas, incluida la capacidad de gestionar estructuras de datos que pueden crecer,
la modularidad, y el soporte de la compartición y la protección.
En un sistema con paginación y segmentación combinadas, el espacio de direcciones de un usuario se divide en varios
segmentos según el criterio del programador. Cada segmento se vuelve a dividir en varias páginas de tamaño fijo, que
tienen la misma longitud que un marco de memoria principal. Si el segmento tiene menor longitud que la página, el
segmento ocupará sólo 1 página.
Asociada con cada proceso existe una tabla de segmentos y varias tablas de páginas, una por cada segmento del proceso.
8.2. Software del sistema operativo
El diseño del sistema operativo depende de tres áreas fundamentales de decisión:
 Si se emplean o no técnicas de memoria virtual
 El uso de la paginación, segmentación o ambas
 Los algoritmos empleados para los diversos problemas de la gestión de memoria.
Las decisiones tomadas en las dos primeras áreas dependen de la plataforma de hardware disponible.
Las decisiones del tercer punto (los algoritmos) son del dominio del software del sistema operativo. Se busca minimizar el
porcentaje de fallos de páginas. Los fallos de página originan una considerable sobrecarga del software.
Política de lectura
La política de lectura está relacionada con la decisión de cuando se debe cargar una página en al memoria principal. Las
dos alternativas más comunes son la paginación por demanda y la paginación previa. Con la paginación por demanda se
trae una página a la memoria principal sólo cuando se hace referencia a una posición en dicha página.
Con la paginación previa, se cargan otras páginas distintas a las demandadas debido a un fallo de página. El principal
atractivo de esta estrategia está en las características de la mayoría de los dispositivos de memoria secundaria.
Si las páginas de un proceso se cargan secuencialmente en la memoria secundaria es más eficiente traer a la memoria un
número de páginas contiguas de una vez que ir trayéndolas de una en una durante un período largo de tiempo.
Políticas de ubicación
La política de ubicación tiene que ver con determinar donde va a residir una parte del proceso en la memoria principal. En
un sistema puro de segmentación, la política de ubicación es un aspecto importante del diseño; como posibles alternativas
se tiene las políticas del mejor ajuste, primer ajuste y otras. Para un sistema que usa tanto paginación pura como
paginación combinada con segmentación, la ubicación carece normalmente de importancia.
Políticas de reemplazo
34
Cuando todos los marcos de memoria principal están ocupados y es necesario traer una nueva página para atender a un
fallo de página, la política de reemplazo se encarga de seleccionar la página a reemplazar de entre las que están
actualmente en la memoria. Todas las políticas tienen como objetivo que la página a reemplazar sea la que tenga una
menor posibilidad de ser referenciada en un futuro cercano. Debido a principios de cercanía, hay una alta correlación entre
la historia de referencias recientes y las pautas de futuras referencias. Así pues, la mayoría de las políticas intentan predecir
el comportamiento futuro en función del comportamiento pasado.
Bloqueo de marcos
Antes de atender a los diversos algoritmos, es necesario mencionar una restricción de la política de reemplazo: algunos de
los marcos de la memoria principal pueden estar bloqueados. Cuando un marco está bloqueado, la página cargada
actualmente en ese marco no puede ser reemplazada. La mayoría del núcleo del sistema operativo, así como las
estructuras clave de control, se albergan en marcos bloqueados. Además, los buffers de E/S y otras áreas críticas en tiempo
pueden bloquearse en marcos de memoria. El bloqueo se consigue asociando un bit de bloqueo a cada marco.
Algoritmos básicos
Entre las políticas de los algoritmos de reemplazo que se han considerado los siguientes:
 Óptima
 Usada menor recientemente (LRU, Last Recently Used)
 Primera en entrar, Primera en salir (FIFO)
 Reloj
Optima
La política óptima seleccionará para reemplazar la página que tiene que esperar mayor cantidad de tiempo hasta que se
produzca una referencia siguiente. Sin duda este algoritmo resulta imposible de implementar, puesto que requiere que el
sistema operativo tenga un conocimiento exacto de los sucesos futuros.
LRU
La política de la usada menos recientemente reemplaza la página de memoria que no ha sido referenciada desde hace
menos tiempo. El problema de este método es su dificultad de implementación. Una solución sería etiquetar cada página al
momento de su última referencia: esto tendría que hacerse con cada referencia a la memoria, tanto en instrucciones como
datos.
FIFO
La política FIFO trata los marcos asignados a un proceso como un buffer circular y las páginas se suprimen a la memoria
según la técnica de turno rotatorio. Todo lo que se necesita es un puntero que circule a través de los marcos del proceso.
Esta es, por lo tanto, una de las políticas de reemplazo más sencillas de implementar.
Reloj
La forma más simple de política del reloj requiere asociar a un bit adiciona a cada marco denominado bit de uso. Cuando se
carga una página por primera vez en un marco de memoria, el bit de uso de dicho marco se pone en 1. Cuando se hace
referencia a la página posteriormente (después de la referencia que generó el fallo de página), el bit de uso se pone en 0.
Cuando llega el momento de reemplazar una página, el sistema operativo recorre el buffer buscando un marco con el bit de
uso a 0. Cada vez que se encuentra un marco con el bit de uso a 1, lo pone a 0. Si algún marco del buffer tiene bit de uso a
0 al comienzo de la búsqueda. Se elige para reemplazar el primero que se haya encontrado. Si todos los marcos tienen bit
de uso puesto a 1, el puntero dará una vuelta completa al buffer, poniendo todos los bits a 0 y se detendrá en la posición
inicial, reemplazando la página de dicho marco.
Almacenamiento intermedio de páginas
El coste de reemplazar una página que ha sido modificada es mayor que el de una que no lo ha sido, porque la primera
debe volver a escribirse en la memoria secundaria.
Una estrategia interesante que puede mejorar el rendimiento de la paginación y permitir el uso de una política de reemplazo
de páginas más sencilla es el almacenamiento intermedio de páginas.
Una estrategia interesante que puede mejorar el rendimiento de la paginación y permitir el uso de una política de reemplazo
de páginas más sencilla es el almacenamiento intermedio de páginas. Para mejorar el rendimiento, no se pierde la pista de
la página reemplazada, sino que se asigna a una de las dos listas siguientes: la lista de páginas libres, si la página no ha
sido modificada o la lista de páginas modificadas, si lo ha sido. La página no se mueve físicamente de la memoria principal;
en su lugar, se suprime su entrada en la tabla de páginas y se pone en la lista de páginas libres o modificadas.
La lista de páginas libres es una lista de marcos disponibles para cargar páginas. Cuando se va a leer una página, se
emplea el marco del principio de la lista, acabando con la página que estaba allí. Cuando se va a reemplazar una página no
modificada, esta permanece en la memoria y su marco se añade al final de la lista de páginas libres. Del mismo modo,
cuando se va a reescribir y reemplazar una página modificada, su marco se añade al final de la lista de páginas
modificadas.
Políticas de reemplazo y tamaño de la cache
En sistemas que emplean alguna norma de almacenamiento intermedio de páginas, es posible mejorar el rendimiento de la
cache sustituyendo la política de reemplazo de páginas por una política de ubicación de páginas en el buffer de páginas. La
mayoría de los sistemas operativos sitúan las páginas seleccionando un marco arbitrario del buffer de páginas;
normalmente, se emplean una disciplina FIFO.
Gestión del conjunto residente
Tamaño del conjunto residente
Con la memoria virtual paginada no es necesario y, de hecho, puede no ser posible traer todas las páginas de un proceso a
la memoria principal para preparar su ejecución. Así pues, el sistema operativo debe decidir cuántas páginas traer, es decir,
cuánta memoria principal asignar a un determinado proceso. Aquí entran en juego varios factores:
35

Cuanto menor es la cantidad de memoria asignada a un proceso, mayor es el número de procesos que pueden
estar en memoria principal en un momento dado. Esto aumenta la probabilidad de que el sistema operativo
encuentre al menos un proceso Listo en un instante dado y, por lo tanto, reduzca el tiempo perdido en el
intercambio.
 Si en la memoria principal hay un número relativamente pequeño de páginas de un proceso, entonces, a pesar del
principio de cercanía, el porcentaje de fallos de página será algo mayor.
 Por encima de un determinado tamaño, la asignación de memoria adicional a un proceso en particular no tendrá
efectos notables en el porcentaje de fallos de página para ese proceso, debido al principio de cercanía.
Con estos factores en mente, en los sistemas operativos actuales se pueden encontrar dos tipos de políticas. La política de
asignación fija otorga a cada proceso un número fijo de páginas en las que ejecutar. Dicho número se decide en el instante
de la carga inicial y puede ser determinado por el tipo de proceso o en función de las directrices del programador o del
administrador del SO.
La política de asignación variable permite que el número de marcos asignados a un proceso cambie a lo largo de su vida.
La política de asignación variable parece ser la más potente. Sin embargo, la dificultar de este método está en que requiere
que el sistema operativo evalúe el comportamiento de los procesos activos. Esto produce inevitablemente la necesidad de
más software en el sistema operativo y es dependiente de los mecanismos de hardware ofrecidos por la plataforma del
procesador.
Alcance de reemplazo
El alcance de una estrategia de reemplazo puede clasificarse en global o local. Un fallo de página, producido cuando no hay
marcos libres, es el activador de ambos tipos de políticas. Para seleccionar la página a reemplazar, una política de
reemplazo local escoge únicamente de entre las páginas residentes del proceso que originó el fallo de página. Una política
de reemplazo global considera todas las páginas de la memoria como candidatas para reemplazar, independientemente del
proceso particular al que pertenezcan. Aunque las políticas locales son más fáciles de analizar, no hay ninguna evidencia de
que se comporten mejor que las políticas globales.
Existe una relación entre el alcance de reemplazo y el tamaño del conjunto residente. Un conjunto residente fijo implica una
política de reemplazo local: para mantener constante el tamaño del conjunto residente, una página suprimida de memoria
principal debe reemplazarse por otra del mismo proceso. Una política de asignación variable puede, sin duda emplear una
política de reemplazo global: el reemplazo de una página de un proceso en la memoria principal por otra provoca que la
asignación de un proceso crezca en una página y la de otro disminuya también en una. También se verá que la asignación
variable y el reemplazo local es una combinación válida.
Reemplazo local
Reemplazo global
Asignación Fija
El número de marcos asignados
No es posible.
a un proceso es fijo.
La página a reemplazar se elige
entre los marcos asignados.
Asignación Variable
El número de marcos asignados
La página a reemplazar
a un proceso puede cambiar de
se elige de entre todos
un momento a otro para
los marcos disponibles en
mantener su conjunto de trabajo.
la memoria principal; esto
La página a reemplazar se elige
hace que cambie el
de entre las páginas asignadas al tamaño del conjunto
proceso.
residente de los
procesos.
Políticas de vaciado
Una política de vaciado es la contraria a una política de lectura; se preocupa de determinar el momento en que hay que
escribir en la memoria secundaria una página modificada. Las dos alternativas más habituales son el vaciado por demanda
y el vaciado previo. Con el vaciado por demanda, una página se escribirá en la memoria secundaria sólo cuando haya sido
elegida para reemplazarse.
Una política de vaciado previo escribe las páginas modificadas antes de que se necesiten sus marcos, de forma que las
páginas puedan escribirse por lotes.
Existe un peligro si se sigue estrictamente cualquiera de las dos políticas. Con el vaciado previo, una página se escribe pero
permanece en la memoria principal hasta que el algoritmo de reemplazo de páginas diga que se suprime.
Una solución mejor es incorporar almacenamiento intermedio de páginas, que permite la adopción de la siguiente política:
vaciar sólo las páginas que es posible reemplazar, pero desconectar las operaciones de vaciado y reemplazo. Con el
almacenamiento intermedio de páginas, las páginas reemplazadas pueden situarse en dos listas: modificadas y no
modificadas.
Control de carga
El control de carga consiste en determinar el número de procesos que pueden estar en la memoria principal, lo que ha
venido en llamarse grado de multiprogramación. La política de control de carga es crítica para la efectividad de la gestión de
memoria. Si, en un instante dado, hay procesos residentes en la memoria habrá muchas ocasiones en las que todos los
procesos estén bloqueados y se gastará mucho tiempo en el intercambio. Por otro lado, si hay demasiados procesos
residentes, el tamaño medio del conjunto residente de cada proceso no será el adecuado y se producirán frecuentes fallos
de página. El resultado es hiperpaginación.
Grado de multiprogramación
36
Cuando el grado de multiprogramación supera un pequeño valor, se podría esperar que la utilización del procesador
aumentara, puesto que hay menos posibilidades de que todos los procesos estén bloqueados.
Suspensión de procesos
Si se va a reducir el grado de multiprogramación, deben suspenderse uno o más procesos actualmente residentes. Las seis
posibilidades son las siguientes:
 Procesos con la prioridad más baja: Esta alternativa toma una decisión de política de planificación y no tiene que
ver con las cuestiones de rendimiento.
 Procesos con fallos de página: El razonamiento es que hay una gran probabilidad de que las tareas que provocan
fallos no tengan residente su conjunto de trabajo y, suspendiéndolas, el rendimiento pierda lo menos posible.
 Último proceso activado: Este es el proceso con menos posibilidades de tener su conjunto de trabajo residente.
 Proceso con el conjunto residente más pequeño: este es el proceso que necesita el menor esfuerzo futuro para
volver a cargar el conjunto residente. Sin embargo, penaliza a los programas con ubicaciones pequeñas.
 El proceso mayor: esta alternativa obtiene mayor cantidad de marcos libres en una memoria muy ocupada,
haciendo poco probables más desactivaciones en breve.
 Procesos con la mayor ventana de ejecución restante: En la mayoría de los esquemas de planificación del
procesador, un proceso puede ejecutarse sólo durante cierto cuanto de tiempo antes de ser interrumpido y puesto al
final de la cola de Listos. Este es un enfoque parecido a la disciplina de planificación de primero el proceso más
corto.
Capítulo 11
Gestión de E/S y planificación de discos
11.1. Dispositivos de Entrada/Salida
Los dispositivos externos que tienen que hacer funcionar la E/S pueden clasificarse en tres categorías:
 Dispositivos legibles por los humanos: Apropiados para la comunicación con el usuario. Por ejemplo se pueden
incluir los terminales de video, que constan de un teclado, una pantalla y, quizás, otros dispositivos como un ratón o
una impresora.
 Dispositivos legibles por la maquina: Adecuados para comunicarse con equipos electrónicos, como discos,
unidades de cinta, sensores, controladores e impulsores.
 Dispositivos de comunicaciones: Apropiados para comunicarse con dispositivos lejanos. Por ejemplo adaptadores
de líneas digitales y módem.
Existen grandes diferencias entre las clases de dispositivos. Las diferencias principales están entre las siguientes:
 Velocidad de los datos.
 Aplicaciones: La utilidad que se le da a un dispositivo tiene una gran influencia en el software y en las políticas del
sistema operativo y de apoyo.
 Complejidad del control
 La lógica del control: La lógica del módulo de E/S que controla el dispositivo filtra, hasta cierto punto, el efecto de
estas diferencias sobre el sistema operativo.
 Unidad de transferencia: Los datos pueden transmitirse como flujos de bytes o caracteres o en bloques mayores.
 Representación de los datos: En diferentes dispositivos se emplean diferentes esquemas de codificación de datos.
 Condiciones de error: La naturaleza de los errores, la manera en que se informa sobre ellos, sus consecuencias y el
rango disponible de respuestas difieren ampliamente de un dispositivo a otro.
11.2. Organización de las funciones de la E/S
Las técnicas para realizar E/S son las siguientes:
 E/S programada: El procesador emite una orden de E/S de parte de un proceso a un módulo de E/S; El proceso
espera entonces a que termine la operación, antes de seguir.
 E/S dirigida por interrupciones: El procesador emite una orden de E/S de parte de un proceso, continúa la ejecución
de las instrucciones siguientes y el módulo de E/S lo interrumpe cuando completa su trabajo. Las instrucciones
siguientes pueden ser del mismo proceso, si no es necesario para éste esperar la terminación de la E/S. En otro
caso, el proceso suspende a la espera de la interrupción, mientras se realiza el otro trabajo.
 Acceso directo a la memoria (DMA): Un módulo de DMA controla el intercambio de datos entre la memoria principal
y un módulo de E/S.
Evolución de las funciones de la E/S
Las etapas de su evolución pueden resumirse como sigue:
1. El procesador controla directamente a los dispositivos periféricos
2. Se añade un controlador o módulo de E/S. El procesador utiliza E/S programada sin interrupciones. En este punto,
el procesador parece aislarse de los detalles específicos de las interfaces con dispositivos externos.
3. Se considera la misma configuración del punto 2, pero utilizando interrupciones. Ahora el procesador no tiene que
desperdiciar tiempo esperando a que se realice una operación de E/S, incrementando así la eficacia.
4. El módulo de E/S recibe el control directo de la memoria, a través de la DMA. Ahora puede mover un bloque de
datos a la memoria o desde la misma sin que intervenga el procesador, excepto al principio y al final de la
transferencia.
37
5. Se mejora el módulo de E/S hasta llegar a ser un procesador separado con un conjunto de instrucciones
especializadas para E/S. El procesador de E/S lee y ejecuta estas instrucciones sin intervención del procesador.
Esto permite al procesador especificar una secuencia de actividades de E/S e interrumpirá sólo cuando haya
terminado la secuencia entera.
6. El módulo de E/S posee su propia memoria local y es, de hecho, un computador independiente. Con esta
arquitectura se puede controlar un gran número de dispositivos de E/S, con una participación mínima del
procesador.
Acceso directo a la memoria
La unidad de DMA es capaz de imitar al procesador y, de hecho, es capaz de tomar el control del sistema desde el
procesador. Necesita hacerlo para transferir datos desde y hacia la memoria a través del bus del sistema. Normalmente, el
módulo de DMA debe usar el bus solamente cuando el procesador no lo necesite, o debe obligar al procesador a que
suspenda temporalmente su operación. Esta última técnica es más común y se denomina robo por ciclos porque la unidad
de DMA debe robar un ciclo del bus.
El procesador continúa entonces con otro trabajo. Ha delegado esta operación de E/S al módulo de DMA. Este transfiere el
bloque de datos completo, una palabra cada vez, directamente o desde memoria, sin pasar por el procesador. Cuando se
ha completado la transferencia, el módulo DMA envía una señal de interrupción al procesador. Así, el procesador solamente
está involucrado al principio y al final de la transferencia.
El mecanismo de DMA puede configurarse de muchas formas. Por ejemplo, puede que los distintos módulos compartan el
mismo bus del sistema.
La lógica de DMA puede formar parte del módulo de E/S, o pude construir un módulo separado que controle un o más
módulos de E/S.
11.3. Aspectos de diseño en los sistemas operativos
Objetivos de diseño
Hay dos objetivos primordiales en el diseño del servicio de E/S: eficiencia y generalidad. La eficiencia es importante porque
las operaciones de E/S constituyen, a menudo, un cuello de botella en los sistemas informáticos. Una manera de abordar
este problema es el uso de la multiprogramación, que, como se ha visto, permite que algunos procesos esperen en
operaciones de E/S mientras otro proceso se está ejecutando.
El segundo gran objetivo es la generalidad. En interés de la simplicidad y la exención de errores será deseable gestionar
todos los dispositivos de una manera uniforme. Esta afirmación se aplica tanto a la manera en que los procesos contemplan
a los dispositivos de E/S como a la forma en que el sistema operativo gestiona los dispositivos de E/S y las operaciones.
Estructura lógica de las funciones de E/S
Cada nivel realiza una parte de su subconjunto de las funciones necesarias del sistema operativo. Cada nivel cuenta con un
nivel inferior para realizar funciones más primitivas y para ocultar los detalles de estas funciones. Asimismo, cada nivel
ofrece servicios al nivel superior. En general, los niveles inferiores hacen frente a un rango de tiempos mucho menor.
Considerando primero el caso más simple, un dispositivo periférico local que se comunica de manera sencilla, como un flujo
de bytes o de registros. Los niveles implicados son los siguientes:
 E/S lógica: El módulo de E/S lógica trata al dispositivo como un recurso lógico y no se preocupa de los detalles de
control real del dispositivo. El módulo de E/S lógica se ocupa de la gestión de funciones generales de E/S
solicitadas por los procesos de usuario, permitiéndoles gestionar el dispositivo mediante un identificador y órdenes
simples como abrir, cerrar, leer y escribir.
 E/S con dispositivos: Las operaciones solicitadas y los datos se convierten en secuencias adecuadas de
instrucciones de E/S y órdenes para el canal y el controlador.
 Planificación y control: La actual planificación y puesta en cola de las operaciones de E/S ocurren en este nivel, así
como el control de las operaciones. Así las interrupciones se gestionan en este nivel, y se averigua e informa sobre
el estado de la E/S.
11.4. Almacenamiento intermedio de la E/S
Para evitar esta carga e incapacidad, a veces es conveniente llevar a cabo las transferencias de entrada por adelantado a
las peticiones y realizar las transferencias de salida un tiempo después de hacer la petición. Esta técnica se conoce como el
nombre de almacenamiento intermedio (buffering). Para el estudio de los distintos métodos de almacenamiento intermedio,
a veces es importante hacer una distinción entre dos tipos de dispositivos: dispositivos orientados a bloque y dispositivos
orientados a flujo. Los dispositivos orientados a bloque almacenan la información en bloques, normalmente de tamaño fijo.
Los dispositivos orientados a flujo transfieren los datos como una serie de bytes; no poseen estructura de bloques.
Memoria intermedia sencilla
El tipo de apoyo más simple que el sistema operativo puede ofrecer es el almacenamiento intermedio sencillo. Cuando un
proceso de usuario realiza una solicitud de E/S, el sistema operativo le asigna a la operación un espacio en la parte del
sistema de la memoria principal.
Para los dispositivos orientados a bloques, el esquema de almacenamiento intermedio sencillo puede describirse como
sigue. Las transferencias de entrada se realizan en el espacio del sistema. Cuando se ha completado la transferencia, el
proceso mueve el bloque al espacio del usuario y solicita otro bloque inmediatamente. Esta técnica se llama lectura por
adelantado o entrada anticipada; se realiza esperando que el bloque se necesite más adelante.
Generalmente, este método proporciona una mayor velocidad en comparación con la ausencia de almacenamiento
intermedio en el sistema. El proceso de usuario puede procesar un bloque de datos mientras se está leyendo el siguiente. El
sistema operativo será capaz de expulsar el proceso porque la operación de entrada tiene lugar dentro de la memoria del
38
sistema en vez de en la memoria del proceso de usuario. Sin embrago, esta técnica complica la lógica del sistema
operativo. Ya que debe guardar constancia de las asignaciones de memorias intermedias del sistema a procesos de
usuario.
Se pueden aplicar consideraciones similares a la salida con dispositivos orientados a bloques. Cuando se transmiten datos
a un dispositivo, deben copiarse primero del espacio de usuario a un espacio del sistema, desde donde serán finalmente
escritos. El proceso que realizó la petición podrá entonces continuar o ser expulsado si es necesario.
Memoria intermedia doble
Se puede realizar una mejora sobre la memoria intermedia sencilla asignando a la operación dos almacenes intermedios del
sistema. De esta forma, un proceso puede transferir datos hacia (o desde) una memoria intermedia mientras que el sistema
operativo vacía (o rellena) el otro. Esta técnica se conoce como memoria intermedia doble o memoria intermedia de
intercambio.
Memoria intermedia circular
Si preocupa el rendimiento de un proceso determinado, sería deseable que las operaciones de E/S fueran capaces de ir al
ritmo del proceso. La memoria intermedia doble puede ser inapropiada si el proceso lleva a cabo rápidas ráfagas de E/S. En
este caso, el problema puede mitigarse usando más de dos memorias intermedias.
Cuando se emplean más de dos, el conjunto de memorias intermedias se conoce con el nombre de memoria intermedia
circular.
La utilidad del almacenamiento intermedio
El almacenamiento intermedio es una técnica que soluciona los problemas de picos en la demanda de E/S. Sin embrago, no
existe un tamaño de las memorias intermedias que permita a un dispositivo de E/S mantener el mismo ritmo
indefinidamente para un proceso cuando la demanda media del proceso es mayor que la que el dispositivo puede admitir .
Incluso si se dispone de varias memorias intermedias, al final todas se llevarán y el proceso tendrá que quedarse esperando
tras procesar cada fragmento de datos. Sin embrago, en un entorno multiprogramado, donde hay múltiples operaciones de
E/S y de procesamiento, el almacenamiento intermedio es una herramienta que puede incrementar la eficiencia del sistema
operativo y el rendimiento de los procesos individuales.
11.5. Planificación de discos
Parámetros de rendimiento del disco
Cuando la unidad está operando, el disco gira a una velocidad constante. Para leer o escribir, la cabeza debe ponerse en la
pista deseada, al comienzo del sector pertinente. Si el sistema es de cabezas móviles, hay que mover la cabeza para elegir
la pista. Si el sistema es de cabezas fijas, habrá que seleccionar electrónicamente una de ellas. En un sistema de cabezas
móviles, el tiempo que se tarda en ubicar la cabeza en la pista se llama tiempo de búsqueda. El tiempo que tarda el
comienzo del sector en llegar hasta la cabeza se conoce como retardo de giro, o latencia de giro. La suma de tiempo de
búsqueda y el retardo de giro es el tiempo de acceso.
Una vez que la cabeza esta ubicada se puede llevar a cabo la operación de lectura o escritura a medida que el sector se
mueve bajo la cabeza; esta es la parte de transferencia real de datos de la operación.
Tiempo de búsqueda
El tiempo de búsqueda es el tiempo necesario para mover el brazo del disco hasta la pista solicitada. Esta cantidad resulta
difícil de concretar. El tiempo de búsqueda consta de dos componentes claves: el tiempo de arranque inicial y el tiempo que
se tarda en recorrer las pistas. El tiempo recorrido no es una función lineal del número de pistas pero incluye un tiempo de
arranque y un tiempo de colocación.
Tiempo de transferencia
El tiempo de transferencia con el disco depende de la velocidad de rotación de la forma siguiente:
T=b
rN
donde:
T = tiempo de transferencia
b = número de bytes a transferir
N = números de bytes por pista
R = velocidad de rotación en revoluciones por segundo
Políticas de planificación de disco
La manera más sencilla de planificación sería la de primero en entrar, primero en salir (FIFO), lo que significa que los
elementos se procesan de la cola en un orden secuencial.
Prioridad
Con un sistema basado en prioridades, el control de planificación queda aislado del control del software gestor del disco.
Este enfoque no persigue la optimización del uso del disco, sino cumplir con otros objetivos del sistema operativo. Los
trabajos por lotes que sean más cortos y los trabajos interactivos reciben frecuentemente una prioridad más alta que los
trabajos mayores que realizan largas operaciones.
Ultimo en entrar, primero en salir
En los sistemas de proceso de transacciones, conceder el dispositivo al último usuario acarrea pocos o nulos movimientos
del brazo al recorrer un archivo secuencial. Sin embrago, si el disco esta ocupado con una carga de trabajo largo, existe la
clara posibilidad de inanición.
Primero el tiempo de servicio más corto
La política de primero el tiempo de servicio más corto (SSTF, Shortest Service Time First) es elegir la solicitud de E/S a
disco que requiera el menor movimiento posible del brazo del disco desde su posición actual.
SCAN
39
Con el SCAN. El brazo sólo se puede mover en un sentido, resolviendo todas las solicitudes pendientes de su ruta hasta
que alcance la última pista o hasta que no haya mas solicitudes en esa dirección.
C-SCAN
La política de C-SCAN restringe el rastreo a una sola dirección. Así, cuando se haya visitado la última pista en un sentido, el
brazo vuelve al extremo opuesto del disco y comienza a recorrer de nuevo
SCAN de N pasos y FSCAN
La política del SCAN de N pasos divide la cola de solicitudes del disco en subcolas de longitud N. Las subcolas se procesan
una a una mediante un SCAN. Mientras se procesa una cola, se añadirían nuevas solicitudes.
La política FSCAN emplea dos subcolas. Cuando comienza un rastreo, todas las solicitudes están en una de las colas y la
otra permanece vacía. Durante el recorrido, todas las solicitudes nuevas se colocan en la cola que inicialmente esta vacía.
11.6. RAID
Se pueden obtener ganancias de rendimiento adicionales utilizando varios componentes en paralelo. En el caso del
almacenamiento en disco, esto conduce al desarrollo de vectores de disco que operan independientemente y en paralelo.
Con múltiples discos, las distintas solicitudes de E/S se pueden gestionar en paralelo, siempre que los datos solicitados
residan en discos separados.
Con el uso de múltiples discos, hay una gran variedad de formas en las que se pueden organizar los datos y en las cuales
se pueden añadir redundancia para mejorar la fiabilidad. Esto puede dificultar el desarrollo de esquemas de bases de datos
que se puedan utilizar en múltiples plataformas y sistemas operativos. Afortunadamente, la industria ha acordado un
esquema estándar para el diseño de bases de datos sobre múltiples discos, llamado RAID (Redundant Array Of
Independent Disk, Vector redundante de discos independientes).El esquema RAID consta de siete niveles de cero a seis.
Estos niveles no implican una relación jerárquica pero designan distintas arquitecturas de diseño que comparten tres
características comunes:
1. RAID es un conjunto de unidades de disco físico vistas por el sistema operativo como una sola unidad lógica.
2. Los datos están distribuidos a través de las unidades físicas del vector.
3. La capacidad del disco redundante se utiliza para almacenar información de paridad, que garantiza la
recuperabilidad de datos en caso de fallo del disco.
Los detalles de la segunda y tercera características difieren para los diferentes niveles de RAID. RAID 0 no soporta la
tercera característica.
La única contribución de las propuestas de dirigir la necesidad de redundancia. Aunque permite cabezas múltiples y agentes
para operar simultáneamente y conseguir tasas de transferencia y E/S más altas, el uso de múltiples dispositivos
incrementa la probabilidad de fallo.
Los niveles 2 y 4 no están disponibles comercialmente.
Nivel RAID 0
No incluye redundancia para mejorar el rendimiento. En RAID 0, el usuario y los datos del sistema están distribuidos a lo
largo de todo el vector de discos. Esto tiene una notable ventaja sobre el uso de un solo gran disco: si hay pendientes dos
solicitudes de E/S distintas de dos bloques de datos diferentes, entonces existe una buena oportunidad para que los
bloques solicitados estén en discos diferentes. De este modo, se pueden realizar en paralelo las dos solicitudes, reduciendo
el tiempo en la cola de E/S.
Todos los usuarios y los datos del sistema se ven como si estuvieran almacenados en un disco lógico. Este disco esta
dividido en bandas (strip); Estas bandas pueden ser bloques físicos, sectores o alguna otra unidad. Las bandas se asignan
mediante turno rotatorio, a miembros consecutivos del vector. Un conjunto de bandas consecutivas lógicamente que se
corresponden exactamente con una banda de cada miembro del vector se denomina franja (stripe). En un vector de n
discos, las primeras n bandas lógicas, están físicamente almacenadas como la primera banda de cada uno de los n discos,
y forma la primera franja; Las segundas n bandas están distribuidas como la segundas bandas de cada disco; y así
sucesivamente. La ventaja de esta disposición es que si una única solicitud de E/S está formada por múltiples bandas
contiguas lógicamente, entonces las n bandas de esa solicitud pueden gestionarse en paralelo, reduciendo enormemente el
tiempo de transferencia de E/S.
Nivel RAID 1
En este caso cada banda lógica se corresponde con dos discos físicos independiente, por lo que cada disco del vector tiene
un disco espejo que contiene los mismos datos.
La organización RAID 1 tiene varios aspectos positivos:
1. Una solicitud de lectura la puede servir cualquiera de los dos discos que contienen los datos solicitados y que
suponga menor tiempo sumando el de búsqueda y la latencia de giro.
2. Una solicitud de escritura requiere la actualización de las bandas correspondientes a ambos discos, pero esto se
puede hacer en paralelo.
3. La recuperación de un fallo es sencilla. Cuando una unidad falla, los datos están todavía accesibles desde la
segunda unidad.
La principal desventaja de RAID 1 es el coste; Requiere 2 veces el espacio de disco lógico que soporta.
Nivel RAID 2
Los niveles RAID 2 y 3 utilizan una técnica de acceso paralelo. En un vector de acceso paralelo todos los discos participan
en la ejecución de cada solicitud de E/S. Normalmente, el eje de las unidades individuales esta sincronizado, por lo que
cada cabeza de disco está en la misma posición de cada disco en un instante dado.
40
Aunque RAID 2 requiere menos discos que RAID 1, el coste es todavía algo alto. El número de discos redundantes es
proporcional al logaritmo del número de discos de datos. En una lectura se accede a todos los discos simultáneamente.
RAID 3
RAID 3 se organiza de una forma similar a RAID 2. La diferencia es que RAID 3 requiere solo un disco redundante,
RAID 4
Los niveles RAID 4 a 6 usan una técnica de acceso independiente. En un vector de acceso independiente, cada disco opera
independientemente, por lo que se pueden satisfacer en paralelo solicitudes de E/S individuales. Son más apropiados para
aplicaciones que requieran tasas altas de solicitudes de E/S, y son relativamente menos apropiados para aplicaciones que
requieran tasas altas de transferencia de datos.
Nivel RAID 5
RAID 5 está organizado de forma similar a RAID 4. La diferencia es que RAID 5 distribuye las bandas de paridad a través
de todos los discos.
La distribución de las bandas de paridad a través de todos los discos evita el potencial cuello de botella de la E/S del
sistema RAID 4 que tiene sólo un disco de paridad.
Nivel RAID 6
En el esquema RAID 6, se realizan dos cálculos distintos de paridad, y se almacenan en bloques independientes de
diferentes discos. Así un vector RAID 6 cuyos datos de usuario requieren N discos está formado por N + 2 discos.
La ventaja de RAID 6 es que ofrece disponibilidad de datos extremadamente alta. Deberían fallar 3 discos en el intervalo
MTTR (Mean Time To Repair, Tiempo Medio de Reparación) para hacer que los datos no estuvieran disponibles. Por otro
lado, RAID 6 sufre una importante penalización de escritura porque cada escritura afecta a dos bloques de paridad.
11.7. Cache de disco
Una cache de disco es una memoria intermedia (buffer) situada en la memoria principal para sectores de disco. Cuando se
hace una solicitud de E/S para un sector específico, se comprueba si el sector está en la cache de disco. Si es así, la
solicitud se satisface con la cache. Sino, se lee el sector solicitado del disco y se coloca en la cache. Debido al concepto de
cercanía de referencias, cuando se traiga un bloque de datos a la cache para satisfacer una sola solicitud de E/S, será
probable que se produzcan referencias futuras al mismo bloque.
Capítulo 12
Gestión de archivos
12.1. Introducción
Archivos
Un campo es un elemento de datos básico, los campos pueden ser de tamaño fijo o variable.
Un registro es un conjunto de campos relacionados que pueden tratarse como una unidad en algunos programas de
aplicación.
Un archivo es un conjunto de registros similares.
Una base de datos es un conjunto de datos relacionados. El aspecto fundamental de una base de datos es que las
relaciones que existen entre los elementos de datos son explícitas y que la base de datos está diseñada para ser usada por
varias aplicaciones diferentes. La base de datos consta de uno o más clases de archivos.
Sistemas de gestión de archivos
Un sistema de gestión de archivos es aquel conjunto de software del sistema que ofrece a los usuarios y aplicaciones unos
servicios relativos al empleo de archivos. Normalmente, la única forma que un usuario o aplicación puede acceder a los
archivos es mediante el sistema de gestión de archivos.
Los objetivos de un sistema de gestión de archivos son:
 Cumplir con las necesidades de gestión de datos y con los requerimientos del usuario, que incluyen el
almacenamiento de datos y la capacidad de realizar operaciones antes expuestas.
 Garantizar que los datos de los archivos sean válidos.
 Optimizar el rendimiento en términos de respuesta.
 Ofrecer soporte de E/S para la variedad de tipos de dispositivos de almacenamiento.
 Minimizar o eliminar la posibilidad de pérdida o destrucción de datos.
 Ofrecer un conjunto estándar de rutinas de interfaz de E/S.
 Proporcionar soporte de E/S para múltiples usuarios en el caso de sistemas multiusuario.
Para un sistema interactivo, de propósito general, debe cumplirse los siguientes requisitos mínimos:
 Cada usuario debe ser capaz de crear, borrar y cambiar archivos.
 Cada usuario puede tener acceso controlado a los archivos de otros usuarios.
 Cada usuario puede controlar qué tipos de acceso estarán permitidos a sus archivos.
 Cada usuario debe poder reestructurar sus archivos de manera adecuada al problema.
 Cada usuario debe ser capaz de mover datos entre archivos.
 Cada usuario debe ser capaz de guardar una copia de reserva y recuperar sus archivos en el caso de que hayan
sufrido algún daño.
 Cada usuario debe ser capaz de acceder a sus archivos mediante un nombre simbólico.
41
Arquitectura de los sistemas de archivos
En el nivel más bajo, los gestores de dispositivos (device drivers) se comunican directamente con los dispositivos periféricos
o sus controladores o canales. Cada controlador de dispositivo es responsable de comenzar las operaciones de E/S en un
dispositivo y procesar la terminación de una petición de E/S. En operaciones con archivos, los dispositivos típicos
controlados son discos y unidades de cinta. Los gestores de dispositivos son considerados generalmente como parte del
sistema operativo.
El siguiente nivel es conocido con el nombre de sistema de archivos básico o nivel de E/S física, que constituye la interfaz
primaria con el entorno exterior del sistema informático. Este nivel trata con bloques de datos que se intercambian con
sistemas de disco o cinta. De este modo, se encarga de ubicar dichos bloques en el dispositivo de almacenamiento
secundario y del almacenamiento intermedio de los mismos en la memoria principal. Este nivel no comprenderá el contenido
de los datos o la estructura de los archivos implicados. El sistema de archivos básico considera a menudo parte del sistema
operativo.
El supervisor básico de E/S es el responsable de la inanición y terminación de toda la E/S con archivos. En este nivel se
mantienen unas estructuras de control que se encargan de la E/S con los dispositivos, la planificación y el estado de los
archivos. El supervisor básico de E/S se ocupa de la selección del dispositivo donde va a realizarse la E/S con los archivos,
que depende del archivo seleccionado.
La E/S lógica es parte del sistema de archivos que permite a usuarios y aplicaciones acceder a los registros.
Finalmente, el nivel del sistema de archivo más cercano al usuario es el método de acceso. Cada método proporciona una
interfaz estándar entre las aplicaciones y los sistemas de archivos y dispositivos que guardan datos. Los diferentes métodos
de acceso reflejan las distintas estructuras de archivos y las formas diferentes de acceder y procesar los datos.
E/S Lógica
Supervisor básico de E/S
Sistema de Archivo básico
Gestores de Dispositivos (Device Drivers)
Funciones de la gestión de archivos
Los usuarios y los programas de aplicación interactúan con el sistema de archivos por medio de ordenes de creación y
eliminación de archivos y realizando operaciones sobre los archivos. Antes de realizar cualquier operación, el sistema de
archivos debe identificar y ubicar el archivo en cuestión. Esto requiere el uso de algún tipo de directorio que describa la
ubicación de todos los archivos y sus atributos. Además, la mayoría de los sistemas compartidos aplican algún control de
acceso de los usuarios: solo a los usuarios autorizados se les permite acceder de una forma determinada a determinados
archivos.
El usuario o la aplicación contempla al archivo como una estructura que organiza los registros, como una estructura
secuencial.
Mientras que los usuarios y las aplicaciones se ocupan de los registros, la E/S se lleva a cabo por bloques.
12.2. Organización y acceso a archivos
La organización física de un archivo en el almacenamiento secundario depende de la estrategia de agrupación y de la
estrategia de asignación de archivos, cuestiones tratadas más tarde en este mismo capítulo.
Diversos criterios son importantes en la elección de una organización de archivos:
 Acceso rápido.
 Facilidad de actualización.
 Economía de almacenamiento.
 Mantenimiento sencillo.
 Fiabilidad.
La prioridad relativa de estos criterios dependerá de las aplicaciones que usarán el archivo. Un archivo almacenado en CD
ROM nunca será actualizado, por lo que la facilidad de actualización no se considera.
Estos criterios pueden entrar en conflicto. Por ejemplo, para la economía de almacenamiento, debería existir una mínima
redundancia en los datos. Por otro lado, la redundancia es el medio fundamental para incrementar la velocidad de acceso a
los datos. Un ejemplo de esto es el uso de los índices.
Las cinco organizaciones son las siguientes:
 Pilas.
 Archivos secuenciales.
 Archivos secuenciales indexados.
 Archivos indexados.
 Archivos directos a disposición (hash).
Pilas
Los datos se recogen en el orden que llegan. Cada registro consta de una ráfaga de datos. La longitud de cada campo debe
indicarse implícitamente mediante delimitadores, explícitamente incluidos como un subcampo más o conocidos por omisión
para el tipo de campo.
Como no hay una estructura para el archivo de pila, el acceso a los registros se hace por búsqueda exhaustiva. Es decir, si
se quiere encontrar un registro que contiene un campo particular con un valor determinado, es necesario examinar cada
42
registro de la pila hasta que se encuentre el registro deseado o se haya recorrido un archivo completo.
Archivos secuenciales
En esta clase de archivos se emplea un formato fijo para los registros. Todos los registros son de la misma longitud y
constan del mismo número de campos de tamaño fijo en un orden determinado. Como se conoce la longitud y la posición de
cada campo.
Un campo particular, generalmente el primero de cada registro, es conocido como el campo clave.
Los archivos secuenciales se utilizan normalmente en aplicaciones de proceso por lotes y, generalmente, son óptimos para
dichas aplicaciones si se procesan todos los registros. La organización secuencial de archivos es la única que se puede
guardar tanto en cinta como en disco.
Para las aplicaciones interactivas que incluyen peticiones o actualizaciones de registros individuales, los archivos
secuenciales ofrecen un rendimiento pobre. El acceso requiere la búsqueda secuencial en el archivo de una
correspondencia con la clave.
Archivos secuenciales indexados
El método más popular para solventar las desventajas de los archivos secuenciales es el archivo secuencial indexado. Los
archivos secuenciales indexados mantienen las características básicas de los archivos secuenciales. Los registros se
organizan en una secuencia basada en un campo clave, pero se añaden dos características nuevas: un índice del archivo
para soportar los accesos aleatorios y un archivo de desbordamiento (overflow). El índice proporciona una capacidad de
búsqueda para llegar rápidamente a las proximidades de un registro deseado.
La estructura secuencial indexada más simple utiliza un único nivel de indexación. El índice en este caso es un archivo
secuencial simple. Cada registro del archivo índice consta de dos campos: un campo clave, que es el mismo que el campo
clave del archivo principal y un puntero de archivo principal. Para encontrar un campo específico, se busca el índice hasta
encontrar el valor mayor que la clave que es igual o precede el valor deseado de la clave. La búsqueda continúa en el
archivo principal a partir de la posición indicada por el puntero.
Archivos indexados
Los archivos secuenciales indexados conservan una de las limitaciones de los archivos secuenciales: la eficacia en el
procesamiento está limitada a que esté basado en un único campo del archivo. Cuando es necesario buscar un registro
basándose en algún otro atributo distinto del campo clave, ninguna de ambas formas de archivo secuencial es adecuada.
En algunas aplicaciones, esta flexibilidad es deseable.
Para alcanzar esta flexibilidad, se necesita una estructura que utilice múltiples índices, uno para cada tipo de campo que
pueda ser objeto de la búsqueda.
Se suelen utilizar 2 tipos de índices. Un índice exhaustivo contiene una entrada para cada registro del archivo principal. El
índice se organiza en sí mismo como un archivo secuencial, para facilitar la búsqueda. Otro índice parcial contendrá
entradas a los registros donde esté el campo de interés.
Archivos directos o de dispersión
Los archivos directos o de dispersión explotan la capacidad de los discos para acceder directamente a cualquier bloque de
dirección que coincida. Como en los archivos secuenciales y secuenciales indexados, se requiere un campo clave en cada
registro. Sin embargo, aquí no hay concepto de ordenación secuencial.
12.3. Organización de directorios
Contenido
El directorio contiene información sobre los archivos, incluyendo atributo, ubicación y propietario. El directorio propiamente
un archivo, poseído por el sistema operativo y accesible a través de diversas rutinas de gestión de archivos.
Estructura
La forma más simple de estructuración de un directorio es una lista de entradas, una para cada archivo. Esta estructura
puede representarse con un simple archivo secuencial, con el nombre del archivo haciendo las veces de clave.
Para comprender los requisitos de una estructura de archivo, merece la pena considerar los tipos de operaciones que
pueden realizarse con un directorio:
 Buscar: Cuando un usuario o aplicación hace referencia a un archivo, debe buscarse en el directorio la entrada
correspondiente al archivo.
 Crear archivo: Al crear un nuevo archivo, debe añadirse una entrada al directorio.
 Borrar archivo: Al borrar un archivo, debe eliminarse una entrada del directorio.
 Enumerar directorio: Puede solicitarse todo el directorio o una parte.
 Actualizar directorio: Cuando algunos atributos del archivo se almacenan en el directorio, un cambio en alguno de
estos atributos requiere un cambio en la entrada del directorio correspondiente.
Una única lista no es adecuada para soportar estas operaciones. Considérese las necesidades de un solo usuario. El
usuario puede tener muchos tipos de archivos, incluyendo documentos de texto, archivos gráficos, hojas de cálculo, etc. EL
usuario puede querer tenerlos organizados por proyecto, tipo o de otra manera conveniente. Si el directorio es una simple
lista secuencial, no ofrecerá ayuda alguna en la organización de los archivos y obligará al usuario a tener cuidado de no
usar el mismo nombre para dos tipos diferentes de archivos.
Un buen comienzo para resolver estos problemas podría ser acudir a un esquema de dos niveles. En este caso, existe un
directorio para cada usuario y un directorio maestro. El directorio maestro dispone de una entrada para cada directorio de
usuario, incluyendo una dirección e información de control de acceso. Cada directorio de usuario es una simple lista de los
archivos del usuario. Esta disposición dignifica que los nombres deben ser únicos sólo dentro del conjunto de archivos de
cada usuario.
Un método más potente y flexible, adoptado casi universalmente, es el directorio jerárquico o estructurado en árbol. Cada
43
uno de estos directorios puede tener a su vez subdirectorios y archivos como entradas. Esto se cumple en cualquier nivel.
Es decir, en cualquier nivel, un directorio puede constar de entradas para subdirectorios o entradas para archivos.
Designación
Los usuarios deben poder referirse a un archivo por medio de un nombre simbólico. Evidentemente, cada archivo del
sistema debe tener un nombre único que la referencias al archivo no sean ambiguas. Por otra parte, proporcionar nombres
únicos es una carga inaceptable para los usuarios, especialmente en un sistema compartido.
El uso de directorios estructurados en árbol minimiza la dificultad de asignar nombres únicos. Cualquier archivo del sistema
puede ser localizado siguiendo un camino desde el directorio raíz o maestro, descendiendo por varias ramas hasta que se
alcance el archivo.
Es perfectamente aceptable tener varios archivos con el mismo nombre de archivo mientras tengan nombres de caminos
distintos.
12.4. Compartimiento de archivos
En un sistema multiusuario, casi siempre existe la necesidad de permitir a los usuarios compartir archivos. Emergen
entonces dos cuestiones: los derechos de acceso y la gestión de accesos simultáneos.
Derechos de acceso
A los usuarios o grupos de usuarios le son concedidos ciertos derechos de acceso a cada archivo. Se ha venido usando un
amplio conjunto de derechos de acceso. La lista siguiente es representativa de los derechos de acceso que pueden
asignarse a un usuario particular para un archivo específico.
 Ninguno: El usuario no puede ni siquiera conocer la existencia del archivo, ni mucho menos acceder al mismo.
 Conocimiento: El usuario puede determinar que el archivo existe y quien es su propietario,
 Ejecución: El usuario puede cargar y ejecutar un programa pero no puede copiarlo.
 Lectura: El usuario puede leer el archivo para cualquier propósito, incluyendo copia y ejecución.
 Adición: El usuario puede añadir datos al archivo, generalmente al final, pero no puede modificar o borrar el
contenido de los mismos. Este derecho es útil en la recopilación de datos a partir de varias fuentes.
 Actualización: El usuario puede modificar, borrar y añadir datos al archivo.
 Cambio de protección: El usuario puede cambiar los derechos de acceso otorgados a otros usuarios.
 Borrado: El usuario puede borrar el archivo del sistema de archivos.
Puede considerarse que estos derechos constituyen una jerarquía, con cada uno incluyendo a todos los que le preceden.
El usuario es designado como propietario de un archivo dado. Normalmente será la persona que creó el archivo al principio.
El propietario dispone de todos los derechos de acceso enumerados antes y puede otorgar derechos a los otros. Puede
ofrecerse acceso a las siguientes clases de usuarios:
 Usuario específico: Usuarios individuales designados por su ID de usuario.
 Grupos de usuarios: Un conjunto de usuarios no definidos individualmente.
 Todos: Todos los usuarios que tengan acceso al sistema. Estos serán archivos públicos.
12.5. Agrupación de registros
Los registros son la unidad lógica de acceso a los archivos, mientras que los bloques son la unidad de E/S para
almacenamiento secundario. Para realizar E/S, los registros deben organizarse en bloques.
En primer lugar ¿Los bloques deberán tener longitud fija o variable? En la mayoría de los sistemas los bloques son de
longitud fija. En segundo lugar ¿cuál deberá ser el tamaño relativo de un bloque, en comparación con el tamaño medio de
registro? El equilibrio de este: Cuanto mayor sea el bloque, más registros se pasarán en una operación de E/S. Esto es una
ventaja si el archivo se está procesando secuencialmente, porque el número de operaciones de E/S se reduce usando
bloques mayores, acelerando así el procesamiento. Por otro lado, si se accede aleatoriamente a los registros y no se
observa ninguna cercanía particular en las referencias, el uso de bloques mayores redunda en una transferencia
innecesaria de registros sin usar. Sin embrago, combinando la frecuencia de las operaciones secuenciales con la posibilidad
de cercanía de referencias, se puede afirmar que el tiempo de transferencia de E/S se reduce usando bloques mayores. La
pega es que los bloques grandes necesitan buffers de E/S mayores, haciendo más difícil la gestión de buffers.
Dado un tamaño de bloque, pueden seguirse los siguientes tres métodos de agrupación de bloques:
 Bloques fijos: Se usan registros de longitud fija, guardándose en cada bloque un número entero de registros. Puede
existir espacio sin usar al final de cada bloque. Esto se denomina fragmentación interna.
 Bloques de longitud variable con tramos: Se usan registros de longitud variable que se agrupan en bloques sin dejar
espacio sin usar. De este modo, algunos registros deben abarcar dos bloques, indicando el tramo de continuación
con un puntero al bloque siguiente.
 Bloques de longitud variable sin tramos: Se usan registros de longitud variable, pero no se dividen en tramos. En la
mayoría de los bloques habrá un espacio desperdiciado debido a la imposibilidad de aprovechar el resto del bloque
si el registro siguiente es mayor que el espacio sin utilizar restante.
12.6. Gestión del almacenamiento secundario
En memoria secundaria, un archivo consta de un conjunto de bloques. El sistema operativo o el sistema de gestión de
archivos es el responsable de la asignación de los bloques a archivos. Esto suscita dos cuestiones sobre la gestión. En
primer lugar, debe asignarse el espacio de memoria secundaria a los archivos y, en segundo lugar, es necesario guardar
constancia del espacio disponible para asignar.
Asignación previa frente a asignación dinámica
Una política de asignación previa requerirá el tamaño máximo de un archivo se declarase en el momento de crearlo. Para
44
muchas aplicaciones es difícil, si no imposible, estimar de manera fiable el posible tamaño máximo del archivo.
Evidentemente, esto es un derroche desde el punto de vista de la asignación de memoria secundaria. Por lo tanto, existen
ventajas en el uso de la asignación dinámica, que asigna espacio a los archivos en secciones a medida que se necesitan.
Tamaño de sección
En un extremo, se puede asignar una sección suficientemente grande para guardar el archivo entero. En el otro extremo, se
puede asignar un espacio en disco de bloque en bloque. Para realizar esta elección:
 La contigüidad del espacio aumenta el rendimiento.
 Disponer de un gran número de secciones pequeñas aumenta el tamaño de las tablas necesarias para gestionar la
asignación de información.
 Disponer de secciones de tamaño fijo simplifica la reasignación del espacio.
 Disponer de secciones de tamaño variable o secciones pequeñas de tamaño fijo minimiza la pérdida de espacio no
usado provocada por la sobreasignación.
Por supuesto, estos elementos interactúan entre sí y deben considerarse en conjunto. Como resultado se tienen dos
opciones principales:
 Secciones contiguas variables y grandes: Esta opción ofrecerá un rendimiento mejor. El tamaño variable evitará la
pérdida y las tablas de asignación de archivos serán pequeñas. Sin embargo, el espacio es difícil de reutilizar.
 Bloques: Las secciones fijas y pequeñas ofrecen una flexibilidad mayor. Se pueden necesitar grandes tablas o
estructuras complejas para su asignación. La contigüidad se abandona; los bloques se asignan a medida que se
necesitan.
Con secciones de tamaño variable. Hay que preocuparse de la fragmentación del espacio libre. Las siguientes son
algunas estrategias alternativas posibles: Primer ajuste (First Fit), Mejor ajuste (Best Fit) y Ajuste más cercano
(Nearest Fit).
Métodos de asignación de archivos
Se está en posición de considerar métodos específicos de asignación de archivos. Son de uso común tres métodos:
contiguo, encadenado e indexado.
Con asignación contigua, cuando se crea un archivo se le asigna un único conjunto de bloques. Por lo tanto, esta es una
estrategia de asignación previa que emplea secciones de tamaño variable. La tabla de asignación de archivos necesita sólo
una entrada por cada archivo y que muestre el bloque de comienzo y longitud del archivo.
En el extremo opuesto a la asignación contigua esta la asignación encadenada. Normalmente, la asignación se hace con
bloques individuales. Cada bloque contendrá un puntero al siguiente bloque de la cadena. La tabla de asignación de
archivos necesita de nuevo una sola entrada por cada archivo que muestre el bloque de comienzo y longitud de archivo. La
elección de bloques es entonces una cuestión simple: Cualquier bloque libre puede añadirse a la cadena. No hay que
preocuparse por la fragmentación externa porque sólo necesita un bloque cada vez. Una consecuencia del
encadenamiento, como se ha descrito hasta ahora, es que no hay cabida para el principio de cercanía.
La asignación indexada trata muchos de los problemas de las asignaciones contiguas y encadenadas. En este caso, la tabla
de asignación de archivos contiene un índice separado de un nivel para archivos; el índice posee una entrada para cada
sección de asignación al archivo. La asignación puede hacerse por bloques de tamaño fijo o en secciones de tamaño
variable. La asignación por bloques elimina la fragmentación externa, mientras que la asignación por secciones de tamaño
variable mejora la cercanía.
Gestión del espacio libre
Es necesario saber que bloques del disco están disponibles. Por lo tanto, hace falta una tabla de asignación de disco
además de una tabla de asignación de archivos. Tres técnicas son de uso común: las tablas de bits, las secciones libres
encadenadas y la indexación.
Tablas de bits
Este método utiliza el vector que contiene un bit por cada bloque del disco. Cada entrada igual a 0 corresponde a un bloque
libre y cada entrada igual a 1 corresponde a un bloque en uso.
Las tablas de bits tienen la ventaja de que es relativamente fácil encontrar un bloque o un grupo de bloques libres.
Secciones libres encadenadas
Las secciones libres pueden encadenarse juntas mediante un puntero y un valor de longitud en cada sección libre. Este
método tiene un gasto insignificante porque no hay necesidad de tabla de asignación de disco, sino simplemente un puntero
al comienzo de la cadena y la longitud de la primera sección.
Este método tiene sus propios problemas. Después de cierto tiempo de uso, el disco llegará a estar fragmentado y muchas
secciones serán de un solo bloque. Nótese también que cada vez que se asigna un bloque es necesario leer antes el
bloque para recuperar el puntero al nuevo primer bloque libre antes de escribir datos sobre ese bloque.
Indexación
El método indexación trata el espacio libre como si fuera un archivo y utiliza una tabla índice como la descrita en la
asignación de archivos.
Lista de bloques libres
En este método, cada bloque tiene asignado un número secuencial y la lista de números de todos los bloques libres
mantenidos en una sección reservada del disco.
45
Capítulo 13
Proceso distribuido, cliente/servidor y agrupaciones
Con el incremento de la disponibilidad de computadores personales y potentes servidores no muy caros, ha habido una
mayor tendencia hacia el proceso de datos distribuido (DDP, Distributed Data Processing), en el que los procesadores,
datos y otros elementos del sistema de proceso de datos pueden estar distribuidos en una organización. Un sistema DDP
implica la partición de la función de computación y puede, también conllevar una organización distribuida de las bases de
datos, el control de los dispositivos y el control de las interacciones (redes).
En muchas organizaciones, los computadores dependen enormemente de los servidores. Los computadores personales se
utilizan para soportar aplicaciones amigables, tales como procesadores de texto, hojas de cálculo y gráficos de
presentación. Los servidores albergan las bases de datos corporativas y el sofisticado software de sistemas de información
y gestión de bases de datos. Son necesarios enlaces entre un computador personal y el servidor, así como entre cada una
de los computadores personales.
Estas tendencias en las aplicaciones han sido apoyadas por la evolución de las capacidades distribuidas de los sistemas
operativos y de las utilidades de soporte. Se han explorado un espectro de capacidades:
 Arquitectura de comunicaciones: Este es el software que da soporte a una red de computadores independientes.
Ofrece soporte para aplicaciones distribuidas, tales como correo electrónico, transferencia de archivos y acceso a
terminales remotos. El ejemplo más conocido y más frecuentemente utilizado en la arquitectura de comunicaciones
es el conjunto de protocolos TCP/IP.
 Sistema operativo de red: esta es una configuración en la que existe una red de maquinas de aplicación,
generalmente estaciones de trabajo monousuario y uno o más servidores. Los servidores proporcionan servicios o
aplicaciones a toda la red, tales como el almacenamiento de archivos y la gestión de impresoras. Cada computador
tiene su propio sistema operativo privado. El sistema operativo de red es simplemente un añadido al sistema
operativo local que permite a los servidores de aplicación interactuar con los servidores.
 Sistemas operativos distribuidos: Un sistema operativo común compartido por una red de computadores. Para los
usuarios es como un sistema operativo centralizado aunque les proporciona un acceso transparente a los recursos
de numerosos computadores.
13.1. Proceso Cliente/Servidor
Terminología Cliente/Servidor
 Interfaz de programas de aplicación (API): Son un conjunto de funciones y programas de llamadas que permiten
comunicarse a clientes y servidores.
 Cliente: El cliente solicita información a la red, generalmente un PC o estación de trabajo.
 Middleware: Un conjunto de controladores, API u otro software que mejora la conectividad entre las aplicaciones de
cliente y un servidor.
 Base de datos relacional: Una base de datos en donde el acceso a la información está limitado por la selección de
filas que satisfacen todos los criterios de búsqueda.
 Servidor: Un computador, generalmente una estación de trabajo muy potente, un microcomputador o un mainframe,
que contiene información para que los cliente de red puedan manipularla.
 Leguaje de consulta estructurada (SQL, Structured Query Lenguage): Un lenguaje desarrollado por IBM y
estandarizado por ANSI para direccional, crear, actualizar o consultar bases de datos relacionales.
En un entorno Cliente/Servidor, cada servidor ofrece una serie de servicios de usuario compartidos a los clientes.
Actualmente, el tipo más común de servidor es el servidor de bases de datos, que, generalmente, controla una base de
datos relacional.
Además de los clientes y los servidores, el tercer ingrediente básico del entorno Cliente/Servidor es la red.
Existe una serie de características que llaman la atención y que, juntas, hacen distinto al proceso Cliente/Servidor del
distribuido normal y corriente:
 Hay una gran confianza en depositar aplicaciones amigables para los usuarios en sus propios sistemas.
 Al mismo tiempo que las aplicaciones se dispersan, se produce un énfasis en la centralización de las bases de
datos corporativas y de muchas funciones de utilidad y de gestión de la red.
 Existe un compromiso, tanto de parte de las organizaciones de usuarios como de los fabricantes, hacia los sistemas
abiertos y modulares. Esto significa que los usuarios disponen de ofertas mejores en la elección de productos y en
la combinación de equipos de varios fabricantes
 La gestión y la seguridad de la red tiene una prioridad alta en la organización y operación de los sistemas de
información.
Aplicaciones Cliente/Servidor
La característica central de la arquitectura Cliente/Servidor es la ubicación de las tareas de nivel de aplicación entre clientes
y servidores. Tanto en el cliente como en el servidor el software básico es un sistema operativo que se ejecuta en la
plataforma de hardware. Las plataformas y los sistemas operativos del cliente y el servidor pueden ser diferentes.
46
Estación de trabajo del cliente
Servicios de presentación
Petición
Lógica de aplicación
Lógica de aplicación
Respuesta
Software
de comunicaciones
Software de comunicaciones
Interacción de protocolos
Sistema operativo – Cliente
Sistema operativo - Cliente
Plataforma hardware
Plataforma hardware
Aplicaciones de bases de datos
En este entorno, el servidor es, básicamente, un servidor de base de datos. La interacción entre el cliente y el servidor se
hace en forma de transacciones, donde el cliente realiza una petición a la base de datos y recibe una respuesta de aquella.
La siguiente figura ilustra, en términos generales, la arquitectura de este tipo de sistemas. El servidor es responsable de
mantener la base de datos, para cuyo objeto se necesitan complejos sistemas gestores de bases de datos.
Servicios de presentación
Lógica de aplicación
Lógica de bases de datos
Software de comunicaciones
Sistema operativo – Cliente
Plataforma hardware
Petición
Respuesta
Interacción de protocolos
Lógica de aplicación
Software de
Sistema gestor de
comunicaciones
bases de datos
Sistema operativo – Cliente
Plataforma hardware
Clases de aplicaciones Cliente/Servidor
Dentro del entorno general Cliente/Servidor, se dispone de una gama de posibles implementaciones que dividen el trabajo
entre el cliente y el servidor de manera diferente.
El proceso puede realizarse de varias formas:
 Proceso basado en una máquina central: el proceso basado en una máquina central (host) no es realmente un
proceso Cliente/Servidor, de acuerdo con el uso que se hace del término. El proceso basado en host se refiere más
bien al entorno tradicional de grandes sistemas en todo o casi todo el tratamiento se realiza en un computador
central.
 Proceso basado en el servidor: El tipo más básico de configuración Cliente/Servidor es aquél en que el servidor es
básicamente responsable de ofrecer una interfaz de usuario gráfica, mientras casi todo el tratamiento se hace en el
servidor.
 Proceso basado en el cliente: En el otro extremo casi todo el proceso de la aplicación puede hacerse en el cliente,
con la excepción de las rutinas de validación de datos y otras funciones lógicas de la base de datos que se realizan
mejor en el servidor.
 Proceso cooperativo: En una configuración de proceso cooperativo, el proceso de la aplicación se lleva a cabo de
forma optimizada, aprovechando la potencia de las máquinas de cliente y servidora y la distribución de los datos.
Esta configuración es más compleja de instalar y mantener pero, a largo plazo, este tipo de configuración puede
ofrecer una mayor ganancia de productividad del usuario y una mayor eficiencia de la red que otros métodos
Cliente/Servidor.
Arquitectura Cliente/Servidor de tres capas
La arquitectura tradicional Cliente/Servidor implica dos niveles o capas: una capa cliente y una capa servidor. En los últimos
años la arquitectura que más se ha pasado a utilizar es una de tres capas. Esta arquitectura el software de aplicación está
distribuido entre tres tipos de máquinas: una máquina de usuario, un servidor de capa intermedia y un servidor final.
Las máquinas de capa intermedia pueden convertir protocolos y traducir un tipo de consulta de bases de datos a otro.
Además, la maquina de capa intermedia puede mezclar e integrar resultados de distintas fuentes de datos. Por último, la
máquina de capa intermedia puede servir como pasarela entre aplicaciones de computador de escritorio y antiguas
aplicaciones finales de mediadora entre los dos mundos.
La interacción entre el servidor de capa intermedia y el servidor final también sigue el modelo Cliente/Servidor. De esta
forma el sistema de capa intermedia actúa a la vez como cliente y como servidor.
Consistencia de la cache de archivos
Cuando se utiliza un servidor de archivos, el rendimiento de la E/S referente a los accesos locales a archivos puede
degradarse sensiblemente por causa del retardo introducido en la red. Para reducir esta carga, los sistemas individuales
pueden usar caches de archivos para almacenar los registros a los que se ha accedido hace poco.
Middleware
Para alcanzar las ventajas reales de la filosofía Cliente/Servidor, los desarrolladores deben disponer de un conjunto de
herramientas que proporcionen una manera uniforme de acceder a los recursos del sistema en todas las plataformas.
La forma más común de cumplir con este requisito es utilizar interfaces estándares de programación y protocolos que se
sitúen entre la aplicación y el software de comunicaciones y el sistema operativo. Dichas interfaces y protocolos estándares
han venido a llamarse middleware. Con interfaces estándar de programación, es fácil implementar una misma aplicación en
una variedad de tipos de servidores y de puestos de trabajo.
13.2. Paso distribuido de mensajes
En los sistemas de proceso distribuido reales se suele dar el caso de que los computadores no compartan una memoria
principal; cada una es en un sistema aislado. Por lo tanto, no es posible emplear técnicas de comunicación entre
47
procesadores basadas en memoria compartida, como son los semáforos y el uso de un área de memoria común. En su
lugar, se usan técnicas basadas en el paso de mensajes.
Fiabilidad frente a no fiabilidad
Un servicio de paso de mensajes fiable es aquél que garantiza la entrega, si es posible. Dicho servicio debería hacer uso de
un protocolo de transporte fiable o de alguna lógica similar y llevaría a cabo control de errores, acuse de recibo,
retransmisión y reordenación de mensajes desordenados.
Bloqueante frente a no bloqueante
Con primitivas no bloqueantes, o asíncronas, un proceso no queda suspendido como resultado de un send o recive.
Las primitivas no bloqueantes ofrecen un empleo eficiente y flexible del servicio de paso de mensajes. La desventaja de
este enfoque es que los programas que emplean estas primitivas son difíciles de probar y depurar. Las secuencias
irreproducibles dependientes del tiempo pueden originar problemas sutiles y complicados. La otra alternativa es emplear
primitivas bloqueantes, o síncronas. Un send bloqueante no devuelve el control al proceso emisor hasta que el mensaje se
haya transmitido o hasta que el mensaje se haya enviado y obtenido un acuse de recibo. Un recive bloqueante no devuelve
el control hasta que el mensaje se haya ubicado en el buffer asignado.
13.3. Llamadas a procedimiento remoto
Una variante del modelo básico de paso de mensajes es la llamada a procedimiento remoto (RPC). Es un método común
muy aceptado actualmente para encapsular la comunicación en un sistema distribuido. Lo fundamental de la técnica es
permitir que programas de máquinas diferentes interactúen mediante la semántica de llamadas/retornos a simples
procedimientos, como si los dos programas estuvieran en la misma máquina. La popularidad de este enfoque se debe a las
siguientes ventajas:
1. La llamada a procedimiento es una abstracción muy usada, aceptada y bien comprendida.
2. El empleo de llamadas a procedimiento remoto permite que las interfaces remotas se especifiquen como un
conjunto de operaciones con nombre y de un tipo determinado. De este modo, la interfaz puede documentarse de
forma clara y los programas distribuidos pueden comprobarse estadísticamente para detectar errores tipo.
3. Como la interfaz es estándar y está definida de forma precisa, el código de comunicaciones de una aplicación
puede generarse automáticamente.
4. Como la interfaz es estándar y esta definida en forma precisa, los desarrolladores de software pueden escribir
módulos clientes y servidores que pueden trasladarse entre computadores y sistemas operativos con pocas
modificaciones.
El mecanismo de llamadas a procedimiento remoto puede considerarse como un refinamiento del paso de mensajes fiable y
bloqueante.
Paso de parámetros
La mayoría de los lenguajes de programación permiten pasar parámetros como valores o como un puntero a la ubicación
que contiene el valor. La llamada por valor es sencilla para una llamada a un procedimiento remoto: los parámetros
simplemente se copian en el mensaje y se envía al sistema remoto. Las llamadas por referencia son más difíciles de
implementar. Hace falta un único puntero para cada objeto, válido en todo el sistema. El coste de este servicio puede no
merecer la pena.
Representación de parámetros
Otra cuestión es cómo representar los parámetros y los resultados en los mensajes. Si el programa llamador y el llamado
están construidos en los mismos lenguajes de programación, sobre el mismo tipo de máquinas y con el mismo sistema
operativo, los requisitos de representación no son un problema. Si existen diferencias en estos aspectos, probablemente,
habrá diferencias en la manera en que se representan los datos numéricos e incluso los textos.
El mejor enfoque para este problema es ofrecer un formato estándar para los objetos comunes como los enteros, números
en coma flotante, caracteres y cadenas de caracteres. Des esta forma, los parámetros propios de cualquier máquina
pueden convertirse a la representación estándar.
Enlace Cliente/Servidor
El enlace especifica la forma que se establecerá la relación entre un procedimiento remoto y el programa llamador. Un
enlace se forma cuando dos aplicaciones han establecido una conexión lógica y se encuentran preparadas para
intercambiar órdenes y datos.
Los enlaces no persistentes suponen que la conexión lógica se establece entre dos procesos en el momento de la llamada
remota y que la conexión se pierde tan pronto como se devuelvan los valores. Como una conexión requiere el
mantenimiento de información de estado en ambos extremos, consume recursos. El estilo no persistente se utiliza para
conservar dichos recursos.
Con enlaces persistentes, una conexión establecida para una llamada a un procedimiento remoto se mantiene después de
que el procedimiento termina. La conexión puede utilizarse para futuras llamadas a procedimiento remoto.
Sincronismo frente a asincronismo
Los conceptos de llamadas a procedimiento remoto síncronas y asíncronas son análogos a los mensajes bloqueantes y no
bloqueantes. Las llamadas tradicionales a procedimiento remoto son síncronas, lo que requiere que el proceso llamador
espera hasta que el proceso llamado devuelva un valor. Así, la RPC síncrona se comporta de manera muy parecida a una
llamada a subrutina.
Con objeto de ofrecer una mayor flexibilidad, se han implementado varios servicios de RPC asíncrona que consigue un
grado mayor de paralelismo, a la vez que conservan la simplicidad y la familiaridad de la RPC. Las RPC asíncronas no
bloquean al llamador; Las respuestas pueden recibirse como y cuando se necesiten, permitiendo que la ejecución de los
clientes continúe localmente y en paralelo con la llamada al servidor.
48
13.4. Agrupaciones
Las agrupaciones son una alternativa al multiproceso simétrico (SMP) como método de proporcionar alto rendimiento y alta
disponibilidad y son particularmente atractivas para aplicaciones de servidor. Una agrupación se puede definir como un
grupo de computadores completos interconectados que trabajas juntos como un recurso de proceso unificado que puede
crear la ilusión de ser una máquina.
Cuatro ventajas que se pueden lograr con la agrupación son:
 Escalabilidad total: Es posible crear agrupaciones grandes que sobrepasen con creces las máquinas autónomas
más grandes. Una agrupación puede tener docenas o incluso cientos de máquinas, cada una en un
multiprocesador.
 Escalabilidad incremental: Una agrupación se configura de tal forma que es posible añadir sistemas nuevos a la
agrupación en pequeños incrementos. Así pues, un usuario puede empezar con un sistema modesto y ampliarlo a
medida que las necesidades crezcan.
 Alta disponibilidad: Puesto que cada uno de los nodos de una agrupación en un computador es autónomo, el fallo
de un nodo no implica la pérdida de servicio.
 Mejor relación rendimiento/precio: El uso de bloques de construcción adaptados, es posible aunar una agrupación
con una potencia de proceso igual o mayor que una máquina grande, a un precio mucho más bajo.
Métodos de agrupación
Método de agrupación
Espera pasiva
Descripción
Un servidor secundario
se hace cargo si falla el
servidor primario.
Ventajas
Sencillo de
implementar.
Secundaria activa
El servidor secundario
también se utiliza para
tareas de proceso.
Servidores separados
Los servidores
separados tienen sus
propios discos. Los
datos se copan
continuamente del
servidor primario al
secundario.
Los servidores están
conectados a los
mismos discos, pero
cada servidor tiene sus
propios discos. Si un
servidor falla, sus
discos pasan a estar a
cargo de otro servidor.
Múltiples servidores
comparten acceso
simultáneo a los discos.
El coste es reducido
porque los servidores
secundarios se pueden
utilizar para el proceso.
Alta disponibilidad.
Servidores conectados
a disco
Servidores
compartiendo discos
Limitaciones
Alto costo porque el
servidor secundario no
está disponible para
otras tareas de proceso.
Incremento de la
complejidad.
Incrementa la
sobrecarga en el
servidor y el uso de la
red debido a las
operaciones de copia.
Reduce la sobrecarga
en el servidor y el uso
de la red debido a la
eliminación de las
operaciones de copia.
Generalmente necesita
tecnología RAID o de
discos espejo para
compensar el riesgo de
un fallo de disco.
Baja la sobrecarga en el
servidor y uso de la red.
Reduce el riesgo de
caída por un fallo de
disco.
Requiere software de
gestión de bloqueos.
Normalmente se utiliza
con tecnología RAID o
discos espejo.
La espera pasiva generalmente no se denomina agrupación. El término agrupación se reserva para múltiples computadores
interconectados mientras mantienen la imagen externa de un solo sistema.
Conceptos de diseño de los sistemas operativos
Para una completa exploración de la configuración del hardware de una agrupación se necesitan algunas mejoras en un
sistema único.
Gestión de fallos
En general, para tratar los fallos se pueden seguir dos enfoques: Agrupaciones de alta disponibilidad y agrupaciones
tolerantes a fallos. Una agrupación de alta disponibilidad ofrece una alta probabilidad de que todos los recursos estén
siendo utilizados. Si se produce un fallo, como una caída del sistema o la pérdida de un volumen de disco, se pierden las
consultas en progreso. Cualquier consulta pedida, si se retoma, será atendida por un computador diferente de la
agrupación.
Una agrupación tolerante a fallos garantiza que los recursos siempre van a estar disponibles. Esto se logra mediante el uso
de discos compartidos redundantes y de mecanismos de respaldo para transacciones sin confirmar y transacciones
completadas confirmadas.
La función de intercambiar una aplicación y los datos de un sistema fallido por un sistema alternativo en una agrupación se
denomina resistencia a fallos.
Equilibrio de carga
Cuando se añade un nuevo computador a la agrupación, la función de equilibrio de carga debería incluir automáticamente
este computador en la planificación de aplicaciones.
Proceso paralelo
En algunos casos, el uso efectivo de una agrupación requiere ejecutar software desde una sola aplicación en paralelo. Se
presentan 3 enfoques para este problema:
49



Compilador paralelo: Un compilador paralelo determina, en tiempo de compilación, qué partes de la aplicación
pueden ejecutar en paralelo.
Aplicaciones paralelas: En este enfoque, el programador diseña la aplicación desde el principio para ejecutar en una
agrupación y utiliza el paso de mensajes para mover datos, cuando sea necesario, entre los nodos de la
agrupación.
Computador paramétrica: Este enfoque se puede utilizar si el centro de la aplicación es un algoritmo o programa
que debe ejecutarse muchas veces, cada vez con un conjunto diferente de condiciones o parámetros. Un buen
ejemplo es un modelo de simulación que ejecutará en muchos escenarios diferentes y generará resúmenes
estadísticos de los resultados. Para que este enfoque sea efectivo, se necesitan herramientas de procesamiento
paramétrico para organizar, ejecutar y gestionar los trabajos en el orden adecuado.
Capítulo 14
Gestión distribuida de procesos
14.1. Migración de procesos
La migración de procesos es la transferencia de una parte suficiente del estado de un proceso desde una máquina a otra
para que el proceso pueda ejecutar en la máquina de destino.
Motivación
La migración de procesos es deseable en los sistemas distribuidos por una serie de razones incluyendo las siguientes:
 Compartimiento de carga: Trasladando los procesos desde sistemas muy sobrecargados hacia otros menos
cargados, la carga puede equilibrarse y así mejorar el rendimiento global.
 Rendimiento de las comunicaciones: Los procesos que interactúan de forma intensiva pueden moverse a un mismo
nodo para reducir el costo de las comunicaciones durante su interacción. Además, cuando un proceso realiza un
análisis de datos sobre algún archivo o conjunto de archivos mayores que el tamaño del proceso, puede resultar
más ventajoso llevar el proceso hasta los datos que a la inversa.
 Disponibilidad: Los procesos que duran mucho tiempo pueden necesitar moverse para sobrevivir frente a los fallos
de los que se pueda obtener previo aviso o en prevención a una caída planificada.
 Utilización de capacidades especiales: Un proceso puede trasladarse para sacar partidote algunas capacidades del
hardware o software disponibles en un nodo determinado.
Mecanismos de migración de procesos
Hace falta considerar una serie de cuestiones a la hora de diseñar un servicio de migración de procesos. Entre ellas se
encuentran las siguientes:
 Inicio de la migración
 Que parte del proceso migra
 Que les ocurre a los mensajes y señales pendientes
Inicio de la migración
Quién inicia la migración dependerá del objetivo del servicio de migración. Si el objetivo es equilibrar la carga, algún módulo
supervisor de la carga del sistema operativo será normalmente el responsable de decidir cuándo tendrá lugar la migración.
Si el objetivo es llegar hasta unos recursos determinados, el proceso puede emigrar por sí mismo cuando surja la
necesidad.
¿Que migra?
Cuando un proceso migra, hace falta destruirlo en el sistema de origen y crearlo en el sistema de destino, Esto es un
movimiento de procesos y no una duplicación. Por lo tanto, debe moverse la imagen del proceso, que consta de, por lo
menos, el bloque de control de proceso. Además, debe actualizarse cualquier enlace entre éste y otros procesos, como los
de paso de mensajes y señales.
El movimiento del bloque de control del proceso es sencillo. Desde el punto de vista del rendimiento, la dificultad estriba en
el espacio de direcciones del proceso y en los archivos abiertos que tenga asignados. Considérese primero el espacio de
direcciones del proceso y supóngase que se está utilizando un esquema de memoria virtual. Se han considerado las
siguientes estrategias:
 Transferencia (completa): Transferir todo el espacio de direcciones en el momento de la migración. No hace falta
dejar un rastro del proceso en el sistema anterior. Sin embargo, si el especio de direcciones es muy grande y si es
probable que el proceso no necesite la mayor parte de él, este procedimiento puede ser costoso sin necesidad.
 Copia anticipada: El proceso continúa su ejecución en el nodo de origen mientras se copia el espacio de direcciones
en el nodo de destino.
 Transferencia (modificado): Transferir solo algunas páginas del especio de direcciones que están en la memoria
principal y han sido modificadas. Cualquier bloque adicional del espacio de direcciones virtuales se transferirá solo
bajo demanda.
 Copia por referencia: Es una variación de la transferencia (modificado) en que las páginas son desplazadas solo
cuando se las hace referencia.
 Volcado (flushing): Se eliminan las páginas del proceso de la memoria principal de origen, volcando al disco las
páginas modificadas. Posteriormente, se accede a cada página según se vayan necesitando, desde el disco en vez
de hacerlo desde la memoria del nodo origen. Este estrategia libera al origen de la necesidad de tener todas la
páginas del proceso que migra en la memoria principal.
50
Mensajes y señales
Sobre el destino de los mensajes y las señales pendientes, se puede tratar mediante un mecanismo de almacenamiento
temporal, durante la migración, de los mensajes y señales pendientes para, posteriormente, dirigirlos a su nuevo destino.
Negociación de la migración
Otro aspecto de la migración de procesos esta relacionado con la decisión de emigrar. En algunos casos, la decisión la
toma una única entidad. Por ejemplo, si se pretende equilibrar la carga, un módulo supervisará la carga relativa de varias
máquinas y llevará a cabo la migración, si es necesaria, para mantener la carga equilibrada. Si se usa automigración para
hacer que los procesos accedan a servicios espaciales o grandes archivos remotos, es el propio proceso el que puede
tomar la decisión. Sin embargo, algunos sistemas permiten que el destino designado participe en la decisión, entre otras
cosas para conservar el tiempo de respuesta a los usuarios. Un usuario de un puesto de trabajo, por ejemplo, puede sufrir
una degradación notable del tiempo de respuesta si hay procesos que migran al sistema del usuario, incluso si dicha
migración sirve para conseguir un mejor equilibrio global.
Desalojo
El proceso de negociación permite que un sistema destino rehace la migración de un proceso. Además, puede ser útil hacer
que un sistema desaloje un proceso que ha migrado hacia él. Por ejemplo, si un puesto de trabajo se activa, puede hacer
falta desalojar los procesos inmigrados para hacer un tiempo de respuesta apropiado.
Transferencias preferentes y no preferentes
La migración preferente de procesos, que consiste en la transferencia de un proceso parcialmente ejecutado o, al menos,
cuya creación se haya completado. Una función más simple es la transferencia no preferente, que involucra solamente a
procesos que no han comenzado su ejecución y en los que, por lo tanto, no se necesita transferir el estado del proceso.
14.2. Estados globales distribuidos
Estados globales e instantáneas distribuidas
No es posible que el sistema operativo o algún proceso conozcan el estado actual de todos los procesos del sistema
distribuido. Un proceso puede conocer solamente el estado actual de todos los procesos del sistema local, accediendo a los
bloques de control de proceso en la memoria. Para los procesos remotos, un proceso sólo puede conocer la información de
estado que recibe mediante mensajes, pero estos representan el estado del proceso remoto en algún instante pasado.
Para comprender la dificultad afrontada y poder formular una solución se van a definir los siguientes términos:
 Canal: Existe un canal entre dos procesos siempre que intercambien mensajes. Se puede pensar en un canal como
un camino o un medio por el que se transmiten los mensajes.
 Estado: El estado de un proceso es la secuencia de mensajes enviados y recibidos por los canales que llegan al
proceso.
 Instantánea: Una instantánea registra el estado de un proceso. Cada instantánea incluye un registro de todos los
mensajes enviados y recibidos por todos los canales desde la instantánea anterior.
 Estado global: El estado combinado de todos los procesos.
 Instantánea distribuida: Un conjunto de instantáneas, una para cada proceso.
El problema que se afronta es no poder determinar un estado global que por cierto, debido al lapso de tiempo asociado con
cada transferencia de un mensaje. Se puede intentar definir un estado global reuniendo instantáneas de todos los procesos.
Un estado global es consistente si para cada estado de un proceso que registra la recepción de un mensaje, el envío de
dicho mensaje ya está registrado en el estado del proceso que lo envió.
Algoritmos de instantáneas distribuidas
El algoritmo supone que los mensajes entregan en el mismo orden en que se envían y que no se producen perdidas de
mensajes. Un protocolo de transporte fiable (como TCP) cumple con estos requisitos.
14.3. Exclusión mutua distribuida
Conceptos de exclusión mutua distribuida
Para un uso con éxito de la concurrencia entre procesos, es necesaria la capacidad de definir secciones críticas y hacerlas
cumplir. Cualquier servicio o capacidad que proporcione soporte para la exclusión mutua debe cumplir los siguientes
requisitos:
1. la exclusión mutua debe hacerse cumplir: En un instante dado, sólo se deja entrar a un proceso en la sección
crítica, de entre todos los procesos que tengan secciones críticas para el mismo recurso u objeto compartido.
2. Un proceso que se detiene en su sección no crítica debe hacerlo no interferir en los otros procesos.
3. No debe ser posible que un proceso que solicite acceso a la sección crítica sea postergado indefinidamente:
ausencia de interbloqueo o inanición.
4. Cuando no haya ningún proceso en la sección crítica, se debe permitir entrar sin dilación a cualquiera que solicite la
entrada en su sección crítica.
5. No se deben hacer suposiciones sobre las velocidades relativas o el número de procesadores.
6. Un proceso permanece dentro de su sección crítica sólo durante un tiempo finito.
Los algoritmos de exclusión mutua pueden ser centralizados o distribuidos. En un algoritmo totalmente centralizado, se
desliga a un nodo como el nodo de control del acceso a todos los objetos compartidos. Cuando un proceso requiera el
acceso a un recurso crítico, emitirá una petición a su proceso local de control de recursos. Este proceso, a su vez, envía un
mensaje de petición al nodo de control, quien devuelve un mensaje de respuesta (permiso) cuando el objeto compartido
esta disponible. Cuando un proceso ha terminado con un recurso, se envía un mensaje de liberación al nodo de control.
Este algoritmo centralizado tiene dos propiedades básicas:
1. Sólo el nodo de control toma decisiones de asignación de recursos.
51
2. Toda la información necesaria se concentra en el nodo de control, incluyendo la identidad y ubicación de todos los
recursos, así como el estado de asignación de cada recurso.
Dicho esquema sufre de varios inconvenientes. Si el nodo de control falla, el mecanismo de exclusión mutua dejará de
funcionar, por lo menos temporalmente. Además, cada asignación y designación de recursos requiere un intercambio de
mensajes con el nodo de control. De esta forma, el nodo de control pude convertirse en un cuello de botella.
Debido a problemas de los algoritmos centralizados, se ha producido un mayor interés en el desarrollo de algoritmos
distribuidos. Un algoritmo completamente distribuido tiene las siguientes propiedades:
1. Todos los nodos disponen de una cantidad igual de información, por término medio.
2. Cada nodo dispone sólo de una representación parcial del sistema total y debe tomar decisiones basándose en esta
información.
3. Todos los nodos tienen igual responsabilidad en la decisión final.
4. Todos los nodos dedican igual esfuerzo, por término medio, en llevar a cabo una decisión final.
5. Un fallo de un nodo no provocará, en general el colapso total del sistema.
6. No existe reloj común a todo el sistema con el que regula el ritmo de los sucesos.
Ordenación de sucesos en un sistema distribuido
Un método conocido como registros de tiempo o marcas de tiempo, que sirve para ordenar los sucesos en un sistema
distribuido sin utilizar relojes físicos. Esta técnica es tan eficiente y efectiva que se usa en la gran mayoría de los algoritmos
de exclusión mutua e interbloqueo.
Para comenzar, hace falta optar por una definición del término suceso. En el fondo hay que preocuparse en las acciones
que se producen en un sistema local, como la entrada o salida de procesos de su sección crítica. Sin embargo, en un
sistema distribuido, la forma en que los procesos interactúan es mediante mensajes. Por lo tanto, parece lógico asociar los
sucesos con los mensajes. Un suceso local puede limitarse a un simple mensaje; por ejemplo un proceso puede enviar un
mensaje cuando desee entrar en su sección crítica o cuando salga de ella. Para evitar la ambigüedad, se asociarán los
sucesos sólo con el nuevo envío de mensajes, no con la recepción.
El esquema de marcas de tiempo tiene la finalidad de ordenar los sucesos consistentes en la transmisión de los mensajes.
Cada sistema i de la red mantiene un contador local C i, Que funciona como un reloj. Cada vez que un sistema transmita un
mensaje, incrementará el reloj.
Cola distribuida
El algoritmo se basa en los siguientes supuestos:
1. Un sistema distribuido de N nodos, numerados de forma única desde 1 hasta N. Cada nodo alberga un proceso que
hace peticiones de acceso mutuamente exclusivo a recursos de parte de otros procesos.
2. Los mensajes enviados desde un proceso a otro se reciben en el mismo orden en el que fueron enviados.
3. Cada mensaje se entrega correctamente a su destino dentro de un tiempo finito.
4. La red está totalmente conectada, lo que significa que cada proceso puede enviar directamente mensajes a
cualquier otro proceso sin necesidad de que un proceso intermedio pase el mensaje.
Para llevar a cabo el mismo algoritmo en un sistema distribuido, todos los nodos deben tener una copia de la misma cola.
Cuando un proceso desea entrar en su sección crítica, envía un mensaje de petición con marca de tiempo a todos los
demás procesos. Cuando reciba una respuesta de todos los demás, podrá entrar en su sección crítica. Cuando un proceso
reciba una petición de otro proceso deberá enviar en su momento la respuesta correspondiente. Si un proceso no desea
entrar en su sección crítica, envía una respuesta de inmediato. Si quiere entrar en su sección crítica, compara la marca de
tiempo de su petición con la de la última petición recibida y, si esta última es más reciente, aplazará su respuesta; en
cualquier otro caso se enviará una respuesta de inmediato.
Con este método hacen falta 2 X (N-1) mensajes (N-1) mensajes de petición para señalar la intención del proceso de entrar
en su sección crítica y (N-1) mensajes de respuesta para conceder el acceso solicitado.
Método del paso de testigo
Varios investigadores han propuesto un enfoque bastante diferente para la exclusión mutua que consiste en pasar un
testigo (token) entre los procesos participantes. El testigo es una entidad que un proceso retiene en cada instante dado. El
proceso que posee el testigo puede entrar en su sección crítica sin pedir permiso. Cuando el proceso abandona la sección
crítica pasa el testigo a otro proceso.
14.4. Interbloqueo distribuido
El interbloqueo es un bloqueo permanente de un conjunto de procesos que compiten por los recursos del sistema o se
comunican con otro. Esta definición es válida tanto en un sistema único como para un sistema distribuido. La gestión del
interbloqueo es complicada en un sistema distribuido porque no hay un nodo con el conocimiento exacto del estado actual
para todo el sistema y porque para cada transferencia de mensajes entre los procesos conlleva un retardo impredecible.
En la literatura se ha prestado atención a dos tipos de interbloqueo distribuido: los que surgen en la asignación de recursos
y los que aparecen con la comunicación de mensajes. En los interbloqueos de recursos, los procesos intentan acceder a los
recursos, como pueden ser los objetos de datos de una base de datos o los recursos de E/S de un servidor. El interbloqueo
se produce si cada proceso de un conjunto de procesos solicita un recurso retenido por otro proceso del conjunto. En los
interbloqueos de comunicaciones, los mensajes son los recursos por los que se esperan los procesos; el interbloqueo se
produce si cada proceso de un conjunto esperando un mensaje de otro proceso del conjunto y ningún proceso del conjunto
envía nunca el mensaje.
Interbloqueo en la asignación de recursos
Se dice que existe interbloqueo en la asignación de recurso sólo si se cumplen las todas las condiciones siguientes:
 Exclusión mutua: Sólo 1 proceso puede usar un recurso en un instante dado.
 Retención y espera: Un proceso puede utilizar unos recursos asignados mientras espera asignación de otros.
52


No apropiación: No pude quitarse a la fuerza ningún recurso a un proceso que lo está utilizando.
Círculo vicioso de espera: Existe una cadena cerrada de procesos tal que cada proceso utiliza, por lo menos, un
recurso necesario para el proceso siguiente de la cadena.
Prevención del interbloqueo
1. La condición del círculo vicioso de espera puede prevenirse definiendo una ordenación lineal de los tipos de
recursos. La principal desventaja de este método es que puede que los recursos no se pidan en el orden en que
son usados; por lo tanto, pude que los recursos sean retenidos más tiempo del necesario.
2. La condición de retención y espera puede prevenirse pidiendo a los procesos que todas las peticiones puedan
concederse simultáneamente. Este método no es eficiente por dos razones. En primer lugar, un proceso puede
verse interrumpido durante mucho tiempo esperando a que todas sus peticiones de recursos se concedan, cuando
de hecho, podría haber continuado con sólo algunos recursos. En segundo lugar, los recursos asignados a un
proceso pueden permanecer sin usar por un periodo considerable, tiempo durante el cual se deniegan a otros
procesos.
Predicción del interbloqueo
La predicción del interbloqueo es una técnica en la que se toma una decisión dinámicamente sobre si una petición dada de
asignación de un nuevo recurso podría conducir, si se concediese, a un interbloqueo. La predicción distribuida del
interbloqueo es poco práctica por las siguientes razones:
1. Cada nodo debe guardar constancia del estado global del sistema.
2. El proceso de inspección de un estado global seguro debe hacerse con exclusión mutua. En otro caso, dos nodos
podrían tener en cuenta peticiones de un recurso por parte de procesos diferentes y llegar concurrentemente a la
conclusión de que es seguro conceder la petición, cuando en realidad, si se conceden ambas peticiones, se
producirá interbloqueo.
3. Inspeccionar los estados seguros implica un proceso extra considerable en un sistema distribuido con un gran
número de procesos y recursos.
Detección del interbloqueo
Con detección del interbloqueo, se permite a los procesos obtener los recursos libres cuando deseen y después se
determina la existencia de un interbloqueo. Si se detecta un interbloqueo, se selecciona uno de los procesos integrantes y
se le pide que libere los recursos necesarios para deshacer el interbloqueo.
La dificultad de la detección distribuida de interbloqueos es que cada nodo sólo conoce sus propios recursos, mientras que
el interbloqueo puede involucrar a recursos distribuidos.
Con el control centralizado, un nodo es responsable de la detección del interbloqueo. Como el proceso central tiene una
representación completa, está en posición de detectar interbloqueos. Este método necesita muchos mensajes y es
vulnerable a fallos en el nodo central.
Con un control jerárquico, los nodos están organizados en una estructura en árbol, con un nodo actuando como la raíz del
árbol. En cada nodo que no sea una hoja, se reúne información sobre la asignación de recursos de todos los nodos
dependientes. Esto permite detectar interbloqueos en niveles inferiores al nodo raíz.
Con un control distribuido, todos los procesos cooperan en la detección de interbloqueos.
Interbloqueo en la comunicación de mensajes
Espera mutua
Se produce interbloqueo en la comunicación de mensajes cuando cada uno de los procesos de un grupo de procesos está
esperando un mensaje de otro miembro del grupo y no hay mensajes en camino.
En términos gráficos, hay una diferencia entre el interbloqueo de mensajes y el interbloqueo de recursos. En el interbloqueo
de recursos, se produce interbloqueo cuando hay un bucle cerrado o un ciclo en el gráfico que representa las dependencias
de los procesos. En el caso de los recursos, un proceso depende de otro si el último emplea un recurso que el primero
necesita.
En el interbloqueo de mensajes, la condición de interbloqueo es que todos los sucesores de cualquier miembro del conjunto
S estén asimismo en S; es decir, el grafico de S es un nudo.
En la primera figura P1 esta esperando un mensaje de p2 o de p5; p5 no esta esperando ningún mensaje así que puede
enviar un mensaje a p1, que por lo tanto, es liberado. Como resultado, los enlaces (p1, p5) y (p1,p2) se eliminan. En la
segunda figura se añade la dependencia: p5, está esperando un mensaje de p2, quien está esperando un mensaje de p3,
quien está esperando un mensaje de p1, quien está esperando un mensaje de p2. Ahora se da el interbloqueo.
P1
p2
p4
P1
p5
p2
p4
p3
p5
p3
No disponibilidad de buffers de mensajes
El interbloqueo directo por almacenamiento y reenvío, que puede producirse si un nodo de conmutación de paquetes utiliza
una reserva común de buffers desde donde son asignados a los paquetes bajo demanda.
El interbloqueo directo por almacenamiento y reenvío, puede impedirse si no se permite que todos los buffers acaben
dedicados a un único enlace. Empleando buffers separados de tamaño fijo, uno por cada enlace, se logrará este
impedimento.
Una forma más sutil de interbloqueo, el interbloqueo indirecto por almacenamiento y reenvío. Para cada nodo, la cola
dirigida al nodo adyacente en una dirección está llena de paquetes destinados al nodo más allá del siguiente. Una forma
simple de impedir este tipo de interbloqueo es emplear una reserva estructurada de buffers.
53
Capítulo 15
Seguridad
15.1. Amenazas a la seguridad
La seguridad de computadoras y redes aborda los siguientes cuatro requisitos:
 Secreto: Exige que la información de un sistema de computadoras sea accesible para lectura solamente por partes
autorizadas.
 Integridad: Exige que los elementos de un sistema de computadores puedan ser modificados sólo por partes
autorizadas.
 Disponibilidad: Exige que los elementos de un sistema de computadores estén disponibles para las partes
autorizadas.
 Autenticidad: Requiere que un sistema de computadores sea capaz de verificar la identidad de un usuario.
Tipos de amenazas
 Interrupción: Se destruye un elemento del sistema. Este es un ataque a la disponibilidad. Como ejemplo se incluyen
la destrucción de una pieza del hardware, como un disco duro, el corte de una línea de comunicaciones o la
inutilización del sistema de gestión de archivos.

Interceptación: Una parte no autorizada consigue acceder a un elemento. Este es un ataque al secreto. La parte no
autorizada puede ser una persona, un programa o un computador. Como ejemplos se incluyen la intervención de
las conexiones telefónicas para conseguir datos de una red y la copia ilícita de archivos y programas.

Modificación: Una parte no autorizada no sólo consigue acceder, sino que falsifica un elemento. Este es un ataque a
la integridad. Como ejemplos se incluyen el cambio de valores en un archivo de datos.

Fabricación: Una parte no autorizada inserta objetos falsos en el sistema. Este es también un ataque a la
autenticidad. Como ejemplos se incluyen la inserción de mensajes falsos en una red o la adición de registros a un
archivo.
Elementos de un sistema de computadores
Hardware
La amenaza principal de un sistema de computadores se produce en el campo de la disponibilidad. El hardware es el más
vulnerable a los ataques y el menos flexible a los controles automatizados. Las amenazas comprenden daños accidentales
y deliberados a los equipos, así como el hurto.
Software
La amenaza principal al software es la disponibilidad. El software, en especial el de aplicaciones, es asombrosamente fácil
de eliminar. El software puede ser alterado o dañado para inutilizarlo. Una gestión cuidadosa de la configuración del
software, que incluye la realización de copias de reserva de las versiones más recientes, puede mantener una alta
disponibilidad. Un problema más difícil de afrontar es la modificación del software que provoca que un programa siga
funcionando pero se comporte de forma diferente que antes. Los virus informáticos y ataques afines caen dentro de esa
categoría. Un último problema es el secreto de software. Aunque existen ciertas contramedidas, por lo general el problema
de la copia no autorizada de software no se ha resuelto.
Datos
El interés por la seguridad con respecto a los datos es amplio, abarcando la disponibilidad, el secreto y la integridad. En el
caso de la disponibilidad, la preocupación es la destrucción de los archivos de datos, lo que puede ocurrir accidentalmente o
como consecuencia de una mala intención.
La preocupación obvia del secreto es, por supuesto, la lectura no autorizada de archivos o bases de datos.
Finalmente, la integridad de los datos es una preocupación fundamental de la mayor parte de las instalaciones. Las
modificaciones de archivos de datos pueden tener consecuencias desde poco trascendentes a desastrosas.
54
Redes y líneas de comunicaciones
Las amenazas pasivas son el género de las escuchas a escondidas o control de las trasmisiones. El objetivo del agresor es
obtener información que se esté transmitiendo. Entran en juego aquí 2 tipos de amenazas: la revelación del contenido de los
mensajes y el análisis del tráfico.
Las amenazas pasivas son muy difíciles de detectar porque no acarrean alteración alguna de los datos. Sin embargo, es
factible impedir que estos ataques tengan éxito.
En la segunda clase principal de amenazas se encuentran las amenazas activas, que suponen alteraciones del flujo de
datos o la creación de un flujo falso.
Una suplantación tiene lugar cuando una entidad finge ser una entidad diferente. El ataque por suplantación generalmente
influye alguna de las otras formas de ataques activos. Dichos ataques pueden tener lugar, por ejemplo, capturando y
repitiendo una secuencia de autentificación después de que una autenticación válida de secuencias haya tenido lugar.
La repetición incluye la captura pasiva de un dato único y la subsiguiente retransmisión para producir un efecto no
autorizado.
La modificación de mensajes simplemente significa que se modifica una porción de un mensaje legítimo o que los mensajes
se retrasan o se reordenan para conseguir un efecto no autorizado.
La privación de servicio impide o inhibe el uso normal o la gestión de servicio de comunicaciones.
15.2. Protección
La capacidad de compartir recursos introdujo la necesidad de protección. Un sistema operativo puede ofrecer protección en
el siguiente abanico:
 Ninguna protección
 Aislamiento: Este enfoque implica que cada proceso opera separadamente de los demás, sin compartimiento ni
comunicación.
 Compartir todo o nada: El propietario de un objeto lo declara como público o privado.
 Compartir por limitación del acceso: El sistema operativo comprueba la licencia de cada acceso de usuario
específico a un objeto específico.
 Compartir por capacidades dinámicas: Este tipo de protección amplía el concepto de control de acceso,
incorporando a la creación dinámica de derechos de comportamiento para los objetos.
 Uso limitado de un objeto: Esta forma de protección limita no sólo el acceso a un objeto, sino también el uso a que
se puede dedicar dicho objeto.
Protección de la memoria
En un entorno de multiprogramación, la protección de memoria principal es fundamental. El interés no es sólo de la
seguridad, sino también el funcionamiento correcto de los diversos procesos que estén activos. Si un proceso puede escribir
inadvertidamente en el espacio de memoria de otro proceso, este último puede que no se ejecute correctamente.
Control de acceso orientado al usuario
Las medidas tomadas para controlar el acceso en los sistemas de proceso de datos pueden encuadrarse en dos categorías:
las asociadas con el usuario y las asociadas con los datos.
La técnica más habitual de control de acceso al usuario en un sistema de tiempo compartido en un servidor es la conexión
del usuario, que requiere un identificador de usuario y una contraseña.
Control de acceso orientado a los datos
Después de una conexión con éxito, al usuario se le habrá concedido el acceso a uno o más servidores y aplicaciones. Esto
no suele ser suficiente en un sistema que incluya datos sensibles en su base de datos. Mediante el procedimiento de control
de acceso al usuario, el sistema puede identificar a un usuario. Asociado con cada usuario, puede haber un perfil de usuario
que especifique las operaciones y los accesos a archivos permisibles.
Un modelo general de control de acceso ejercido por un sistema gestor de archivos o bases de datos es el de una matriz de
acceso. Los elementos básicos del modelo son los siguientes:
 Sujeto: Una entidad capaz de acceder a los objetos.
 Objetos: Cualquier cosa cuyo acceso debe controlarse.
 Derecho de acceso: La manera en que un sujeto accede a un objeto. Como ejemplos están Leer, Escribir y
Ejecutar.
15.3. Intrusos
Una de las 2 amenazas más conocidas a la seguridad es el intruso, conocido en general como pirata informático (hacker).
Se identificaron 3 clases de intrusos:
 Suplantador: Un individuo que no está autorizado a usar el computador y que penetra en un sistema de control de
acceso para explotar una legítima entrada de usuario.
 Abusador: Un usuario legítimo que accede a datos, programas o recursos a los que no está autorizado, o que está
autorizado pero hace mal uso de sus privilegios.
 Usuario clandestino: Un individuo que está a cargo del control de supervisión del sistema y utiliza este control para
evadir la auditoria y el control de acceso o para suprimir la recopilación de datos auditados.
Técnicas de intrusión
El archivo de contraseñas puede protegerse de 2 maneras:
 Cifrado unidireccional: El sistema almacena las contraseñas de los usuarios de forma cifrada solamente. Cuando un
usuario presenta una contraseña, el sistema cifra dicha contraseña y la compra con el valor almacenado.
 Control de acceso: El acceso al archivo de contraseñas está limitado a una o muy pocas cuentas.
55
Protección de contraseñas
La contraseña sirve para autentificar el ID del individuo que se conecta al sistema. A su vez, el ID introduce seguridad en los
siguientes sentidos:
 El ID determina si el usuario está autorizado para obtener acceso al sistema. En algunos sistemas, sólo se permite
acceder a aquellos que ya tienen un ID registrado en el sistema.
 El ID determina los privilegios que corresponden al usuario.
 El ID se emplea en lo que se conoce como control de acceso discrecional.
La vulnerabilidad de las contraseñas
Para comprender la naturaleza de los ataques, se va a examinar un esquema muy utilizado en los sistemas UNIX, donde
las contraseñas nunca se almacenan sin cifrar. Más bien, se emplea el siguiente procedimiento: Cada usuario elige una
contraseña hasta 8 caracteres imprimibles de longitud. Ésta se convierte a un valor de 56 bits (empleando ASCII de 7 bits)
que sirve como entrada clave a una rutina de cifrado. La rutina de cifrado, llamada crypt, esta basada en el algoritmo
Estándar de Cifrado de Datos (DES, Data Encryption Standard). El algoritmo DES se modifica mediante un valor semilla de
12 bits. Normalmente, este valor está relacionado con el momento en que se asigna la contraseña al usuario. El algoritmo
DES modificado se ejecuta con una entrada de datos consistente en un bloque de ceros de 64 bits. La salida del algoritmo
sirve como una entrada para un segundo cifrado. Este proceso se repite por un total de 25 cifrados. La salida de 64 bits
resultante se traduce entonces a una secuencia de 11 caracteres.
La semilla sirve para tres fines:
 Impide que las contraseñas duplicadas sean visibles en el archivo de contraseñas. Aun cuando dos usuarios elijan
la misma contraseña, dichas contraseñas serán asignadas en momentos diferentes. Entonces, las contraseñas
ampliadas de los dos usuarios serán diferentes.
 Aumenta de forma efectiva la longitud de las contraseñas sin que haga falta que el usuario recuerde dos caracteres
adicionales.
 Impide el uso de una implementación del DES en el hardware que facilitaría la dificultad de un ataque de
adivinación por fuerza bruta.
Así pues, hay dos amenazas al esquema de contraseñas de UNIX. Primero, un usuario puede obtener acceso a una
maquina mediante una cuenta de invitado o por otros medios y después, ejecutar un programa de adivinación de
contraseñas, denominado averiguador de contraseñas (password cracker) en dicha máquina. El atacante debe ser capaz de
comprobar cientos y, quizás, miles de contraseñas posibles con poco consumo de recursos. Además, si un adversario es
capaz de obtener una copia del archivo de contraseñas, se podrá ejecutar un programa averiguador en otra máquina a
placer. Esto habilita al adversario para probar muchos centenares de contraseñas posibles en un tiempo razonable.
Control de acceso
Una manera de frustrar un ataque a las contraseñas es denegar al adversario el acceso al archivo de contraseñas. Si la
parte del archivo con las contraseñas cifradas es accesible sólo para un usuario privilegiado, el adversario no podrá leerlas
sin conocer la contraseña del usuario privilegiado. Existen varios defectos en esta estrategia:
 Muchos sistemas, incluyendo la mayoría de los sistemas UNIX, son susceptibles de robos no previstos. Una vez
que un atacante ha conseguido acceder por algún medio, puede querer obtener una colección de
contraseñas para utilizar cuentas diferentes en sesiones de conexión diferentes y así disminuir el riesgo de
detección.
 Un percance en la protección podría revertir en que el archivo de contraseñas fuese legible, comprometiendo así a
todas las cuentas.
 Algunos usuarios disponen de cuentas en otras máquinas de otros dominios de protección donde utilizan la misma
contraseña. Por lo tanto, si las contraseñas pudieran ser leídas en una máquina, comprometería a las maquinas de
otras ubicaciones.
Estrategias de elección de contraseñas
Si se deja a los usuarios que se las arreglen por sí solos, muchos elegirían una contraseña demasiado corta o demasiado
fácil de adivinar. En el otro extremo, si se les asignan contraseñas a los usuarios que consten de 8 caracteres imprimibles
seleccionados aleatoriamente, la averiguación de las contraseñas es prácticamente imposible. Pero también será casi
imposible que la mayoría de los usuarios recordasen sus contraseñas. Afortunadamente, aunque limitemos el universo de
contraseñas de cadenas de caracteres que sea razonablemente memorizables, el tamaño del universo sigue siendo
demasiado grande como para permitir averiguación práctica de contraseñas. El objetivo es, entonces, eliminar las
contraseñas adivinables a la vez que se permite a los usuarios elegir una contraseña recordable. Para ello se pueden
utilizar cuatro técnicas básicas:
 Formación del usuario: Se pueden comentar a los usuarios la importancia de emplear contraseñas difíciles de
adivinar y se les pueden dar directrices para elegir contraseñas fuertes
 Contraseñas generadas por el computador: Presentan problemas si las contraseñas son de naturaleza bastante
aleatoria porque los usuarios pueden no ser capaces de recordarlas.
 Inspección reactiva de contraseñas: Es aquella en la que el sistema ejecuta periódicamente su propio averiguador
de contraseñas para encontrar contraseñas adivinables. El sistema cancela toas las contraseñas que se adivinen y
se lo notifica al usuario. Esta táctica presenta una serie de inconvenientes. En primer lugar, si el trabajo se hace
correctamente, se consumen muchos recursos. Además cualquier contraseña existente es vulnerable hasta que el
inspector reactivo de contraseñas la encuentre.
 Inspección proactiva de contraseñas: En este esquema al usuario se le permite elegir su propia contraseña. Sin
embargo, en el momento de la selección, el sistema comprueba si la contraseña es permisible y, si no lo es, la
rechaza.
56
Detección de intrusiones
Inevitablemente, hasta los mejores sistemas de prevención de intrusos pueden fallar. Una segunda línea de defensa es la
detección de los intrusos, que ha sido objeto de muchas investigaciones en los últimos años. Este interés viene motivando
por una serie de consideraciones, entre las que se incluyen las siguientes:
1. Si se detecta un intruso suficientemente pronto, éste podrá ser identificado y expulsado del sistema antes de que
haga algún daño o comprometa determinados datos.
2. Un sistema eficaz de detección de intrusos puede servir como medida disuasiva, obrando también como prevención
de intrusiones.
3. La detección de intrusos facilita el conjunto de información sobre las técnicas de intrusión que pueden reforzar el
servicio de prevención de intrusos.
La detección de intrusos se basa en el supuesto de que el comportamiento del intruso se diferencia del comportamiento del
usuario legítimo en formas que pueden cuantificarse. Obviamente no se pueden esperar que haya una distinción radical y
exacta entre los ataques de los intrusos y el uso normal de los recursos que hace un usuario autorizado.
Las técnicas de detección de intrusos pueden ser:
1. Detección de anomalías de estadísticas: Este método supone la recolección de datos del comportamiento de los
usuarios legítimos durante un período de tiempo. Después se aplican pruebas estadísticas al comportamiento
observado para determinar, con un alto grado de confianza, si los comportamientos no son de usuarios legítimos.
2. Detección basada en reglas: Este método supone el intento de definir un conjunto de reglas que pueden emplearse
para decidir si un comportamiento dado es el de un intruso.
Una herramienta fundamental para la detección de intrusiones es un registro de auditoria. Debe conservarse algún registro
de actividades en curso por parte de los usuarios como entrada al sistema de detección de intrusiones. Básicamente, se
utilizan dos planes:
 Registros de auditoria nativos: casi todos los sistemas operativos multiusuario ya incorporan un software de
contabilidad que reúne información sobre la actividad de los usuarios.
 Registros de auditoria específicos para la detección: se puede implementar un servicio de recopilación que genere
registros de auditoria que contenga sólo aquella información que sea necesaria para el sistema de detección de
intrusiones.
15.4. Software maligno
Los tipos de ataque más sofisticados a los sistemas informáticos son los presentados por programas que se aprovechan de
los puntos vulnerables de los mismos.
Frecuentemente, camuflado dentro de programas legítimos o suplantaciones.
Programas malignos
Estas amenazas pueden dividirse en dos categorías: aquellas que necesitan un programa anfitrión y las que son
independientes.
Se pueden distinguir entre las amenazas de software que no se reproducen y las que lo hacen.
Las primeras son fragmentos de programas que se activan cuando se invoca al programa anfitrión para realizar una función
determinada. Las segundas consisten en un fragmento de programa (virus) o un programa independiente (gusanos o
bacterias).
Trampillas (Traps)
Una trampilla es un punto de entrada secreto a un programa que permite a alguien que la conozca conseguir el acceso sin
pasar por los procedimientos usuales de seguridad de acceso.
El programador también puede querer asegurarse que hay un método para activar el programa en el caso de que algo vaya
mal en el procedimiento de alguna secuencia de entrada especial o que se activa al ser ejecutado por un cierto ID de
usuario o mediante una secuencia improbable de sucesos.
Bomba lógica
La bomba lógica es un código incrustado en algún programa legítimo que explota cuando se cumplen ciertas condiciones.
Caballos de Troya
Un caballo de Troya es un programa o un procedimiento útil o aparentemente útil que contiene un código oculto que,
cuando se invoca, lleva a cabo alguna función dañina o no deseada.
Virus
Un virus es un programa que puede infectar a otros programas, alterándolos; la alteración incluye una copia del programa
de virus, que puede entonces seguir infectando a otros programas.
Gusanos
Los programas de gusanos de la red emplean las conexiones de la red para extenderse de un sistema a otro.
Para reproducirse, un gusano de red utiliza algún tipo de vehiculo de la red. Como ejemplos se tienen los siguientes:
 Servicio de correo electrónico: El gusano divulga una copia de sí mismo a través del correo a otros sistemas.
 Capacidad de ejecución remota: El gusano ejecuta una copia una copia de sí mismo en otro sistema.
 Capacidad de conexión remota: El gusano se conecta a un sistema remoto como un usuario y después emplea
órdenes para copiarse propagándose de la misma manera.
La nueva copia del programa del gusano se ejecuta después en el sistema remoto donde, además de realizar cualquier
función, continúa propagándose de la misma manera.
Como con los virus, los gusanos de red son difíciles de contrarrestar.
Zombies
57
Un zombie es un programa que secretamente toma posesión de otro computador conectado a Internet y le usa para lanzar
ataques que hacen difícil detectar a su creador. Los zombies se utilizan en ataques de denegación de servicios,
normalmente contra sitios Web objetivo. El zombie se instala en cientos de computadoras perteneciente a terceras partes
no sospechosas y, entonces, suele sobrecargar el sitio Web objetivo lanzando una excesiva carga de tráfico de red.
La naturaleza de los virus
Un virus puede hacer cualquier cosa que hagan otros programas. La única diferencia es que se acopla a otro programa y se
ejecuta de forma oculta cada vez que se ejecuta el programa anfitrión.
Durante su vida, un virus típico pasa por las siguientes cuatro etapas:
 Fase latente: El virus está inactivo. El virus se activará finalmente por algún suceso.
 Fase de propagación: El virus hace copias idénticas a él en otros programas o en ciertas áreas del sistema del
disco.
 Fase de activación: El virus se activa para llevar a cabo la función para la que está pensado.
 Fase de ejecución: Se lleva a cabo la función. La función puede ser no dañina, como dar un mensaje por la pantalla,
o dañina, como al destrucción de archivos de programas y datos.
Tipos de virus
 Virus parásitos: Un virus parásito se engancha a archivos ejecutables y se reproduce.
 Virus residentes en la memoria: Se alojan en la memoria principal como parte de un programa del sistema
residente. Desde entonces, el virus infecta todos los programas que se ejecutan.
 Virus del sector de arranque: Infecta el sector principal de arranque o sector de arranque y se propaga cuando el
sistema arranca desde el disco que contiene el virus.
 Virus clandestino: Una forma de virus diseñado explícitamente puede esconderse de la detección mediante un
software antivirus.
 Virus polimorfo: Un virus que muta con cada infección, haciendo imposible, la detección por la firma del virus.
Virus de macros
Los virus de macro son particularmente agresivos por una serie de razones:
1. Un virus de macro es independiente de la plataforma.
2. Los virus de macro infectan documentos, no trozos de código ejecutable.
3. Los virus de macro se extienden fácilmente. Un método muy común es a través del correo electrónico.
Los virus de macro sacan partido de una característica de Word y otras aplicaciones de oficina, como Microsoft Excel,
llamada macros. En esencia, una macro es un programa ejecutable incrustado en un documento de procesador de texto u
otro tipo de archivo.
Lo que hace posible la creación de virus de macro son las macros autoejecutables.
Métodos antivirus
La solución ideal para la amenaza de los virus es la prevención: En primer lugar, no permite que los virus entren en el
sistema.
El siguiente mejor método es ser capaz de hacer lo siguiente:
 Detección: Una vez que se ha producido la infección, determinar que ha tenido lugar y localizar el virus.
 Identificación: Una vez que se ha logrado la detección, identificar el virus específico que ha infectado el programa.
 Eliminación: Una vez que se ha identificado el virus específico, elimina todo rastro del virus del programa infectado y
reponerlo en su estado original. Eliminar el virus de todos los sistemas infectados, de forma que la plaga no puede
extenderse más.
Descifrado genérico
La tecnología de descifrado genérico (GD, Generic Decryption) permite al programa de antivirus detectar de forma sencilla
los virus polimorfos más complejos manteniendo velocidades de búsquedas rápidas. Se debe recalcar que, cuando se
ejecuta un archivo que contiene un virus polimorfo, el virus debe descifrarse asimismo para activarse.
Al comienzo de cada simulación, el emulador interpreta las instrucciones del código objetivo de una en una. Así, si el código
incluye una rutina de descifrado que decodifique y, por lo tanto, desenmascare el virus, se interpreta este código.
Sistemas de inmunización digital
Este sistema expande el uso de la emulación de programas visto en el subapartado anterior y ofrece un sistema de
detección de virus y emulación de propósito general. El objetivo de este sistema es proporcionar un tiempo de respuesta
rápido para destruir a los virus prácticamente cuando se introduzcan. Cuando un nuevo virus entra en una organización, el
sistema de inmunización lo captura inmediatamente, lo analiza, crea un mecanismo de detección y una defensa ante él, lo
elimina y pasa la información sobre el virus a los sistemas que ejecutan el antivirus de IBM para que puedan detectarlo
antes de que puedan ejecutarse en otra parte.
Virus de correo electrónico
Los últimos desarrollos del software malicioso son los virus de correo electrónico. Los virus se propagan tan pronto como se
activan (bien abriendo un archivo adjunto a un correo electrónico o bien abriendo el correo) a todas las direcciones de
correo electrónico conocidas en la máquina infectada.
15.5. Sistemas de confianza
Cuando se definen varias categorías o niveles de datos, el requisito se conoce como seguridad multinivel. El enunciado
general del requisito de seguridad multinivel es que un sujeto de un nivel superior no puede transmitir información a un
sujeto de un nivel inferior o no comparable a menos que el flujo de información refleje exactamente el deseo de un usuario
autorizado. Un sistema seguro multinivel debe cumplir con lo siguiente:
58

No leer arriba: Un sujeto puede leer un objeto sólo de un nivel de seguridad menor o igual. Esto se conoce como
propiedad de seguridad simple.
 No escribe abajo: Un sujeto puede escribir un objeto sólo de un nivel de seguridad mayor o igual. Esto se conoce
como propiedad estrella.
Para un sistema de proceso de datos, el método que ha adoptado y que ha sido objeto de muchas investigaciones y
desarrollo se basan en el concepto de monitor de referencia. El monitor de referencia es un elemento de control de
hardware y el sistema operativo de un computador regula el acceso de los sujetos a los objetos en función de unos
parámetros de seguridad de sujeto y del objeto. El monitor de referencia tiene acceso a un archivo conocido como base de
datos de seguridad del núcleo, que enumera los privilegios de acceso (credencial de seguridad) de cada sujeto y los
atributos de protección (nivel de clasificación) de cada objeto. El monitor de referencia hace valer las reglas de seguridad
(no leer arriba, escribir abajo) y tiene las propiedades siguientes:
 Mediación completa: Las reglas de seguridad se aplican en todos los accesos
 Aislamiento: El monitor de referencia y la base de datos están protegidos de modificaciones no autorizadas
 Verificabilidad: La corrección del monitor referencia debe ser comprobable.
Un elemento final es el archivo de auditoria. Los sucesos importantes de seguridad, como las violaciones de seguridad que
se detecten y los cambios autorizados de la base de datos de seguridad del núcleo, se guardan en el archivo de auditoria.
Defensa contra caballos de Troya
Una forma de asegurarse contra los ataques de los caballos de Troya es el empleo de un sistema operativo seguro y de
confianza.
Se asignan niveles de seguridad a los sujetos en la conexión, en función de criterios como el Terminal desde el que se
accede al computador y el usuario involucrado, identificado por su ID/contraseña,
59