You are on page 1of 51

51608191.

docx

1 Esquema Básico
Una computadora debe estar formada por:
- Procesador
- Memoria
- Componentes de E / S
Procesador.- Controla la operación de la computadora y ejecuta sus funciones de procesamiento de datos.
Memoria principal.- Almacena datos y programas. Es típicamente volátil; se le conoce como memoria real o
memoria primaria.
Módulos de E / S.- Mueven datos entre la computadora y su ambiente externo, esto incluye:
- Dispositivos de memoria secundaria.
- Equipo de comunicaciones.
- Terminales.
Interconexión del sistema.- Una parte de la estructura y mecanismos que proporcionan comunicación entre
procesadores, memoria principal y módulos de E / S.

2. Términos de Hardware y Software


Compaginación del almacenamiento. Su función es para acelerar el acceso al almacenamiento primario.
Coloca localidades de memoria adyacentes en diferentes bancos de almacenamiento, de manera que puedan
estar en curso varias referencias al mismo tiempo.
Registro de relocalización. Permite relocalizar de forma dinámica los programas. La dirección base de un
programa en la memoria principal se sitúa en el registro de relocalización.
Escrutinio. Es una técnica para permitir que una unidad verifique el estado de otra unidad de funcionamiento
independiente.
Interrupciones. Evento que altera la secuencia normal de ejecución de un programa.
Buffer. Es un área de almacenamiento primario, destinada a contener datos durante la transferencia de
entrada / salida. Buffer simple, el canal deposita datos en el buffer, el procesador procesa estos datos, el canal
deposita nuevos datos, etc. Mientras el canal deposite datos no puede tener lugar ningún procesamiento de esos
datos; mientras los datos están siendo procesados no pueden ser depositados datos adicionales. Un sistema de
buffer doble permite la sobreposición de las operaciones de entrada / salida con el procesamiento; mientras el
canal esta depositando datos en un buffer, el procesador puede estar procesando los datos del otro buffer.
Dispositivos periféricos. Equipos de entrada / salida y almacenamiento. En el caso de almacenamiento
Permiten almacenar de grandes cantidades de información fuera del almacenamiento primario del computador.
Los discos son dispositivos de acceso directo, que permiten hacer referencia a grupos de datos individuales sin
necesidad de buscar en orden a través de todos los grupos de datos del disco.
Protección del almacenamiento. Limita el número de direcciones que un programa puede referenciar. La
protección del almacenamiento puede ser implementada por medio de registros de límites, los cuales define las
direcciones superior e inferior del bloque de almacenamiento.

1
51608191.docx
Un temporizador de intervalos es útil en sistemas de usuarios múltiples para prevenir que un solo usuario
monopolice un procesador.
Un reloj horario provee los medios para que el computador pueda hacer un seguimiento de la hora del reloj
de pared.
Algunos dispositivos periféricos están equipados para operación en línea, en la cual están conectados al
procesador, o para operación fuera de línea, en la cual son manejados por unidades de control que no están
conectadas al sistema computacional central.
Mientras estaba en marcha la entrada/salida, los procesadores estaban incapacitados por su manejo. Un
importante adelanto para modificar esta situación fue el desarrollo de los canales de entrada/salida. Un canal es
un sistema computacional de propósito especial, dedicado al maneo de la entrada/salida con independencia del
procesador principal. Un canal puede tener acceso directo al almacenamiento principal para almacenar o
recuperar información.
Un punto de conflicto entre los canales y el procesador esta en el acceso al almacenamiento primario. Como
no puede estar en marcha más que un solo acceso de cada vez, se da prioridad a los canales. Esto se llama robo de
ciclo; los canales, literalmente, roban ciclos al procesador. Los canales utilizan sólo un pequeño porcentaje de
ciclos, pero al recibir la prioridad de esta manera, se consigue una mejor utilización de los dispositivos de
entrada/salida.
Al hacerse evidente la necesidad de almacenamientos primarios mayores, la arquitectura de los computadores
se modificó para acomodar una capacidad muy grande direcciones. Para obtener grades capacidades de
direcciones, los sistemas utilizan direccionamiento de base más desplazamiento, en las cuales todas las direcciones
son añadidas al contenido de un registro base. Este esquema tiene la ventaja adicional de hacer a los programas
independientes de la localización, una propiedad particularmente valiosa para programas dentro de ambientes de
usuarios múltiples, en los cuales un programa puede necesitar se situado en diferentes localizaciones de
almacenamiento primario cada vez que es cargado.
Los sistemas computacionales suelen tener varios estados de ejecución. Para programas de usuarios, el
subconjunto de instrucciones que éste puede ejecutar en estado de problema impide, por ejemplo, la ejecución
directa de instrucciones de entrada/salida. En general, el sistema operativo corre con la categoría de usuario de
mayor confianza en un estado supervisor o modo kernel; tiene acceso a todas las instrucciones del conjunto de
instrucciones del a máquina. Los compiladores e interpretes corren en modo usuario.
Instrucciones privilegiadas, aquellas instrucciones a las que no se tiene acceso en estado de problema.
Los sistemas de almacenamiento virtual permiten a los programas referenciar direcciones que no necesitan
corresponder con las direcciones reales disponibles en el almacenamiento primario. Las direcciones virtuales
desarrolladas por los programas en ejecución son traducidas dinámicamente por el hardware a las direcciones de
instrucciones y datos del almacenamiento principal.
En los sistemas de multiprocesamiento varios procesadores comparten un almacenamiento primario común y
un solo sistema operativo. El multiprocesamiento crea las posibilidades de cierto tipo de conflictos que no se
presentan en sistemas de un solo procesador. Es necesario secuencializar el acceso a una localización de
almacenamiento compartido de manera que dos procesadores no intente modificarla al mimo tiempo.
Acceso directo a la memoria (DMA) requiere una sola interrupción por cada bloque de caracteres transferidos
durante la operación de entrada/salida.
Canalización. Es una técnica de hardware utilizada en sistemas computacionales de elevado rendimiento, para
explotar ciertos tipos de paralelismos durante el procesamiento de instrucciones.
Almacenamiento primario, almacenamiento secundario y almacenamiento cache. Para que un programa
pueda hacer referencia a ciertas instrucciones y datos, éstos deben ser colocados en el almacenamiento primario.
El almacenamiento secundario consta de cintas, discos, etc., y otros medios diseñados para retener información, a

2
51608191.docx
la que se tendrá acceso eventualmente en el almacenamiento primario. El cache es un almacenamiento muy veloz
diseñado para aumentar la velocidad de ejecución de los programas.
Lenguaje de máquina es el lenguaje de programación que un computador puede comprender directamente.
Los lenguajes ensambladores utilizan abreviaturas y palabras significativas para reemplazar las hileras de
números usadas par escribir los programas en lenguaje de máquina. Se desarrollaron para aumentar la velocidad
de proceso de programación y reducir los errores de codificación. Un programa llamado ensamblador traduce los
programas al lenguaje de máquina.
Los lenguajes de alto nivel permiten a los usuarios escribir programas de modo independiente de la máquina.
Los lenguaje de alto nivel son traducidos al lenguaje de máquina por medio de programas llamados compiladores.
Los compiladores y ensambladores se denominan genéricamente traductores. Durante el proceso de traducción,
el programa escrito por el usuario que es introducido al traductor se llama programa fuente; el programa en
lenguaje de máquina producido por el traductor se llama programa objeto o programa resultante.
El programa supervisor para manejar las complejidades de la entrada/salida eliminando la carga al programa
de aplicaciones se denomina sistema de control de entrada/salida.
SPOOL. Simultaneos Peripheral Operation On Line. Operación simultánea de periféricos en línea.
El interprete no produce un programa objeto, más bien ejecuta directamente un programa fuente.
El programa del sistema llamado cargador, es un programa que coloca las instrucciones y datos de un
programa dentro de localizaciones del almacenamiento principal.
Los cargadores de enlace y editores de enlace se encargar de combinar el programa en lenguaje de máquina
producido por un traductor con otros programas en lenguaje de máquina para formar una unidad de ejecución.
La emulación es una técnica por medio de la cual se hace que una máquina aparente ser otra.

3. Breve Historia de las computadoras


Antes de la era computacional:
Joseph-Marie Jacquard- Almacenamiento de instrucciones en 1801. Telares estampados para producir
diferentes dibujos utilizando tarjetas perforadas.
Charles Babbage (1791-1871) . Diseño de la máquina analítica diferencial. Idea del almacenamiento físico de
las instrucciones.
Ada Lovelace. 1er. Programa informático para la computadora de Babbage- Sin sistema operativo.

Generación 0 (Década de los 40’s)


- 1943 Se desarrolla Colosus 1ª. Computadora totalmente
- 1946 J. Presper Eckert y John Mauchly crearon ENIAC (Electronic numerical integrator and calculator)
capaz de realizar 5000 cálculos por segundo, 50 toneladas de peso, 20 m 2 de espacio y 18000 tubos de
vacío.
- No hay sistema operativo.
- Se utiliza lenguaje máquina.
- Se introducen programas y datos bit por bit mediante switches mecánicos.
- Introducción de cintas y tarjetas perforadas.

3
51608191.docx
- John von Newman, introduce el concepto de software: programa de instrucción que se introducen en la
misma forma que los datos numéricos.
- Se comienza el desarrollo del os lenguajes ensambladores.

Generación 1 (Década de los 50’s)


- General Motors Research Laboratories implantó el 1er. Sistema operativo en una IBM701
- Ejecución de una sola tarea a la vez.
- Se inicia el uso de procesamiento por lotes de secuencia única.
- Se logra cierta fluidez entre los trabajos.

Generación 2 (1ª. Mitad de los 60’s)


- Aparece la multiprogramación.
- Inicia el multiprocesamiento.
- Aparece el tiempo compartido (time-sharing).
- Se generan lo primeros sistemas de tiempo real.
- Independencia de dispositivos.
- En 1965 aparecen las minicomputadoras.

Generación 3 (2ª. Mitad de los 60’s y 1ª. Mitad de los70’s)


- Aparece el sistema 360 de la IBM, conocido como el OS/360.
- Computadoras grandes y costosas.
- Lentitud y alto porcentaje de error y falla.
- Aparece la ingeniería de software. Cambios de personal provocan desechar sistemas completos.
- Surgen los métodos disciplinados y estandarizados par construir software confiable, comprensible y fácil
de entender.
- Aparecen las microcomputadoras.

Generación 4 (2ª. Mitad de los 70’s hasta nuestros días).


- Reafirmación de la familia de computadoras IBM 360
- Separación de costos del software y hardware
Antes:
o El software era gratis.
o El vendedor no era responsable del software.
o Se le entregaba una lista de errores a los clientes
Cambió a :
o El vendedor se responsabilizó del software

4
51608191.docx
o Se generaron industrias independientes del software (Microsoft, Ashton-Tate, McAffee
o Generalización de separación de costo
o Selección de software por parte de usuario.
o Primeras licencias para software.

Tendencias futuras:
- Precio de hardware a la baja.
- Tamaño físico disminuido.
- Aumento en velocidad de procesamiento y capacidad de almacenamiento.
- Muy común el multiprocesamiento.
- Funciones del Sistema Operativo realizadas por software migrarán al microcódigo.
- Estimulación computacional de usuario final.
- Aumento de la cultura computacional.
- Continuación del desarrollo de sistemas paralelos

Evolución del Hardware


Bulbos -> Transistores -> Circuitos integrados -> Circuitos integrados de muy grande escala.

4. Introducción
¿Qué es un sistema operativo?
Un sistema operativo es un programa que actúa como intermediario entre el usuario de un computador y el
hardware de éste. El propósito del sistema operativo es crear un entorno en el que un usuario pueda ejecutar
programas.
El objetivo primario de un sistema operativo es hacer al sistema de computador cómodo de usar. Un objetivo
secundario es utilizar el hardware de computador de forma eficiente.
Para entender qué son los sistemas operativos, primero debemos entender cómo se han desarrollado.
Los componentes de los sistemas operativos han evolucionado como soluciones naturales a los problemas que
aquejaban a los primeros computadores.
Componente de un sistema de cómputo: el hardware, el sistema operativo, los programas de aplicación( o del
usuario), y los usuarios.
El hardware –la unidad central de proceso(CPU), la memoria y los dispositivos de entrada/salida (E/S)–
proporcionan los recursos de computación básicos. Los programas de aplicación –como los compiladores, sistemas
de base de datos, juegos y programas de negocios– definen las formas en que dichos recursos se utilizan para
resolver los problemas de computación de los usuarios. Puede haber muchos tipos de usuarios (personas,
máquinas, otros computadores) tratando de resolver diferentes problemas; por ello, hay muchos tipos de
programas de aplicación. El sistema operativo controla y coordina el uso del hardware entre los diversos
programas de aplicación de los distintos usuarios.

5
51608191.docx
Un sistema operativo es similar a un gobierno. Los componentes de un sistema de computador son su
hardware, software y datos. El sistema operativo proporciona los medios para aprovechar adecuadamente esos
recursos durante el funcionamiento del sistema de computador.
Podemos ver el sistema operativo como un administrador de recursos. Un sistema de computación tiene
muchos recursos (hardware y software) que pueden ser necesarios para resolver un problema: tiempo de CPU,
espacio de memoria, espacio de almacenamiento de archivos, dispositivos de E/S, y demás. El sistema operativo
actúa como gestor de dichos recursos y los asigna a programa y usuarios específicos según los necesiten para sus
tareas. Debe decidir cuáles solicitudes atenderá asignando recursos para operar el sistema de computación de
manera eficiente y justa.
El sistema operativo necesita controlar los diversos dispositivos de E/S y programas de usuario. Un sistema
operativo es un programa de control, que controla la ejecución de los programas de los usuarios a fin de evitar
errores y el uso incorrecto del computador.
El objetivo primario de un sistema operativo es la comodidad del usuario. Los sistema operativos existen
porque se supone que es más fácil realizar tareas de cómputo con ellos que sin ellos.
Un objetivo secundario es la operación eficiente del sistema de computación. La importancia de este objetivo
crece en los sistemas multiusuario compartidos grandes, que suelen ser muy costosos, por lo que es deseable
aumentar su eficiencia al máximo posible.
Los sistemas operativos y la arquitectura de las computadoras han influido mucho uno sobre el otro. Los
sistemas operativos se crearon para facilitar el uso del hardware. A medida que se diseñaron y usaron los sistemas
operativos, se hizo evidente que podrían simplificarse si se modificaba el diseño del hardware.

4.1 Tipos de sistemas operativos:


a) Sistemas por lotes sencillos.
b) Sistemas por lotes multiprogramados.
c) Sistemas de tiempo compartido
d) Sistemas de computador personal.
e) Sistemas paralelos.
f) Sistemas distribuidos.
g) Sistemas de tiempo real.

4.1.1 Sistemas por lotes sencillos


Los primeros computadores eran máquinas enormes (físicamente) que se controlaban desde una consola.
Los dispositivos de entrada comunes eran lectores de tarjetas y unidades de cinta.
Los dispositivos de salida comunes eran impresoras de líneas, unidades de cinta y perforadoras de tarjetas.
Los usuarios de tales sistemas no interactuaban directamente con los computadores:
- El usuario preparaba un trabajo –que consistía en el programa, los datos, y cierta información de control
acerca de la naturaleza del trabajo (tarjetas de control)
- Lo entregaba al operador del computador.
- El trabajo casi siempre se presentaba en forma de tarjetas perforadas.

6
51608191.docx
- En algún momento posterior (minutos, horas o días después), aparecía la salida, que consistía en el
resultado del programa junto con un vaciado ( o vuelco de) del a memoria y los registros en caso de haber
un error de programa.
Función del Sistema Operativo: Transferir el control automáticamente de un trabajo al siguiente.
El sistema operativo siempre estaba (residente) en la memoria.
A fin de agilizar el procesamiento, los programas con necesidades similares se agrupaban en lotes y se
introducían en el computador como un grupo. Así, los programadores dejaban sus programas con el operador;
éste acomodaba los programas para formar lotes con necesidades similares y, cuando el computador quedaba
disponible, ejecutaba cada lote. La salida de cada trabajo se devolvía al programador apropiado.
Así pues, un sistema operativo por lotes normalmente lee un flujo de trabajos individuales (de un lector de
tarjetas, por ejemplo), cada uno con sus propias tarjetas de control que predefinen lo que le trabajo hace. Una vez
terminado el trabajo, si salida generalmente se imprime ( en una impresora de líneas, por ejemplo).
La característica definitiva de un sistema por lotes es la falta de interacción entre el usuario y el trabajo
mientras éste se ejecuta.
Tiempo de retorno: El retardo entre la presentación de un trabajo y su terminación (puede ser el resultado del
volumen de computo requerido, o de retardos antes de que el sistema operativo comience a procesar el trabajo.
En este entorno de ejecución, la CPU con frecuencia está ociosa. Esta inactividad ocurre porque los
dispositivos de E/S mecánicos son intrínsecamente más lentos que los dispositivos electrónicos. Con el paso del
tiempo, las mejoras a la tecnología dieron pie a dispositivos de E/S más rápidos. Desafortunadamente, las
velocidades de CPU aumentaron a un ritmo aún mayor, de modo que le problema no sólo no se resolvió, sino que
se exacerbó.
La introducción de la tecnología de discos ha sido útil en este sentido. En vez, de leer las tarjetas directamente
del lector a la memoria, para después procesar el trabajo, las tarjetas pueden leerse del lector al disco.
Así mismo, cuando el trabajo solicita la impresión de una línea, esa línea se copia en un buffer del sistema y se
escribe en el disco. Una vez que el trabajo termina, la salida se imprime realmente. Esta forma de procesamiento,
se llama spooling; es un acrónimo de operación periférica simultánea en línea (en inglés, simultaneous peripheral
operaton on-line). En esencia, el disco se utiliza como buffer de gran tamaño, para leer por adelantado hasta
donde sea posible de los dispositivos de entrada, y para guardar los archivos de salida hasta que los dispositivos de
salida puedan aceptarlos.
El spooling también sirve para procesar datos en sitios remotos.
El spooling superpone la E/S de un trabajo al cómputo de otros trabajos.

4.1.2 Sistemas por lotes multiprogramados


El spooling da origen a una importante estructura de datos: la reserva de trabajo. Como resultado del
spooling, puede haber varios trabajos ya leídos esperando en el disco, listos para ejecutarse. Al tener reserva de
trabajos en disco, el sistema operativo puede escoger cuál trabajo ejecutará a continuación, a fin de mejorar el
aprovechamiento de la CPU. Si los trabajos llegan directamente en tarjetas o incluso en cinta magnética, no es
posible ejecutarlos en un orden distinto. Los trabajos se deben ejecutar secuencialmente, bajo un régimen de
servicio por orden de llegada. En cambio, si varios trabajos están en un dispositivo de acceso directo, como un
disco, es posible la planificación de trabajos.
El aspecto más importante de la planificación de trabajos es la capacidad de multiprogramar. La operación
fuera de línea y el spooling para traslapar la E/S tiene sus limitaciones. En general, un solo usuario no puede
mantener ni la CPU ni los dispositivos de E/S ocupados todo el tiempo. La multiprogramación aumenta el
aprovechamiento de la CPU organizando los trabajos de tal forma que la CPU siempre tenga uno que ejecutar.

7
51608191.docx
La idea es la siguiente. El sistema operativo mantiene varios trabajos en la memoria a la vez. Este conjunto de
trabajos es un subconjuntos de los que se mantienen en la reserva de trabajos. El sistema operativo escoge uno
del os trabajos que están en la memoria y comienza a ejecutarlo. Tarde o temprano, el trabajo tendrá que esperar
mientras se lleva a cabo alguna tarea, como el montaje de una cinta o la terminación de una operación de E/S. En
un sistema sin multiprogramación, la CPU estaría ociosa. En un sistema multiprogramado, el sistema operativo
simplemente selecciona otra trabajo y lo ejecuta. Cuando ese trabajo necesita esperar, la CPU se conmuta a otro
trabajo, y así sucesivamente. En algún momento, el primer trabajo terminará su espera y recuperará la CPU. En
tanto haya algún trabajo que ejecutar, la CPU nunca estará ociosa.
La multiprogramación es el primer caso en que el sistema operativo debe tomar decisiones por los usuarios.
Todos los trabajos que ingresan en el sistema se mantienen en un área auxiliar de trabajos. Esta área auxiliar
consiste en todos los procesos que residen en le almacenamiento masivo y que esperan la asignación de espacio
en la memoria principal. Si varios trabajos están listos para colocarse en la memoria, y no hay espacio suficiente
para todos, el sistema deberá escoger algunos de entre ellos. La toma de esta decisión es la planificación de
trabajos. Cuando el sistema operativo escoge un trabajo del área auxiliar, lo carga en la memoria para ejecutarlo.
Tener varios programas en la memoria al mismo tiempo requiere alguna forma de gestión de memoria. Además, si
varios trabajos están listos para ejecutarse al mismo tiempo, el sistema debe escoger entre ellos. La toma de esta
decisión es la planificación de CPU. La ejecución concurrente de múltiples trabajos requiere limitar su capacidad
para afectarse mutuamente en todas las fases del sistema operativo, incluidos la planificación de proceso, el
almacenamiento en disco y la gestión de memoria.

4.1.3 Sistemas de tiempo compartido


Los sistemas por lotes multiprogramados proporcionan un entorno en el que los distintos recursos del sistema
(por ejemplo, CPU, memoria, dispositivos periféricos) se aprovechan de manera efectiva. No obstante, los
sistemas por lotes tiene ciertos problemas desde el punto de vista del usuario.
- El usuario no puede interactuar con el trabajo durante su ejecución
- Debe preparar las tarjetas de control de modo que manejen todos los resultados posibles.
- Puede ser difícil definir cabalmente lo que debe hacerse en todos los casos.
- Los programas se deben depurar estáticamente, a partir de vuelcos instantáneos.
- El programador no puede modificar un programa durante su ejecución a fin de estudiar su
comportamiento.
- Si el tiempo de retorno es largo, se inhibe la experimentación con los programas.
- Se obliga a tener cierta disciplina en la escritura y prueba de los programas.

El tiempo compartido, o multitareas, es una extensión lógica de la multiprogramación. Se ejecutan múltiples


trabajos mientras la CPU se conmuta entre ellos, pero la conmutación es tan frecuente que los usuarios pueden
interactuar con cada programa durante su ejecución.
Un sistema de computador interactivo, o manual, permite la comunicación en línea entre el usuario y el
sistema. El usuario da instrucciones al sistema operativo o a un programa directamente, y recibe una respuesta
inmediata. Cuando el sistema operativo termina de ejecutar una orden, busca el siguiente “enunciado de control”
no de un lector de tarjetas, sino del teclado del usuario. El usuario introduce una orden, espera la respuesta, y
decide cuál será la siguiente orden, con base en el resultado anterior. Para el usuario es fácil experimentar, y
puede ver los resultados de inmediato. La mayor parte de los sistemas cuenta con un editor de textos interactivo
para introducir programas, y un depurador interactivo para ayudar a corregir los errores de los programas.

8
51608191.docx
Para que los usuarios puedan acceder con comodidad tanto a los datos como al código, deben contar con un
sistema de archivos en línea. Un archivo es una colección de información relacionada definida por su creador. Por
lo regular, los archivos representan programas (en sus formas tanto fuente como objeto) y datos. Los archivos de
datos pueden ser numéricos, alfabéticos o alfanuméricos. Los archivos pueden ser de forma libre, como los de
texto, o tener un formato rígido. En general, un archivo es una secuencia de bits, bytes, líneas o registros cuyo
significado ha sido definido por su creador y usuarios. El sistema operativo implementa el concepto abstracto de
archivo administrando los dispositivos de almacenamiento masivo, como cintas y discos. Los archivos
normalmente se organizan en grupos lógicos, o directorios, que facilitan su localización y acceso. Puesto que varios
usuarios tienen acceso a archivos, es deseable controlar quién puede acceder a los archivos y de qué formas
puede hacerlo.
Los sistemas por lotes son apropiados para ejecutar trabajos grandes que casi no necesitan interacción. No es
necesario que el usuario espere mientras se procesa el trabajo.
Los trabajos interactivos suelen consistir en muchas acciones cortas, y los resultados de la siguiente orden
podrían ser impredecibles. El usuario introduce la orden y espera los resultados. Por consiguiente, el tiempo de
respuesta debe ser corto. Se emplea un sistema interactivo cuando se requiere un tiempo de respuesta corto.
Los primeros computadores de un solo usuario fueron sistemas interactivos. Esto es, todo el sistema estaba a
la inmediata disposición del programador/operador. Esta situación brindaba al programador gran flexibilidad y
libertad para probar y desarrollar programas. Este sistema hacía que la CPU permaneciera mucho tiempo ociosa
mientras esperaba que el programador/operador hiciera algo. En vista del levado costo de esos computadores, la
ociosidad de la CPU era muy indeseable. Se desarrollaron los sistemas operativos por lotes para evitar este
problema.
Los sistemas de tiempo compartido se crearon para brindar el uso interactivo de un sistema de computador a
un costo razonable. Un sistema operativo de tiempo compartido utiliza planificación de la CPU y
multiprogramación para ofrecer a cada usuario una pequeña porción del tiempo de un computador. Cada usuario
tiene por lo menos un programa individual en la memoria. Un programa que está cargado en la memoria y se está
ejecutando se conoce como proceso.
Los investigadores han intentado fusionar los sistemas por lotes y de tiempo compartido. Muchos sistemas de
computador que se diseñaron primordialmente como sistemas por lotes se han modificado para crear un
subsistema de tiempo compartido. Al mismo tiempo, son varios los casos de sistemas de tiempo compartido a los
que se ha añadido un subsistema por lotes.
Los sistemas operativos de tiempo compartido son todavía más complejos que los multiprogramados. Al igual
que en la multiprogramación, es preciso mantener varios trabajos simultáneamente, lo que requiere alguna forma
de gestión y protección de memoria. Para poder lograr un tiempo de respuesta razonable, podría ser necesario
intercambiar trabajos entre la memoria principal y el disco que ahora funciona como almacén de respaldo de la
memoria principal. Un método común para lograr este objetivo es la memoria virtual, una técnica que permite
ejecutar un trabajo que tal vez no está en su totalidad en la memoria principal (Cap. 9 Memoria Virtual “Gestión
de almacenamiento”). La principal ventaja obvia de este esquema es que los programas pueden ser más grandes
que la memoria física. Además, la memoria principal se abstrae como una matriz grande y uniforme de
almacenamiento, separando la memoria lógica que el usuario ve, de la memoria física. Esta organización permite a
los programadores olvidarse de las limitaciones de almacenamiento en memoria. Los sistemas de tiempo
compartido también necesitan un sistema de archivos en línea (Caps. 10 Interfaz con el sistema de archivos y 11
Implementación del sistema de archivos “Gestión de almacenamiento”). El sistema de archivos reside en una
colección de discos, así que también debe incluirse la gestión de discos (Cap. 13 Estructuras del almacenamiento
secundario “Sistemas de E/S”). Además, los sistemas de tiempo compartido cuentan con un mecanismo de
ejecución concurrente, lo que requiere esquemas de planificación del a CPU avanzados (Cap. 5 Planificación de la
CPU “Gestión de procesos”). Para asegurar una ejecución ordenada, el sistema debe incluir mecanismos para la
sincronización y comunicación de los trabajos (Cap. 6 Sincronización de procesos “Gestión de procesos”), y debe
asegurar que los trabajos no se atasquen en un bloqueo mutuo, esperando cada uno eternamente a que el otro
termine (Cap. 7 Bloqueos mutuos “Gestión de procesos”).
9
51608191.docx

4.1.4 Sistemas de computador personal


Sistemas de computación dedicados a un solo usuario. Estos tipos de sistemas se conocen como
computadores personales (PC, personal computer).
Los computadores personales aparecieron en la década de 1970. Se trata de microcomputadores mucho más
pequeños y económicos que los sistemas de macrocomputador (mainframes). Durante su primera década, las CPU
de los PC carecían de las funciones necesarias para proteger el sistema operativo de los programas de usuario. Por
ello, los sistemas operativos de PC no eran ni multiusuarios ni multitareas. No obstante, los objetivos de estos
sistemas operativos han cambiado con el tiempo; en lugar de maximizar el aprovechamiento de la CPU y los
periféricos, los sistemas optan por maximizar la comodidad del usuario y la rapidez con que responden a sus
necesidades.
Los sistemas operativos para estos computadores se han beneficiado con el desarrollo de sistemas de sistemas
operativos para macrocomputadores de varias manera. Los microcomputadores pudieron adoptar de inmediato la
tecnología desarrollada para sistemas operativos más grandes. Por un lado, los costos del hardware de
microcomputador son los bastante bajos como para que individuos utilicen exclusivamente el computador, y el
aprovechamiento de la CPU ha dejado de ser una preocupación central. Por ello, algunas de las decisiones de
diseño que se toman en los sistemas operativos para macrocomputadores podrían no ser apropiadas para
sistemas más pequeños. Por ejemplo, la protección de archivos podría no ser necesaria en una máquina personal.
Por ejemplo, aunque aparentemente la protección de archivos no es necesaria en computadores personales
aislados, es común que estos computadores se vinculen con otros a través de líneas telefónicas o redes de área
local. Si otros computadores y otros usuarios pueden acceder a los archivos de un computador personal, la
protección de archivos vuelve a ser una función necesaria de un sistema operativo. La carencia de tal protección
ha facilitado la destrucción de datos en sistemas como MS-DOS y el sistema operativo por parte de programas mal
intencionados. Estos programas pueden ser del tipo que se reproducen a sí mismos, y difundirse rápidamente por
mecanismos de gusano o virus para dañar compañías enteras o incluso redes mundiales. (Cap. 19 y 20 Protección
y seguridad).
Funciones que en otras épocas eran exclusivas de los macrocomputadores han sido adoptadas por los
microcomputadores.
Al mismo tiempo que la escala de las características de los sistemas operativos grandes se estaba recudiendo
para ajustarlas a los computadores personales, se estaban desarrollando sistemas de hardware más potentes,
rápidos y complejos. A medida que el hardware y el software de los PC se hace más complejo, la línea que divide
las dos categorías se está desvaneciendo.

4.1.5 Sistemas paralelos


La mayor parte de los sistemas hasta ahora han sido sistemas monoprocesador; es decir, han tenido una sola
CPU. Sin embargo, la tendencia actual es hacia los sistemas multiprocesador. Tales sistemas tiene más de un
procesador en comunicación íntima, los cuales comparten el bus del computador, el reloj y a veces la memoria y
los dispositivos periféricos. Decimos que estos sistemas están fuertemente acoplados.
Razones para construir este tipo de sistemas:
- Una ventaja es el aumento en el rendimiento. Al incrementar el número de procesadores, la proporción de
aumento de la velocidad con n procesadores no es n, sino más bien n.
- Los multiprocesadores también pueden ahorrar dinero en comparación con varios sistemas
monoprocesador porque los procesadores pueden compartir periféricos, gabinetes y fuentes de potencia.
Si varios programas deben operar con el mismo conjunto de datos, es más económico guardar esos datos

10
51608191.docx
en un disco y hacer que todos los procesadores los compartan, en vez de tener muchos computadores con
discos locales y hacer copias de los datos.
- Los sistemas multiprocesador mejoran la confiabilidad. Si es posible distribuir las funciones correctamente
entre varios procesadores, el fallo de un procesador no detendrá el sistema, solo lo hará más lento.

La capacidad para seguir dando un servicio proporcional al nivel de hardware que sobrevive se denomina
degradación gradual. Los sistemas diseñados para degradarse gradualmente también se conocen como tolerantes
a fallos (fault-tolerant).
El funcionamiento continuado en presencia de fallos requiere un mecanismo para detectar, diagnosticar y
corregir (si es posible) el fallo. El sistema Tandem utiliza duplicación tanto de hardware como de software para
asegurar una operación continuada a pesar de los fallos. El sistema consiste en dos procesadores idénticos, cada
uno con su propia memoria local. Los procesadores se conectan con un bus. Un procesador es el primario, y el
otro es el de respaldo. Se mantienen dos copias de cada proceso; una en la máquina primaria y otra en el
respaldo. En puntos de verificación (checkpoints) fijos durante la ejecución del sistema, la información de estado
de cada trabajo (incluida una copia de la imagen de memoria) se copia de la máquina primaria a la de respaldo. Si
se detecta un fallo, se activa la copia de respaldo, y se reinicia a partir del punto de verificación más reciente. Esta
solución obviamente es costosa, ya que hay mucha duplicación de hardware.
Los sistemas de múltiple procesador más comunes en la actualidad siguen el modelo de multiprocesamiento
simétrico, en el que cada procesador ejecuta una copia idéntica del sistema operativo, y estas copias se comunican
entre sí cuando es necesario. Algunos sistemas utilizan multiprocesamiento asimétrico, en el que a cada
procesador se asigna a una tarea específica. Un procesador controla el sistema; los demás procesadores obtienen
sus instrucciones del maestro o bien tiene tareas predefinidas. Este esquema define una relación maestro-esclavo.
El procesador maestro planifica y asigna trabajo a los procesadores esclavos.
Ejemplo: La ventaja de este modelo es que muchos procesos pueden ejecutarse simultáneamente (N procesos
si hay N CPU) sin que haya deterioro del desempeño. Sin embargo, es preciso controlar cuidadosamente la E/S
para asegurar que los datos lleguen al procesador apropiado. Además, dado que las CPU son independientes una
podría estar ociosa mientras otra está sobrecargada, con la siguiente ineficiencia. A fin de evitar esto, los
procesadores pueden compartir ciertas estructuras de datos. Un sistema multiprocesador de este tipo permite
compartir dinámicamente trabajos y recursos entre los distintos procesadores, y puede reducir la varianza entre
los sistemas. (Cap. 6 Sincronización de procesos “Gestión de procesos”).
El multiprocesamiento asimétrico es más común en los sistemas extremadamente grandes, donde una de las
actividades que más tiempo consume es el procesamiento de E/S. En los sistemas por lotes más antiguos, se
utilizaban procesadores pequeños, situados a cierta distancia de la CPU principal, para operar los lectores de
tarjetas e impresoras de líneas y transferir estos trabajos a y de el computador principal. Estos puntos se
denominan sitios de entrada remota de trabajos (RJE, remote-job-entry). En un sistema de tiempo compartido,
una de las principales actividades de E/S es procesar la E/S de caracteres entre las terminales y el computador. Si
es preciso interrumpir la CPU principal cada vez que se transfiere un carácter a o de una terminal, la CPU podría
pasar todo su tiempo procesando caracteres. Para evitar esta situación, la mayor parte de los sistemas cuenta con
un procesador de extremo frontal (front-end) aparte que se encarga de toda la E/S de terminales.
Es importante darse cuenta de que la diferencia entre multiprocesamiento simétrico y asimétrico puede
deberse al hardware o la software. Podría existir hardware especial para diferenciar los múltiples procesadores, o
podría escribirse software que permita un solo maestro y varios esclavos.
A medida que baja el precio y aumenta la potencia de los microprocesadores, más y más funciones del sistema
operativo se delegan a procesadores esclavos, también llamados back-ends o procesadores de servicios. Por
ejemplo, es fácil añadir un procesador con su propia memoria para administrar un sistema de disco. El
microprocesador podría recibir una secuencia de solicitudes de la CPU principal e implementar su propia cola de
disco y algoritmo de planificación. Esta organización evita a la CPU principal el trabajo extra que implica la

11
51608191.docx
planificación de disco. Los PC contienen un microprocesador en el teclado que convierte las digitaciones en
códigos que se envían a la CPU. De hecho, este uso de los microprocesadores se ha vuelto tan común que ya no se
considera como multiprocesamiento.

4.1.6 Sistemas distribuidos


Una tendencia en los sistemas de computador es distribuir el cómputo entre varios procesadores. En los
cuales los procesadores no comparten la memoria ni el reloj. En vez de ello, cada procesador tiene su propia
memoria local. Los procesadores se comunican entre sí a través de diversas líneas de comunicación, como buses
de alta velocidad o líneas telefónicas. Solemos decir que tales sistemas están débilmente acoplados o distribuidos.
Los procesadores de un sistema distribuido pueden tener diferentes tamaños y funciones; pueden incluir
microprocesadores pequeños, estaciones de trabajo, minicomputadores y sistema de computador de propósito
general grandes. Tales procesadores reciben varios nombres distintos, como sitios, nodos, computadores, etc.,
dependiendo del contexto en el que se mencionan.
Razones para construir sistemas distribuidos:
- Recursos compartidos. Si varios sitios distintos (con diferentes capacidades) se conectan entre sí, un usuario
de un sitio prodría aprovechar los recursos disponibles.
- Computación más rápida. Si un calculo se puede dividir en varios subcálculos susceptibles de ejecución
concurrente, un sistema distribuido podría permitirnos distribuir el cálculo entre los distintos sistios, y
ejecutarlo de forma concurrente.
- Confiabilidad. Si un sitio de un sistema distribuido falla, los sistemas restantes podrían seguir funcionando.
- Comunicación. Si muchos sitios están conectados a través de una red de comunicaciones, los procesos de
diferentes sitios tiene la oportunidad de intercambiar información. (Cap. 15 Estructuras de redes, Cap. 16
Estructuras de sistemas distribuidos, Cap. 17 sistemas de archivos distribuidos, Cap. 18 Coordinación
distribuida)

4.1.7 Sistemas de tiempo real


Se usa un sistema de tiempo real cuando los requisitos de tiempo de la operación de un procesador o del flujo
de datos son estrictos, se utilizan como dispositivos de control en aplicaciones dedicadas. Los sensores envían
datos al computador, el cual debe analizar estos datos y posiblemente ajustar controles a fin de modificar las
entradas de los sensores. Los sistemas que controlan experimentos científicos, los que producen imágenes
médicas, los de control industrial y algunos sistemas de exhibición son sistemas de tiempo real. Esta clasificación
también incluye algunos sistemas de inyección de combustible para motores de automóviles, controladores de
aparatos domésticos y sistemas de armamentos. Un sistema operativo de tiempo real tiene restricciones de
tiempo fijas bien definidas. El proceso debe efectuarse dentro de los intervalos definidos, o el sistema fallará. Se
considera que un sistema de tiempo real está funcionando correctamente sólo si produce el resultado correcto
dentro de los intervalos de tiempo estipulados. Podemos contrastar este requisito con un sistema de tiempo
compartido, en el que es deseable (pero no obligatorio) responder rápidamente, o con un sistema por lotes, en el
que tal vez no haya restricciones de tiempo.
Hay dos tipos de sistemas de tiempo real. Un sistema de tiempo real duro garantiza que las tareas críticas se
terminarán a tiempo. Este objetivo requiere que todos los retardos del sistema estén limitados, desde la
obtención de datos almacenados hasta el tiempo que el sistema operativo tarda en atender cada solicitud que se
le presenta. Tales restricciones de tiempo determinan los recursos que están disponibles en este tipo de sistemas.
El almacenamiento secundario de cualquier índole suele estar limitado o ausente, y los datos se almacenan de
preferencia en memoria de corto plazo o en memoria sólo de lectura (ROM, read-only memory). La ROM se
encuentra en dispositivos de almacenamiento no volátil que conserva su contenido aun en caso de fallar el
12
51608191.docx
suministro de electricidad; casi todos los demás tipos de memoria son volátiles. También está ausente la mayor
parte de las funciones avanzadas de los sistemas operativos, ya que tienden a separar al usuario aún más del
hardware, y tal separación causa incertidumbre acerca del tiempo que una operación tarda. Por ejemplo, los
sistemas de tiempo real casi nunca tienen memoria virtual. Por ello, los sistemas de tiempo real duros son
incompatibles con el funcionamiento de los sistemas de tiempo compartido, y no pueden combinarse con ellos.
Un tipo menos restrictivo de sistema de tiempo real es el de tiempo real blando, en el que una tarea de
tiempo real crítica goza de prioridad respecto a otras tareas, y conserva esa prioridad hasta que se lleva a cabo. Al
igual que en los sistemas de tiempo real duros, es preciso limitar los retardos del núcleo; no es posible mantener a
una tarea de tiempo real esperando indefinidamente a que le núcleo la ejecute. El tiempo real blando es una meta
alcanzable que puede combinarse con otros tipos de sistemas. Áreas que pueden ser útiles, como multimedia,
realidad virtual y proyectos científicos avanzados como la exploración submarina y planetaria. La proliferación del
uso de funciones de tiempo real blando ha hecho que se incluyan en la mayor parte de los sistemas operativos
actuales.

5 Estructuras del Sistema Operativo


Hay varias perspectivas desde las que podemos considerar un sistema operativo. Una consiste en examinar los
servicios que proporciona. Otra es explorar la interfaz que ofrece a los usuarios y programadores. Una tercera
consiste en desglosar el sistema en sus componentes y estudiar sus interconexiones. Veremos qué servicios
proporciona un sistema operativo, cómo los proporciona y qué metodologías se emplean para diseñar tales
sistemas.

5.1 Componentes del sistema

5.1.1 Gestió n de procesos


Un programa no puede hacer nada si la CPU no ejecuta sus instrucciones. Podemos pensar en un proceso
como una porción de un programa en ejecución o todo el programa. Un trabajo por lotes es un proceso. Un
programa de usuario de tiempo compartido es un proceso. Una tarea del sistema, como poner un spool las salidas
a una impresora, también es un proceso. Podemos considerar que un proceso es un trabajo que se ejecuta por
lotes o un programa que se ejecuta en tiempo compartido.
Un proceso necesita ciertos recursos, incluidos tiempo de CPU, memoria, archivos y dispositivos de E/S, para
llevar a cabo su tarea.
El sistema operativo se encarga de las siguientes actividades relacionadas con la gestión de procesos:

- Crear y eliminar procesos tanto de usuarios como del sistema.


- Suspender y reanudar procesos.
- Proveer mecanismos para la sincronización de procesos.
- Proveer mecanismos para la comunicación entre procesos.
- Proveer mecanismos para manejar bloqueos mutuos (deadlocks)

5.1.2 Gestió n de la memoria principal


La memoria principal es crucial para el funcionamiento de un sistema de computación moderno. La memoria
principal es un depósito de datos a los que se puede acceder rápidamente y que son compartidos por la CPU y los
13
51608191.docx
dispositivos de E/S. El procesador central lee instrucciones de la memoria principal durante el ciclo de obtención
de instrucciones, y lee y escribe datos de la memoria principal durante el ciclo de obtención de datos. Las
operaciones de E/S implementadas por DMA también leen y escriben datos en la memoria principal. Por lo
regular, la memoria principal es el único dispositivo de almacenamiento grande que la CPU puede direccionar y
acceder directamente.
El sistema operativo se encarga de las siguientes actividades relacionadas con la gestión de memoria:
- Saber cuáles partes de la memoria se están usando actualmente, y quién las está usando.
- Decidir cuáles procesos se cargarán en la memoria cuando se disponga de espacio.
- Asignar y liberar espacio de memoria según se necesite.

5.1.3 Gestió n de archivos


La gestión de archivos es uno de los componentes más visibles de un sistema operativo. Los computadores
pueden almacenar información en varios tipos distintos de medios físicos. Los medios más comunes son cinta
magnética, disco magnético y disco óptico. A fin de hacer más cómodo del uso del sistema de computación, el
sistema operativo presenta una perspectiva lógica uniforme del almacenamiento de información, abstrayendo las
propiedades físicas de sus dispositivos de almacenamiento para definir una unidad de almacenamiento lógico, el
archivo. El sistema operativo establece la correspondencia entre los archivos y los medios físicos, y accede a los
archivos a través de los dispositivos de almacenamiento.
El sistema operativo implementa el concepto abstracto de archivo administrando los medios de
almacenamiento masivo, como cintas y discos, y los dispositivos que los controlan. Además, los archivos
normalmente se organizan en directorios con objeto de facilitar su uso. Por último, si varios usurarios tiene acceso
a los archivos, podría ser deseable controlar quién y de qué modo puede acceder a los archivos.
El sistema operativo se encarga de las siguientes actividades relacionadas con la gestión de archivos:
- Crear y eliminar archivos.
- Crear y eliminar directorios.
- Proveer las primitivas para manipulación de archivos y directorios.
- Establecer la correspondencia de los archivos con el almacenamiento secundario.
- Resguardar los archivos en medios de almacenamiento estables (no volátiles).

5.1.4 Gestió n del sistema de E/S


Uno de los objetivos de un sistema operativo es ocultar las peculiaridades de dispositivos de hardware
específicos de modo que el usuario no las perciba.

5.1.5 Gestió n de almacenamiento secundario


El propósito de un sistema de computador es ejecutar programas. Estos programas, junto con los datos a los
que acceden, deben estar alojados en la memoria principal (almacenamiento primario) durante la ejecución. Dado
que la memoria principal es demasiado pequeña para dar cabida a todos los datos y programas, y que pierde su
información cuando deja de recibir corriente eléctrica, el sistema de computación debe contar con algún
almacenamiento secundario para respaldar la memoria principal.
El sistema operativo se encarga de las siguientes actividades relacionadas con la gestión de discos:
- Administración del espacio libre.

14
51608191.docx
- Asignación del almacenamiento.
- Planificación del disco.

5.1.6 Trabajo con redes


Un sistema distribuido es una colección de procesadores que no comparten memoria, dispositivos periféricos
ni el reloj.
Los procesadores del sistema se conectan por medio de una red de comunicaciones.
Los sistemas operativos normalmente generalizan el acceso por red como una forma de acceso a archivos; los
detalles del trabajo con la red están contenidos en el driver de la interfaz con la red.

5.1.7 Sistema de protecció n


Si un sistema de computación tiene múltiples usuarios y permite la ejecución concurrente de múltiples
procesos, es preciso proteger cada proceso de las actividades de los demás. Con ese fin, se incluyen mecanismos
para asegurar que sólo aquellos procesos que hayan obtenido la autorización debida del sistema operativo puedan
operar con los archivos, segmentos de memoria, procesadores y demás recursos.
El término protección se refiere a un mecanismo para controlar el acceso de programas, procesos o usuarios a
recursos definidos por un sistema de computador. Este mecanismo debe incluir alguna forma de especificar los
controles que se impondrán, junto con alguna forma de hacerlos cumplir.
La protección puede mejorar la confiabilidad mediante la detección de errores latentes en las interfaces entre
los subsistemas componentes. La detección temprana de errores de interfaz a menudo puede evitar la
contaminación de un subsistema saludable por un subsistema que está fallando. Un sistema orientado hacia la
protección permite distinguir entre el uso autorizado y no autorizado.

5.1.8 Sistema de interpretació n de ó rdenes


Uno de los programas del sistema más importantes de un sistema operativo es el intérprete de órdenes o de
comandos, que es la interfaz entre el usuario y el sistema operativo. Muchas de las órdenes que se dan al sistema
operativo viene en enunciados de control. Cuando se inicia un trabajo nuevo en un sistema por lotes, o cuando un
usuario ingresa en un sistema de tiempo compartido, se ejecuta automáticamente un programa que lee e
interpreta estos enunciados de control. Dicho programa también se conoce como intérprete de tarjetas de control
o intérprete de línea de comandos y recibe el nombre común de shell. La función del shell es muy sencilla: obtener
la siguiente orden y ejecutarla.

5.2 Servicios del sistema operativo


Un sistema operativo crea un entorno para la ejecución de programas. El sistema operativo proporciona
ciertos servicios a los programas y a los usuarios de dichos programas. Estos servicios se proporcionan para
comodidad del programador, a fin de facilitar la tarea de programación.
Clases comunes de servicios proporcionados:
- Ejecución de programas. El sistema debe poder cargar un programa en la memoria y ejecutarlo. El
programa debe terminar su ejecución, sea normal o anormalmente (indicando un error).
- Operaciones de E/S. Un programa en ejecución podría requerir E/S. Ésta podría implicar el uso de un
archivo o un dispositivo de E/S. Por cuestiones de eficiencia y seguridad, los usuarios casi nunca pueden
15
51608191.docx
controlar los dispositivos de E/S directamente; por lo tanto, el sistema operativo debe incluir un mecanismo
para realizar E/S.
- Manipulación del sistema de archivos. El sistema de archivos tiene particular interés. Es evidente que los
programas necesitan leer y escribir archivos, y también crear y eliminar archivos especificando su nombre.
- Comunicaciones. Hay muchas circunstancias en las que un proceso necesita intercambiar información con
otro, y hay dos formas principales de llevar a cabo tal comunicación. La primera ocurre entre procesos que
se ejecutan en el mismo computador; la segunda implica procesos que se ejecutan en computadores
distintos conectados a una red. La comunicación puede implementarse mediante memoria compartida o
con la técnica de transferencia de mensajes, en la que el sistema operativo transfiere paquetes de
información entre procesos.
- Detección de errores. El sistema operativo necesita estar pendiente en todo momento de los posibles
errores. Pueden ocurrir errores en el hardware de la CPU y la memoria (como un error de memoria o un
corte de alimentación eléctrica), en los dispositivos de E/S (como un error de paridad en cinta, un fallo de
conexión en una red o falta de papel en una impresora) o en el programa de usuario(como un
desbordamiento en una operación aritmética, un intento de acceder a una posición de memoria no
permitida o un uso excesivo de tiempo de CPU). Para cada tipo de error, el sistema operativo debe
emprender la acción apropiada para asegurar un funcionamiento correcto y consistente del sistema de
computación.

Otras funciones del sistema operativo cuyo objetivo no es ayudar al usuario, sino asegurar el
funcionamiento del sistema mismo:
- Asignación de recursos. Si hay varios usuarios o varios trabajos ejecutándose al mismo tiempo, es preciso
asignar recursos a cada uno.
- Contabilización. Es importante mantenerse al tanto de qué usuarios usan cuántos recursos del computador
y de qué tipo. Para facturación o estadística.
- Protección. Los dueños de la información almacenada en un sistema de computador multiusuarios podrían
querer controlar su uso. La protección implica asegurar que todos los accesos a los recursos del sistema
sean controlados. La seguridad del sistema también es importante, y comienza con obligar a cada usuario a
identificarse ante el sistema, por lo regular con una contraseña, antes de poder acceder a los recursos. La
seguridad se extiende a defender los dispositivos de E/S externos, incluidos módems y adaptadores de red,
contra intentos de acceso no autorizado, y registrar todas las conexiones para detectar incursiones.

5. 3 Llamadas al sistema
Las llamadas al sistema son la interfaz entre un procesos y el sistema operativo. Estas llamadas generalmente
están disponibles como instrucciones en lenguaje ensamblador, y casi siempre se listan en los manuales
empleados por quienes programan en ese lenguaje.
Algunos sistemas permiten emitir llamadas al sistema directamente desde un programa escrito en un lenguaje
de alto nivel, en cuyo caso las llamadas casi siempre semejan llamadas predefinidas a funciones o subrutinas.
Las llamadas al sistema se pueden agrupar a grandes rasgos en cinco categorías principales: control de
procesos, manipulación de archivos, manipulación de dispositivos, mantenimiento de información y
comunicaciones.
Tipos de llamadas al sistema:
- Control de procesos
16
51608191.docx
o Fin, abortar
o Cargar, ejecutar
o Crear proceso, terminar proceso
o Obtener atributos de procesos, establecer atributos de procesos.
o Esperar un lapso de tiempo
o Esperar suceso, indicar la ocurrencia del suceso
o Asignar y liberar memoria
- Manipulación de archivos
o Crear archivo, eliminar archivo
o Abrir, cerrar
o Leer, escribir, reposicionar
o Obtener atributos de archivo, establecer atributos de archivo
- Manipulación de dispositivos
o Solicitar dispositivo, liberar dispositivo
o Leer, escribir, reposicionar
o Obtener atributos de dispositivo, establecer atributos de dispositivo
o Conectar o desconectar lógicamente dispositivos.
- Mantenimiento de información
o Obtener hora o fecha, establecer hora o fecha
o Obtener datos del sistema, establecer datos del sistema
o Obtener atributos de un proceso, archivo o dispositivo
o Establecer atributos de un proceso, archivo o dispositivo
- Comunicaciones
- Crear, eliminar conexión de comunicación
- Enviar, recibir mensajes
- Transferir información de estado
- Conectar o desconectar dispositivos remotos.

5.4 Estructura del sistema


Un sistema tan grande y complejo como un sistema operativo moderno debe diseñarse con cuidado para que
funcione correctamente y sea fácil de modificar. Una estrategia común consiste en dividir la tarea en
componentes pequeños, en lugar de tener un sistema monolítico.

5.4.1 Estructura simple

17
51608191.docx
Hay muchos sistemas comerciales que no tienen una estructura bien definida. A esta estructura se conoce
como monolítica. El sistema operativo se escribe como un conjunto de procedimientos, cada uno de los cuales
puede llamar a cualquiera de los otros siempre que lo necesite. Cuando se emplea esta técnica, cada
procedimiento del sistema tiene una interfaz bien definida en términos parámetros y resultados, y cada una tiene
la libertad de llamar a cualquiera otra, si la última ofrece algún cálculo que la primera necesite.
Para construir el programa objeto real del sistema operativo cuando se usa este método, se compilan todos
los procedimientos individuales o archivos que contienen los procedimientos y después se combinan todos en un
solo archivo objeto con el enlazador. En términos de ocultamiento de información, esencialmente no existe
ninguno; todo procedimiento es visible para todos (al contrario de una estructura que contiene módulos o
paquetes, en los cuales mucha de la información es local a un módulo y sólo se pueden llamar puntos de registro
designados oficialmente del exterior del módulo).

5.4.2 Enfoque por capas


El enfoque de capas consiste en dividir el sistema operativo en varias capas (niveles), cada una construida
sobre las capas inferiores. La capa inferior (capa 0) es el hardware; la capa más alta (capa N) es la interfaz con el
usuario.
Una capa del sistema operativo es una implementación de un objeto abstracto que es el encapsulamiento de
datos y de operaciones que pueden manipular esos datos.
Por ejemplo, representemos una capa de un sistema operativo, designándola como capa M. Esta capa consiste
en algunas estructuras de datos y un conjunto de rutinas que las capas de nivel superior pueden invocar. La capa
M, a su vez, puede invocar operaciones de capas de niveles más bajos.
La principal ventaja del enfoque de capas es la modularidad. Las capas se escogen de modo que cada una
utilice sólo funciones (operaciones) y servicios de capas de los niveles inferiores. Esto implica la depuración y la
verificación del sistema. Podemos depurar la primera capa sin preocuparnos por el resto del sistema porque, por
definición, sólo utiliza el hardware básico (que se supone correcto) para implementar sus funciones. Una vez
depurada la primera capa, se puede dar por sentado su funcionamiento correcto mientras se trabaja con la
segunda capa, y así sucesivamente. Si se encuentra un error durante la depuración de una capa en particular,
sabremos que el error está en esa capa, porque las capas inferiores ya están depuradas.
Cada capa se implementa utilizando sólo operaciones provistas por capas del nivel inferior. Una capa no
necesita saber cómo se han implementado dichas operaciones; sólo se necesita saber qué hacen. De este modo,
cada capa oculta la existencia de ciertas estructuras de datos, operaciones y hardware, de las capas de niveles más
altos.
El principal problema de l enfoque de capas tiene que ver con la definición apropiada de las distintas capas.
Puesto que una capa sólo puede usar las capas que están en un nivel más bajo, la planificación debe ser muy
cuidadosa.
Otras necesidades podrían ser menos obvias. Por ejemplo, el controlador del almacenamiento auxiliar
normalmente estaría arriba del planificador de la CPU, porque el controlador podría tener que esperar a que
termine una operación de E/S, y la CPU podría replanificarse durante este tiempo.
Un último problema de las implementaciones de capas es que tienden a ser menos eficientes que otros tipos.
En cada capa, los parámetros podrían modificarse, podría haber necesidad de pasar datos, etc. Cada capa implica
un gasto extra por el procesamiento de la llamada al sistema, y el resultado neto es una llamada que tarda más
que en un sistema sin capas.

5.5 Má quinas virtuales

18
51608191.docx
Conceptualmente, un sistema de computador se compone de capas. El hardware es el nivel más bajo en todos
estos sistemas. El núcleo que se ejecuta en el siguiente nivel utiliza las instrucciones del hardware para crear un
conjunto de llamadas al sistema que las capas exteriores pueden usar. Así, los programas del sistema que están
arriba del núcleo pueden usar llamadas al sistema o instrucciones de hardware, y en ciertos sentidos estos
programas no distinguen entre las dos.
Algunos sistemas llevan este esquema un paso más allá permitiendo a los programas de aplicación invocar
fácilmente los programas del sistema. Aquí también, aunque los programas del sistema están en un nivel más alto
que las demás rutinas, los programas de aplicación podrían ver todo lo que está debajo de ellos en la jerarquía
como si formar parte de la máquina misma. Este enfoque de capas se lleva a su conclusión lógica en el concepto
de máquina virtual.
Utilizando planificación de CPU y técnicas de memoria virtual, un sistema operativo puede crear la ilusión de
que múltiples procesos se ejecutan cada uno en su propio procesador con su propia memoria (virtual). El enfoque
de máquina presenta una interfaz que es idéntica al hardware desnudo subyacente. Cada proceso recibe una
copia (virtual) del computador subyacente.
Los recursos del computador físico se comparten para crear las máquinas virtuales. Se puede usar
planificación de CPU para compartir la CPU y crear la ilusión de que los usuarios tiene su propio procesador.
Un problema importante del enfoque de máquina virtual tiene que ver con los sistemas de discos. En este
caso, la solución es ofrecer discos virtuales, que son idénticos en todo sentido con excepción del tamaño. Éstos se
denominan minidiscos en el sistema operativo VM de IBM. El sistema implementa cada minidisco asignando tantas
pistas de los discos físicos como el minidisco necesite.

5.5.1 Java
Otro ejemplo de la persistente utilidad de las máquinas virtuales se relaciona con el lenguaje Java. Java es un
lenguaje que goza de gran popularidad, diseñado por Sun Microsystems, y que se implementa con un compilador
que genera códigos de bytes como salida. Éstos códigos de bytes son las instrucciones que se ejecutan en la
Máquina virtual Java (JVM, Java Virtual Machine). Para que los programas Java se ejecuten en una plataforma, es
necesario que dicha plataforma esté ejecutando una JVM. La JVM se ejecuta en muchos tipos de computadores,
incluidos los compatibles con IBM-PC, Macintosh, estaciones de trabajo y servidores Unix, y minicomputadores y
macrocomputadores IBM. La JVM también se implementa dentro de navegadores de Web como Microsoft
Internet Explorer y Netscape Comunicator. Estos navegadores, a su vez, se ejecutan en diferentes equipos y
sistemas operativos. La JVM también se implementa en el pequeño JAVAOS, pero aquí la implementación es
directamente en hardware para evitar el gasto extra que implica ejecutar Java en sistemas operativos de propósito
general. Por último, dispositivos de propósito específico, como los teléfonos celulares, se pueden implementar a
través de Java utilizando microprocesadores que ejecutan códigos de bytes Java como instrucciones nativas.
La Máquina Virtual Java implementa un conjunto de instrucciones basados en pila que incluye las
instrucciones aritméticas, lógicas, de movimiento de datos y de control de flujo que cabe esperar. Al ser una
máquina virtual, también puede implementar instrucciones que son demasiado complejas para incorporarse en
hardware, incluidas instrucciones para crear y manipular objetos, e invocar métodos. Los compiladores de Java se
limitan a emitir estas instrucciones de códigos de bytes, y la JVM debe implementar la funcionalidad necesaria
para cada plataforma.
El diseño de Java aprovecha el entorno completo que una máquina virtual implementa. Por ejemplo, se
verifica que los códigos de bytes no incluyan instrucciones que pudieran poner en peligro la seguridad o
confiabilidad de la máquina subyacente. Si el programa Java no satisface esta verificación, no se permitiría su
ejecución. Mediante la implementación de Java como lenguaje que se ejecuta en una máquina virtual, Sun ha
creado un recurso orientado a objetos eficiente, dinámico, seguro y transportable. Si bien los programas Java no
son tan rápidos como los que se compilan para el conjunto de instrucciones del hardware nativo, sí son más

19
51608191.docx
eficientes que los programas interpretados y tienen varias ventajas respecto a los lenguajes de compilación nativa
como C.

6 Gestión de procesos
Podemos considerar un proceso como un programa en ejecución. Un proceso necesita ciertos recursos, como
tiempo de CPU, memoria, archivos y dispositivos de E/S, para realizar su tarea. Estos recursos se asignan al
proceso cuando se crea o bien durante su ejecución.
El sistema operativo tiene las siguientes obligaciones en lo tocante a la gestión de procesos: creación y
eliminación de procesos tanto del usuario como del sistema; planificación de procesos; y establecimiento de
mecanismos para la sincronización y comunicación de procesos, y el manejo de bloqueos mutuos.

6.1 El concepto de proceso


Un obstáculo para tratar los sistemas operativos es la cuestión de cómo debemos referirnos a todas las
actividades de la CPU. Un sistema por lotes ejecuta trabajos, en tanto que un sistema de tiempo compartido tiene
programas de usuario, o tareas. En muchos sentidos, todas estas actividades son similares, así que a todas las
llamamos procesos.

6.1.1 El proceso
Informalmente, un proceso es un programa en ejecución. La ejecución de un proceso debe proceder de
manera secuencial. Es decir, en cualquier instante, cuando más una instrucción se estará ejecutando a nombre del
proceso.
Un proceso es más que el código del programa (también conocido como sección de texto); también incluye la
actividad actual, representada por el valor del contador de programa y el contenido de los registros del
procesador. Generalmente, un proceso también incluye la pila (stack) del proceso, que contiene datos temporales
(como los parámetros de subrutinas, direcciones de retorno y variables temporales), y una sección de datos que
contiene variables globales).
Hacemos hincapié en que un programa por sí solo no es un proceso; un programa es una entidad pasiva, como
el contenido de un archivo guardado en disco, mientras que un proceso es una entidad activa, con el contador de
programa especificando la siguiente instrucción que se ejecutará, y un conjunto de recursos asociados.

6.1.2 Estado de un proceso


A medida que un proceso se ejecuta, cambia de estado. El estado de un proceso está definido en parte por la
actividad actual de ese proceso. Cada proceso puede estar en uno de los siguientes estados:
- Nuevo (New): El proceso se está creando.
- En ejecución (Running): Se están ejecutando instrucciones.
- En espera o bloqueado (waiting): El proceso está esperando que ocurra algún suceso (como la terminación
de una operación de E/S o la recepción de una señal).
- Listo (Ready): El proceso está esperando que se le asigne a un procesador.
- Terminado (Teminated): el proceso termino su ejecución.

20
51608191.docx
Se dice que un proceso está en estado de ejecución si tiene asignado el CPU. Se dice que un proceso está en
estado listo si pudiera utilizar un CPU en caso de haber uno disponible. Un proceso está en estado bloqueado si
esta esperando algún evento antes de proseguir su ejecución.
Cuando se admite una tarea en el sistema, se crea el proceso correspondiente y se inserta normalmente al
final de la lista de procesos listos. El proceso se desplaza poco a poco hacia el frente de la lista de procesos listos, a
medida que los procesos que se encuentran antes que él completan su turno de uso del CPU.
Despachar(x_proceso): Listo  Ejecución.
Cuando el proceso llega al principio de la lista, se le asigna el CPU cuando este queda disponible y entonces se
dice que hay una transición de estado del estado listo al estado de ejecución. A la asignación del procesador al
primer proceso de la lista de procesos listos se le llama despacho.
Tiempo Expirado(x_proceso): Ejecución  Listo.
Para evitar que un proceso monopolice el sistema, en forma accidental o intencional, el sistema operativo
utiliza un reloj de interrupción por hardware (también llamado cronómetro de intervalos) para que las tareas de
ese usuario se ejecuten durante un intervalo específico de tiempo o cuanto (quantum). Si el proceso no libera
voluntariamente el CPU antes de que expire el cuanto, el reloj genera una interrupción, haciendo que el sistema
operativo retome el control. El sistema operativo envía al proceso que se estaba ejecutando a la lista de procesos
listo y procede a ejecutar el primero de la lista de procesos listos.
Bloquear(x_proceso): Ejecución  Bloqueado.
Si el proceso que se está ejecutando inicia una operación de entrada/salida antes de que expire su cuanto,
libera voluntariamente al CPU, es decir, el proceso se bloquea a sí mismo esperando que se complete la operación
de entrada salida.
Despertar(x_proceso): Bloqueado  Listo.
Cuando se completa una operación de entrada/salida o algún otro evento que espere un proceso. El proceso
realiza la transición del estado bloqueado al estado listo.

6.1.3 Bloque de control de proceso


Cada proceso se presenta en el sistema operativo con un bloque de control de proceso (PCB, process control
block), también llamado bloque de control de tarea. El PCB es una estructura de datos que contiene muchos
elementos de información asociados a un proceso específico, incluidos los siguientes:

- Estado del proceso: El estado puede ser, nuevo, listo, en ejecución, en espera, detenido, etc.
- Contador de programa: El contador indica la dirección de la siguiente instrucción que se ejecutará para este
proceso.
- Registros de CPU: El número y el tipo de los registros varía dependiendo de la arquitectura del computador.
Los registros incluyen acumuladores, registros índice, punteros de pila y registros de propósito general, así
como cualesquier información de códigos de condición que haya. Junto con el contador de programa, esta
información de códigos de estado se debe guardar cuando ocurre una interrupción, para que le proceso
pueda continuar correctamente después.
- Información de planificación de CPU: Esta información incluye una prioridad del proceso, punteros a colas
de planificación y cualesquier otros parámetros de planificación que haya.
- Información de gestión de memoria: Esta información puede incluir datos tales como el valor de los
registros de base y límite, las tablas de páginas o las tablas de segmentos, dependiendo del sistema de
memoria empleado por el sistema operativo.
21
51608191.docx
- Información contable: Esta información incluye la cantidad de tiempo de CPU y tiempo real consumida,
límites de tiempo, números de cuenta, números de trabajo o proceso, y demás.
- Otra información relevante: Un apuntador hacia el padre del proceso (hacia el proceso que lo creó),
apuntadores a los hijos del proceso en el caso de tener procesos creados por él, apuntadores a los recursos
asignados del proceso, un área para salvaguarda de los registros, el procesador en que se está ejecutando
el proceso (en el caso de múltiples procesadores).

6.2 Operaciones sobre procesos


Los proceso del sistema se pueden ejecutar en forma concurrente, y se deben crear y eliminar
dinámicamente. Por ello, el sistema operativo debe contar con un mecanismo para crear y terminar procesos.

6.2.1 Creació n de procesos


Un proceso pude crear varios procesos nuevos, a través de una llamada al sistema de “crear procesos”,
durante el curso de su ejecución. El proceso creador se denomina proceso padre, y los nuevos procesos son los
hijos de ese proceso. Cada uno de estos procesos nuevos puede a su vez crear otros procesos, formando un árbol
de procesos.
En general, un proceso necesita ciertos recursos (tiempo de CPU, memoria, archivos, dispositivos de E/S) para
efectuar su tarea. Cuando un proceso crea un subproceso, éste tal vez pueda obtener sus recursos directamente
del sistema operativo, pero podría estar restringido a un subconjunto de los recursos del proceso padre. El padre
quizá tenga que dividir sus recursos entre sus hijos, o tal vez varios de sus hijos puedan compartir algunos recursos
(como memoria o archivos). La restricción de un proceso hijo a un subconjunto de los recursos del padre impide
que cualquier proceso sobrecargue el sistema creando demasiados subprocesos.
Además de los diversos recursos físicos y lógicos que un proceso obtiene cuando se crea, el proceso padre
podría pasar a su hijo datos de iniciación (entrada).
Cuando un proceso crea un proceso nuevo, hay dos posibilidades en términos de ejecución:
- El padre sigue ejecutándose de forma concurrente con sus hijos.
- El padre espera hasta que algunos de sus hijos, o todos, han terminado.

También hay dos posibilidades en términos del espacio de direcciones del nuevo proceso:
- El proceso hijo es un duplicado del proceso padre.
- Se carga un programa del proceso hijo.

6.2.2 Terminació n de procesos


Un proceso acaba cuando termina de ejecutar su último enunciado y le pide al sistema operativo que lo
elimine. En ese momento, el proceso podría devolver datos (salidas) a su proceso padres. El sistema operativo
liberará todos los recursos del proceso, incluidos memoria física y virtual, archivos abiertos y buffers de E/S.
Hay otras circunstancias en las que ocurre la terminación. Un proceso puede causar la terminación de otro con
una llamada apropiada al sistema (por ejemplo, abortar). Normalmente, sólo el padre del proceso que se
terminará puede emitir la llamada. De otro modo, los usuarios podrían matar arbitrariamente los trabajos de otros
usuarios.
Un padre podría terminar la ejecución de unos de sus hijos por diversas razones como:
22
51608191.docx
- El hijo se ha excedido en la utilización de algunos de los recursos que se le asignaron.
- La tarea que se asignó al hijo ya no es necesaria.
- El padre va a salir, y el sistema operativo no permite que un hijo continúe si su padre termina.
En muchos sistemas, si un proceso termina (sea normal o anormalmente), todos sus hijos tiene que terminar.
Este fenómeno se denomina terminación en cascada y por lo regular es el sistema operativo quien lo inicia.

Los sistemas que administran procesos deben ser capaces de realizar ciertas operaciones sobre procesos:
 Crear un proceso implica:
1. Darle un nombre al proceso.
2. Dar de alta en la lista de procesos conocidos del sistema o de la tabla de procesos (insertar).
3. Determinar la prioridad inicial del proceso.
4. Crear el PCB de ese proceso.
5. Asignar recursos al proceso.

 Destruir un proceso implica:


1. Eliminarlo de la lista de procesos, no solamente del sistema.
2. Los recursos que estaba utilizando se devuelven al sistema.
3. El PCB se borra.

 Suspender un proceso. Un proceso suspendido no puede proseguir hasta que los reanuda otro proceso. La
suspensión dura por lo regular breves momentos o breves periodos de tiempo. El sistema efectúa
suspensiones par eliminar temporalmente ciertos procesos y así reducir la carga del sistema durante
situaciones de carga máxima. Cuando hay suspensiones largas se deben liberar los recursos del proceso.
 Reanudar un proceso. Reanuda o activar un proceso implica reiniciarlo a partir del punto en le que se
suspendió.
 Bloquear un proceso.
 Despertar un proceso.
 Despachar un proceso.
 Permitir que proceso se comunique con otros (comunicación entre procesos).
 Cambiarle la prioridad a un proceso.

6.2.3 Suspensió n de un proceso


Razones por las que se puede suspender un proceso:
- Si un sistema está funcionando mal y es probable que falle se puede suspender los procesos activos para
reanudarlos cuando se haya corregido el problema.
- Un usuario que desconfíe de los resultados parciales de un proceso puede suspenderlo en lugar de
abortarlo hasta que verifique si el proceso funciona correctamente o no.

23
51608191.docx
- Algunos procesos se pueden suspender como respuesta a las fluctuaciones a corto plazo de la carga del
sistema y reanudarse cuando las cargas regresen a niveles normales.

6.2.3.1 Estados de Suspensión


Se ha añadido dos nuevos estados denominados: Suspendido_Listo y Suspendido_Bloqueado, por lo que
contaremos con estados activos que vimos con anterioridad, y estados de suspensión.
Tenemos que, una suspensión puede ser iniciada por el propio proceso o por otro. En un sistema con un solo
procesador, el proceso en ejecución puede suspenderse a sí mismo, ningún otro proceso podría estar en ejecución
para realizar la suspensión.
Suspender(x_proceso): Listo  Suspendido_Listo.
Solamente otro proceso puede suspender un proceso listo.
Reanudar(x_proceso): Suspendido_listo  Listo
Un proceso puede hacer que otro proceso que se encuentre en estado suspendido_listo pase al estado listo.
Suspender(x_proceso)Bloqueado  Suspendido_Bloqueado
Un proceso puede suspender a otro que este bloqueado.
Reanudar(x_proceso): Suspendido_Bloqueado  Bloqueado
Un proceso puede reanudar otro proceso que este Suspendido_Bloqueado.

Transacciones:
Suspender(x_proceso): Listo  Suspendido_Listo
Despachar(x_proceso): Listo  Ejecución.
Suspender(x_proceso): Ejecución  Suspendido_Listo
Reanudar(x_proceso): Suspendido_Listo  Listo
Tiempo execedido(x_proceso) Ejecución  Listo
Suspender(x_proceso): Bloqueado  Suspendido_Bloqueado
Completar(x_proceso): Bloqueado  Listo
Reanudar(x_proceso): Suspendido_Bloqueado  Bloqueado
Completar(x_proceso): Suspendido_Bloqueado  Suspendido_Listo
Espera(x_proceso): Ejecución  Bloqueado

6.3 Interrupciones
Interrupción. Es un evento que altera la secuencia en que le procesador ejecuta las instrucciones. La
interrupción es generada por el hardware del sistema
Cómo puede hacerse una llamada al sistema:
1) El programa del usuario captura el kernel
2) El sistema operativo determina el número de servicio que se pide

24
51608191.docx
3) El sistema operativo localiza y llama a un procedimiento de servicio
4) El control se devuelve al programa del usuario
Cuando se genera una interrupción:
1. El sistema operativo toma el control, es decir, el hardware pasa el control al sistema operativo.
2. El sistema operativo guarda el estado del proceso interrumpido, en muchos sistemas esta información se
guarda en el PCB del proceso interrumpido.
3. El sistema operativo analiza la interrupción y transfiere el control a la rutina apropiada para atenderla. En
algunos sistemas el hardware se encarga de esto automáticamente.
4. La rutina del manejador de interrupciones procesa la interrupción.
5. Se restablece el estado del proceso interrumpido o del siguiente proceso.
6. Se ejecuta el proceso interrumpido o el siguiente proceso.

Una interrupción puede ser generada específicamente por un proceso en ejecución en cuyo caso le suele
denominar trampa o trap y se dice que está sincronizada con la operación del proceso o bien puede ser causada
por algún evento que puede estar relacionado o no con el proceso en ejecución en cuyo caso se dice que es
asíncrona con la operación en proceso.

6.3.1 Tipos de interrupciones


 Interrupción SVC (Supervisor Call). Son iniciadas por un proceso en ejecución que ejecute una instrucción
SVC. Una interrupción SVC es una petición generada por el usuario de un servicio en particular del sistema.
Puede ser ejecutar una operación de E/S, obtener más memoria, o comunicarse con el operador del
sistema. Un usuario no puede entrar arbitrariamente al sistema operativo, debe solicitar permiso por medio
de una SVC. El sistema operativo esta enterado de los usuarios que intentan rebasar sus límites y puede
rechazar ciertas peticiones si el usuario no cuenta con los privilegios necesarios.
 Interrupciones de E/S. Son iniciadas por hardware de E/S. Este tipo de interrupciones indican al CPU el
cambio de estado de algún canal o un dispositivo. Se producen cuando finaliza una operación de
entrada/salida o cuando un dispositivo pasa al estado listo.
 Interrupciones externas. Son causadas por diversos eventos, incluyendo la expiración de un cuanto
(quantum de reloj) que interrumpe, cuando pulsamos la tecla de interrupción de la consola o bien cuando
recibimos la señal de otro procesador, esto en el caso un sistema de múltiples procesadores.
 Interrupciones de reinicio. Cuando se oprime el botón de reinicio de la consola o se llegara desde otro
procesador una señal de reinicio.
 Interrupciones de verificación del programa. Son causadas por una amplia gama de problemas que pueden
ocurrir cuando se ejecutan las instrucciones en lenguaje de máquina de un programa, dichos problemas
incluyen:
o Una división entre cero.
o El exceso o defecto de los números que pueden ser manejados por las operaciones aritméticas.
o La presencia de datos con formato erróneo.
o EL intento de ejecutar un código de operación inválido.
o El intento de hacer referencia a una localidad de memoria que este fuera de los límites de la
memoria real.
25
51608191.docx
o El intento por parte de un usuario no privilegiado de hacer uso de una instrucción privilegiada o el
intento de hacer uso de un recurso protegido.
 Interrupciones por Verificación de máquina. Son ocasionadas por el mal funcionamiento del hardware.

6.3.2 Cambio de contexto


En el esquema de las interrupciones de los procesadores a alta escala se maneja mediante el sistema
operativo rutinas denominadas manejadores de interrupciones de primer nivel o FLIH (First Level Interrup
Handlers) para procesar las diferentes clases de interrupciones. Existe un manejador de interrupciones de primer
nivel por cada tipo de interrupción.
Cuando ocurre una interrupción, el sistema operativo guarda el estado del proceso interrumpido y transfiere
el control al manejador de interrupciones del primer nivel apropiado. El cambio de la CPU a otro proceso se
denomina conmutación de contexto (context switch). Los manejadores de primer nivel deben distinguir entre
interrupciones de la misma clase; el procesamiento de estas interrupciones es realizado entonces por alguno de
los manejadores de interrupciones de segundo nivel.

6.3.3. Palabras de Estado o PSW (Program Status Word)


Las palabras de estado del programa controlan el orden de ejecución de las instrucciones y contienen
información acerca del estado de un proceso. Hay tres tipos de PSW: nuevas, actuales y antiguas.
La dirección de la siguiente instrucción que se debe ejecutar se almacena en la PSW actual que indica también
los tipos de interrupciones habilitadas e inhabilitadas de ese momento. El CPU permite que ocurran las
interrupciones habilitadas; las interrupciones inhabilitadas permanecerán pendientes y sólo en algunos casos se
pasarán por alto.
El procesador nunca puede estar inhabilitado para una interrupción SVC o para una de reinicio o para ciertas
interrupciones de verificación del programa.
En un sistema de un procesador solo hay una PSW actual, seis nuevas y seis antiguas, una por cada tipo de
interrupción.
La PSW nueva para algún tipo de interrupción contiene la dirección permanente de la memoria principal en la
que reside el manejador de interrupciones correspondiente.
Cuando ocurre una interrupción, si el procesador no está inhabilitado para este tipo de interrupción, el
hardware automáticamente cambia la PSW como sigue:
1. Se guarda la PSW actual en la PSW antigua de este tipo de interrupción.
2. Se guarda la PSW nueva de este tipo de interrupción en la PSW actual.
Después de este intercambio de PSW, la PSW actual contendrá la dirección del manejador de interrupciones
apropiado y este ejecutará y procesará la interrupción.

6.4 Nú cleo del Sistema Operativo (Nucelos/Kernel/Core)


Todas las operaciones en las que participan procesos son controladas por la parte del sistema operativo
llamada núcleo. El núcleo normalmente representa solo una pequeña parte de lo que por lo general se piensa que
es todo el sistema operativo pero también es el código que más se utiliza. Reside por lo regula en la memoria
principal mientras que otras partes del sistema operativo son cargadas solo cuando se necesitan. Una de las
funciones más importantes incluidas en ese núcleo es el procesamiento de interrupciones. El núcleo inhabilita las

26
51608191.docx
interrupciones cuando atiende una interrupción y las habilita nuevamente una vez que ha completado el
procesamiento de la interrupción. Cuando se da un flujo continuo de interrupciones, es posible que el núcleo deje
inhabilitadas las interrupciones por un periodo largo, esto puede ocasionar un elevado tiempo de respuesta a las
interrupciones. Por esta razón los núcleos son diseñados para realizar el “mínimo” posible de procesamiento en
cada interrupción y dejar que el resto lo realice el proceso apropiado del sistema, que puede operar mientras el
núcleo se habilita para atender otras operaciones. Lo que se traduce en que las interrupciones permanecen
habilitadas un porcentaje mucho mayor del tiempo y que el sistema responde mejor.

Resumen de las funciones del núcleo del sistema operativo


1. Manejo de interrupciones.
2. Crear y destruir procesos.
3. El cambio de los estados de los procesos.
4. El despacho de los procesos.
5. Suspender y reanudar un proceso.
6. Sincronización de los procesos.
7. La comunicación entre procesos.
8. EL manejo de los bloques de control de procesos.
9. Apoyo a las actividades de entrada/salida.
10. Asignación y liberación de memoria.
11. El apoyo para el sistema de archivos.
12. Apoyo para el mecanismo de llamada y retorno de un procedimiento.
13. Apoyo para ciertas funciones de contabilidad del sistema.

6.4.1 Habilitació n e Inhabilitació n de Interrupciones


Al núcleo del sistema operativo solo puede llegarse mediante una interrupción. El núcleo inhabilita las
interrupciones mientras responde a la interrupción que está procesando. Una vez que se determina la causa de la
interrupción, el núcleo pasa el tratamiento de la interrupción a un proceso específico del sistema que se ha
diseñado para manejar ese tipo de interrupciones.

7 Planificación de trabajos y del procesador


En la planificación del procesador se estudian los problemas de cuándo asignar procesadores y a cuáles
procesos asignarlos, también se considera la admisión de nuevas tareas en el sistema, la suspensión y reactivación
de procesos para ajustar la carga del sistema.

7.1 Niveles de planificació n

27
51608191.docx
 Planificación de Alto Nivel. Planificación de trabajo. Determina cuáles trabajos podrán competir
activamente por los recursos del sistema o bien cuales trabajos deben admitirse por lo que también la
llamamos planificación de admisión.
 Planificación de Nivel Intermedio. Determina que procesos pueden competir por el CPU. Responde a las
fluctuaciones temporales en la carga del sistema mediante la suspensión temporal y la activación
(reanudación) de procesos para lograr una operación más fluida del sistema y ayuda a alcanzar ciertas
metas globales del rendimiento del sistema. Actúa como amortiguador entre la admisión de los trabajos y
la asignación del CPU a esos trabajos.
 Planificación de Bajo Nivel. Determina a cuál proceso listo se le asignará el CPU cuando éste se encuentre
disponible y se encargará de asignar el CPU a ese proceso. Se lleva a cabo mediante el despachador y este
debe residir en la memoria principal.

7.1.2 Objetivos de la planificació n


En el diseño de un disciplina de planificación deben ser considerados varios objetivos, mismos que suelen caer
en conflicto haciendo esto un tanto más complejo.
 Ser justa.- Una disciplina de planificación es justa si todos los procesos se tratan de la misma forma y
ningún proceso se queda en aplazamiento indefinido.
 Elevar al máximo la producción y el rendimiento. – Una disciplina de planificación debe de tratar de
atender el mayor número posible de procesos por unidad de tiempo.
 Aumentar al máximo el número de usuarios interactivos que reciben respuesta en tiempo aceptables
(segundos).
 Ser predecible.- Una tarea debe ejecutarse aproximadamente en el mismo tiempo y casi al mismo costo
sea cual sea la carga del sistema.
 Equilibrar el aprovechamiento de los recursos.- Los mecanismos de planificación deben mantener
ocupados los recursos del sistema. Deben favorecer los procesos que requieren los recursos poco
utilizados.
 Evitar el Aplazamiento Indefinido.- La mejor manera de evitarlo es el empleo del envejecimiento, es decir,
mientras un proceso espera un recurso, su prioridad debe crecer. En algún momento, la prioridad será tan
alta que el recurso se asignará al proceso.
 Imponer prioridades.- En los ambientes en que se asignan prioridades a los procesos, los mecanismos de
planificación deben favorecer a los procesos de alta prioridad.
 Degradarse paulatinamente con las cargas pesadas.- Un mecanismo de planificación no debe
desplomarse bajo el peso de una carga fuerte en el sistema. Debe evitar la carga excesiva impidiendo la
creación de procesos nuevos cuando la carga es pesada, o bien debe dar servicio a la carga mayor con una
reducción moderada del nivel de atención a todos los procesos.
____

7.1.3 Planificació n no expropiativa y expropiativa


Una disciplina de planificación es no expropiativa si una vez que le ha sido asignado el CPU a un proceso, ya no
se le puede arrebatar. En los sistemas no expropiativos, los trabajos largos retrasan a los cortos, pero el
tratamiento para todos los procesos es más justo.
Una disciplina de planificación es expropiativa si al proceso se le puede arrebatar el CPU. La planificación
expropiativa es importante en aquellos sistemas de planificación en los cuales los procesos de alta prioridad
requieren atención rápida.
28
51608191.docx

7.1.4 Prioridades
Las prioridades pueden ser asignadas en forma automática por el sistema, o bien se pueden asignar
externamente. Pueden ganarse o comprarse. Pueden ser estáticas o dinámicas. Pueden asignarse en forma
racional, o de manera arbitraria en situaciones en la que un mecanismo del sistema necesita distinguir entre
procesos pero no le importa cual de ellos es en verdad más importantes.
 Prioridades estáticas.- Son aquellas prioridades que no cambian, es decir, no responden a los cambios en
el ambiente que podrían hacer necesario un ajuste de prioridades. Se mantienen constantes mientras
dura el proceso.
 Prioridades dinámicas.- Son aquellas prioridades que responden a los cambios. La prioridad inicial
asignada a un proceso tiene una duración corta, después de lo cual se ajusta a un valor más apropiado.
Cambian en respuesta a los cambios del as condiciones del sistema.
 Prioridades compradas.- Son aquellas que tienen un precio monetario, en la cual el usuario compra un
nivel más alto de servicio.

7.1.5 Planificador de CPU


Siempre que la CPU está ociosa, el sistema operativo debe escoger uno del os procesos que están en la cola de
procesos listos para ejecutarlo. El proceso de selección corre por cuenta del planificador a corto plazo (o
planificador de CPU), el cual escoge uno de los procesos que están en la memoria y listos para ejecutarse, y le
asigna la CPU.

7.1.6 Despachador
Otro componente que interviene en la función de planificación de la CPU es el despachador (dispatcher). Éste
es el módulo que cede el control de la CPU al proceso seleccionado por el planificador a corto plazo. Esta función
implica:
- Cambiar de contexto.
- Cambiar a modo de usuario.
- Saltar al punto apropiado del programa del usuario para reiniciar ese programa.
El despachador debe ser lo más rápido posible, porque se invoca en cada conmutación de proceso. El tiempo
que el despachador tarda en detener un proceso y poner otro en ejecución se denomina latencia del despachador.

7.2 Criterios de planificació n


Los diferentes algoritmos de planificación de la CPU tienen diferentes propiedades y podrían favorecer a una
clase de procesos más que a otra.
Se han sugerido muchos criterios para comparar los algoritmos de planificación de la CPU. Los criterios
empleados son, entre otros:
 Utilización de la CPU: Queremos mantener la CPU tan ocupada como se pueda. La utilización de la CPU
puede variar entre 0% y 100%. En un sistema real, deberá variar entre el 40% (en un sistema con poca
carga) y el 90% (en un sistema muy cargado).

29
51608191.docx
 Rendimiento: Si la CPU está ocupada ejecutando procesos, se está efectuando trabajo. Una medida del
trabajo es el número de procesos que se completan por unidad de tiempo: el rendimiento. En el caso de
procesos largos, esta tasa podría ser de un proceso por hora; en el caso de transacciones cortas, el
rendimiento podría ser de 10 procesos por segundo.
 Tiempo de retorno: Desde el punto de vista de un proceso en particular, el criterio importante es el
tiempo que tarda la ejecución de ese proceso. El intervalo entre el momento de presentación de un
proceso y el momento en que se termina es el tiempo de servicio, y es la suma de los periodos durante los
cuales espera entrar en la memoria, espera en la cola de procesos listos, se ejecuta en la CPU y realiza E/S.
 Tiempo de espera: el algoritmo de planificación de la CPU no afecta la cantidad de tiempo que un proceso
pasa ejecutándose o realizando E/S; sólo afecta el tiempo que un proceso pasa esperando en la cola de
procesos listos. El tiempo de espera es la suma de los periodos que el proceso pasa esperando en dicha
cola.
 Tiempo de respuesta: En un sistema interactivo, el tiempo de retorno tal vez no sea el mejor criterio. Es
común que un proceso pueda producir algunas salidas en poco tiempo, y pueda seguir calculando nuevos
resultados mientras los anteriores se están presentando al usuario. Por ello, otra medida es el tiempo que
transcurre entre la presentación de una solicitud y la producción de la primera respuesta. Esta medida,
llamada tiempo de respuesta, es el tiempo que el proceso tarda en comenzar a responder, pero no incluye
el tiempo que toma exhibir la respuesta. El tiempo de retorno generalmente está limitado por la velocidad
del dispositivo de salida.
___

7.3 Algoritmos de planificació n


La planificación de la CPU se ocupa del problema de decidir cuál de los procesos que están en la cola de
procesos listos debe recibir la CPU.

7.3.1 Planificació n a plazo fijo


Se programan ciertos trabajos para terminarse en un tiempo específico. Los trabajos pueden tener un gran
valor si son entregados a tiempo y carecer de él si son entregados fuera del plazo, por lo que algún usuario puede
estar dispuesto a pagar extra para asegurar que sus trabajos sean entregados a tiempo.

7.3.2 Planificació n de “servicios por orden de llegada”


Por mucho, el algoritmo de planificación del a CPU más sencillo es el de servicio por orden de llegada (FCFS,
first-come, first served). Con este esquema, el proceso que primero solicita la CPU la recibe primero. Los procesos
se despachan de acuerdo a su tiempo de llegada a la cola de procesos listos. Es una disciplina no exapropiativa. La
implementación de la política FCFS es fácil con una cola FIFO. Cuando un proceso ingresa en la cola de procesos
listos, su PCB se enlaza al final de la cola. Cuando la CPU queda libre, se asigna al proceso que está a la cabeza de
la cola. Acto seguido, el proceso en ejecución se saca de la cola.

7.3.3 Planificació n de “primero el trabajo má s corto”


Un enfoque de planificación de la CPU diferente es el algoritmo de primero el trabajo más corto (SJF, shortest
job first), que asocia a cada proceso la longitud de la siguiente ráfaga de CPU de ese proceso. Cuando la CPU
queda disponible, se asigna al proceso cuya siguiente ráfaga de CPU sea más corta. Si hay dos procesos cuyas
siguientes ráfagas de CPU tienen la misma duración, se emplea planificación FCFS para romper el empate. Es una
disciplina no expropiativa utilizada sobre todo para trabajos por lotes.
30
51608191.docx

7.3.4 Planificació n por prioridad


El algoritmo SJF es un caso especial del algoritmo de planificación por prioridad general. Se asocia una
prioridad a cada proceso, y la CPU se asigna al proceso que tiene la prioridad más alta. Los procesos con la misma
prioridad se planifican en orden FCFS.
Un problema importante de los algoritmos de planificación por prioridad es el bloqueo indefinido o inanición
(starvation). Podemos considerar que un proceso que está listo para ejecutarse pero que no tiene la CPU está
bloqueado en espera de la CPU. Un algoritmo de planificación por prioridad podría dejar a algunos procesos de
baja prioridad esperando indefinidamente la CPU.
Una solución al problema del bloqueo indefinido de procesos de baja prioridad es el envejecimiento (aging):
una técnica que consiste en aumentar gradualmente la prioridad de los procesos que esperan mucho tiempo en el
sistema.
Un ejemplo del uso de esta solución es la planificación por “prioridad de la tasa de respuesta más alta”. Siendo
una disciplina no expropiativa en la cual la prioridad de cada trabajo no sólo es función del tiempo de servicio, sino
también del tiempo que ha esperado el trabajo para ser atendido.
____

7.3.5 Planificació n por turno circular (RR, round-robin)


Es una disciplina expropiativa. Los procesos se despachan en forma Primero en Entrar Primero en Salir, pero
se les asigna una cantidad limitada de tiempo de CPU conocida como cuanto o quantu,. Si un proceso no termina
antes de que expire su tiempo de CPU, se le quitará el CPU y éste se le asignará al siguiente proceso en espera, el
proceso desposeído se colocará al final de la cola de procesos listos.

7.3.5.1 Planificación por tiempo restante más corto ( SRT, Shortest-remaining-time scheduling)
Es la contraparte expropiativa de SJF. En SRT, el proceso con el menor tiempo estimado de ejecución para
terminar es el primero en ejecutarse, incluyendo los procesos nuevos. Un proceso en ejecución puede ser
despojado por un proceso nuevo con un tiempo estimado de ejecución más pequeño.

7.3.6 Planificació n con colas de mú ltiples niveles


Se ha creado otra clase de algoritmos de planificación para situaciones en las que es fácil clasificar los procesos
en diferentes grupos. Por ejemplo, suele hacerse una división entre los procesos que se ejecutan en primer plano
(interactivos) y los que lo hacen en segundo plano (por lotes). Estos dos tipos de procesos tienen diferentes
necesidades en cuanto al tiempo de respuesta, así que podrían tener diferentes necesidades de planificación.
Además, los procesos de primer plano podrían tener mayor prioridad (definida externamente) que los de segundo
plano.
Un algoritmo de planificación con colas de múltiples niveles divide la cola de procesos listos en varias colas
distintas. Los procesos se asignan permanentemente a una cola, casi siempre con base a alguna propiedad del
proceso, como tamaño de memoria, prioridad del proceso o tipo de proceso. Cada cola tiene su propio algoritmo
de planificación. Además, debe haber planificación entre las colas.
Ejemplo de algoritmo de planificación con colas múltiples niveles:
1. Procesos del sistema

31
51608191.docx
2. Procesos interactivos
3. Procesos de edición interactiva
4. Procesos por lotes
5. Procesos de estudiantes
Ya que la cola de primer plano podría tener prioridad absoluta sobre la cola de segundo plano, en el ejemplo,
ningún proceso de la cola de procesos por lotes se podrá ejecutar si no están vacías las colas de los procesos del
sistema, procesos interactivos y procesos de edición interactivo. Si un proceso de edición interactiva ingresa en la
cola de procesos listos mientras se está ejecutando un proceso por lotes, éste será desalojado.

7.3.7 Planificació n con colas de mú ltiples niveles y realimentació n


En un algoritmo de planificación con colas de múltiples niveles, lo normal es que los procesos se asignen
permanentemente a una cola al ingresar en el sistema. Los procesos no se mueven de una cola a otra. Por
ejemplo, si hay colas distintas para los procesos de primer y segundo plano, los procesos no se pasarán de una
cola a la otra, ya que su naturaleza ( de primer o segundo plano ) no cambia. Éste método es inflexible.
La planificación con colas de múltiples niveles y realimentación, en cambio, permite a un proceso pasar de una
cola a otra. La idea es separar procesos con diferentes características en cuanto a sus ráfagas de CPU. Si un
proceso gasta demasiado tiempo de CPU, se le pasará a una cola con menor prioridad. Este esquema deja los
procesos limitados por E/S y los procesos interactivos en las colas de más alta prioridad. Así mismo, si un proceso
espera demasiado tiempo en una cola de baja prioridad podría pasarse a una de mayor prioridad. Esta forma de
envejecimiento evita la inanición.
___

7.4 Comunicació n entre procesos


Los procesos con frecuencia necesitan comunicarse con otros procesos. Cuando un proceso del usuario desea
leer el contenido de un archivo, éste debe señalar al proceso del archivo lo que desea. Después el procesos del
archivo tiene que indicar al proceso del disco que lea el bloque que se pide.
En algunos sistemas operativos, los procesos que trabajan en conjunto con frecuencia comparten algún
almacenamiento común que cada uno puede leer y escribir. El almacenamiento compartido puede ubicarse en la
memoria o bien puede ser un archivo compartido; la localidad de la memoria compartida no altera la naturaleza
de la comunicación o los problemas que se presentan.
Situaciones donde dos o más procesos leen o escriben algunos datos compartidos y el resultado final depende
de cuál se ejecuta en un momento preciso, se denominan condiciones de concurso.
¿Cómo se evitan las condiciones de concurso? La clave para prevenir el problema aquí y en muchas otras
situaciones en que interviene la memoria compartida, archivos compartidos y todo lo demás que se comparte,
consiste en determinar alguna manera de prohibir que un procesos lea y escriba los datos compartidos al mismo
tiempo. La exclusión mutua se llama a la situación en la cual los procesos cooperan de tal forma que, mientras un
proceso obtiene acceso a datos compartidos modificables, los demás procesos no pueden hacer los mismo.
La sección crítica de un procesos es aquella parte del programa donde se accesa la memoria compartida.
Las diversas proposiciones para lograr la exclusión mutua con espera ocupada son: desactivación de
interrupciones, variables de cierre, alternancia estricta, solución de Peterson, instrucción de TSL.
___

32
51608191.docx
8 Almacenamiento Real
La organización y administración de la memoria principal o memoria primaria o memoria real de un sistema de
computación ha sido uno de los factores más importantes en el diseño de los sistemas operativos.

8.1 Organizació n del almacenamiento


Por organización del almacenamiento se entiende la manera de considerar este almacenamiento,. ¿Se coloca
un solo usuario en la memoria principal o se colocan varios al mismo tiempo? Si se encuentran varios programas
del usuario en el almacenamiento principal, ¿se concede a cada uno la misma cantidad de espacio o se divide el
almacenamiento en varias porciones, llamadas particiones, de diferentes tamaños? ¿Se harán las particiones del
almacenamiento principal de una manera rígida, con las particiones definidas para un largo periodo de tiempo, o
se proporciona una partición mas dinámica que permita a los sistemas de computación adaptarse rápidamente a
los cambios impuestos por las necesidades de los trabajos de los usuarios? ¿Se requerirá que los trabajos de los
usuarios sean diseñados para funcionar en una partición específica, o se permitirá que los trabajos se ejecuten en
cualquier parte donde quepan? ¿Se requerirá que cada trabajo sea colocado en un bloque contiguo de localización
de almacenamiento o se permitirá dividir los trabajos entre varios bloques separados y colocarlos en cualesquiera
ranuras disponibles del almacenamiento principal?

8.2 Administració n del almacenamiento


Con independencia del esquema de organización del almacenamiento que se adopte para un sistema
determinado, hay que decidir las estrategias que se van a usar para obtener un rendimiento óptimo. Las
estrategias de administración del almacenamiento determinan el rendimiento de una organización del
almacenamiento con varias estrategias: ¿Cuándo se consigue un nuevo programa para colocar en la memoria? ¿Se
consigue cuando el sistema lo pide de forma específica o se intenta anticiparse a las peticiones del sistema?
¿dónde, dentro del almacenamiento principal colocaremos el programa que va a ser ejecutado a continuación?
¿Colocamos los programas lo más apretados posibles dentro de las ranuras disponibles de la memoria para reducir
al mínimo el desperdicio de espacio, o se colocan los programas lo más rápido posible para ahorrar tiempo de
ejecución?
Si un nuevo programa necesita ser colocado en el almacenamiento principal y éste está lleno, ¿cuál de los
otros programas se desplazará? ¿Deben reemplazarse los programas más antiguos, aquellos que se utilizan con
menor frecuencia, o aquellos que se han utilizado hace más tiempo?

8.3 Estrategias de administració n del almacenamiento


Las estrategias de administración del almacenamiento se dividen en las categorías siguientes:
1. Estrategias de búsqueda:
a) Estrategias de búsqueda por demanda
b) Estrategias de búsqueda anticipada
2. Estrategias de colocación
3. Estrategias de reposición

Las estrategias de búsqueda están relacionadas con el hecho de cuándo obtener el siguiente fragmento de
programa, o de datos, para su inserción en el almacenamiento principal. La estrategia convencional de búsqueda
por demanda, donde el siguiente fragmento de programas, o de datos, es traído al almacenamiento principal
33
51608191.docx
cuando algún programa en ejecución hace referencia a él; en oposición a la estrategia de búsqueda anticipada
donde se intenta predecir adónde irá el control del programa en el paso siguiente para traer esa porción al
almacenamiento principal.
Las estrategias de colocación están relacionadas con la determinación del lugar dentro del almacenamiento
principal, donde va a ser colocado un programa nuevo. Las estrategias de colocación del almacenamiento de
primer ajuste, mejor ajuste y peor ajuste.
Las estrategias de reposición están relacionadas con la determinación de qué fragmentos de programa, o de
datos, desplazar, para dejar sitio a los programas nuevos.
___

8.4 Asignació n contigua de almacenamiento VS. No contigua


Los primeros sistemas computacionales requerían una asignación contigua de almacenamiento; cada
programa tenía que ocupar un bloque sencillo y contiguo de localizaciones de almacenamiento.
En la asignación no contigua de almacenamiento, un programa es dividido en varios bloques o segmentos que
pueden ser colocados a lo largo del almacenamiento principal en partes que no tienen que ser necesariamente
adyacentes.

8.4.1 Asignació n contigua de almacenamiento de un solo usuario


Los primeros sistemas de computación sólo permitían usar la máquina a una persona a la vez. Todos sus
recursos estaban a disposición del usuario.
El tamaño de los programas está limitado por la cantidad de almacenamiento principal, pero es posible
ejecutar programas más grandes que éste último por medio de recubrimientos. Si una sección particular del
programa no es necesaria durante todo el transcurso de su ejecución, entonces puede traerse otra sección desde
el almacenamiento secundario, para ocupar el almacenamiento utilizado por la sección que ya no se necesita.
En los sistemas de asignación contigua de un solo usuario, éste tiene un completo control sobre la totalidad
del almacenamiento principal. El almacenamiento está divido en una porción que contiene las rutinas del sistema
operativo, otra que contiene el programa del usuario, y una porción sin usar.. La cuestión de la protección es
simple: ¿Cómo puede protegerse el sistema operativo contra su destrucción por el programa del usuario?
La protección se implementa mediante un registro de límites, incorporado al CPU. Cada vez que el programa
de un usuario hace referencia a una dirección de almacenamiento, se comprueba el registro de límites para
asegurarse que el usuario no va a destruir el sistema operativo. El registro de límites contiene la dirección de la
instrucción más alta utilizada por el sistema operativo. Si el usuario intenta entrar en el sistema operativo,
entonces la instrucción es interceptada y el trabajo se termina con un mensaje de error apropiado.

8.4.2 Procesamiento por lotes de flujo ú nico


Los sistemas de un solo usuario se dedican a un trabajo durante más tiempo del que toma su ejecución. Los
trabajos requieren, en general, un tiempo considerable de instalación durante el cual se carga al sistema
operativo, se montan las cintas y paquetes de disco, las tarjetas se colocan en la lectora, los formatos apropiados
se colocan en la impresora, las tarjetas de tiempo se “perforan”, etc. Cuando los trabajos terminan, requieren de
una cantidad considerable de tiempo de descarga, mientras se retiran las cintas, tarjetas, paquetes de discos,
formas de impresoras, etc. Durante la instalación y descarga de los trabajos, el computador esta ocioso.
Los diseñadores comprendieron que si podían automatizar la transición de trabajo a trabajo, entonces podrían
reducir de forma considerable la cantidad de tiempo permitido entre trabajos. Esto llevó al desarrollo de sistemas
de procesamiento por lotes. En el procesamiento por lotes de flujo único, los trabajos se agrupan en lotes,
34
51608191.docx
colocando sus tarjetas de control reverso con reverso en la lectora de tarjetas ( o cargando los trabajos
consecutivamente en una cinta o disco). Un procesador de flujos de trabajos lee las instrucciones del lenguaje de
control de trabajos y facilita la preparación del trabajo siguiente. Emite directrices al operador del sistema y
ejecuta de forma automática muchas de las funciones que antes eran de ejecución manual. Cuando termina el
trabajo actual, el lector de flujos de trabajos lee automáticamente las instrucciones del lenguaje de control para el
siguiente trabajo y realiza una operación de mantenimiento apropiada para facilitar la transición del siguiente
trabajo.
___

8.5 Multiprogramació n de Partició n Fija


Aún con los sistemas operativos de procesamiento por lotes, los sistemas de un solo usuario siguen
desperdiciando una considerable cantidad de recursos computacionales.
Los diseñadores comprendieron de nuevo que podían incrementar de forma considerable la utilización del
CPU por medio de la administración intensiva. Esta vez, implementando los sistemas de multiprogramación, en los
cuales varios usuarios compiten al mismo tiempo por los recursos del sistema.
Para aprovechar al máximo las ventajas de la multiprogramación, es necesario que varios trabajos residan a la
vez en el almacenamiento principal del computador. Entonces, cuando un trabajo pida una operación de
entrada/salida, el CPU puede ser cambiado de inmediato a otro trabajo y realizar los cálculos sin dilación.

8.5.1 Multiprogramació n de partició n fija: traducció n y carga absolutas


En los primeros sistemas de multiprogramación, el almacenamiento principal estaba dividido en una serie de
particiones de tamaño fijo. Cada partición podía mantener un solo trabajo. El CPU se cambiaba rápidamente entre
los usuarios para crear la ilusión de simultaneidad.
Los trabajos se traducían con ensambladores y compiladores absolutos para ser ejecutados sólo dentro de una
partición específica. Si un trabajo estaba listo para su ejecución y se ocupaba su partición, entonces ese trabajo
debía esperar, aún cuando estuvieran disponibles otras particiones.

8.5.2 Multiprogramació n de partició n fija: traducció n y carga relocalizables


Los compiladores, ensambladores y cargadores de relocalización se usan para producir programas
relocalizables que puedan ser ejecutados en cualquier partición disponible de tamaño suficiente para aceptarlos.

8.5.3 Protecció n en los sistemas de multiprogramació n


En los sistemas de multiprogramación de asignación contigua, la protección suele implementarse con varios
registros de límites. Los extremos superior e inferior de una partición del usuario pueden ser delineados con dos
registros o pueden indicarse el límite inferior (o superior) y la longitud de la región. El usuario que necesita llamar
al sistema operativo tiene que utilizar una instrucción de llamada al supervisor. Esto permite al usuario cruzar el
límite del sistema operativo y pedir sus servicios.

8.5.4 Fragmentació n en la multiprogramació n de partició n fija


La fragmentación de almacenamiento ocurre en todos los sistemas de computación con independencia de su
organización de almacenamiento. En los sistemas de multiprogramación de partición fija, la fragmentación se

35
51608191.docx
produce cuando los trabajos del usuario no llenan completamente sus particiones designadas, o cuando una
partición permanece sin usar porque es demasiado pequeña par alojar un trabajo que se encuentra en espera.
___

8.6 Multiprogramació n de Partició n Variable


Los diseñadores de sistemas operativos, al observar los problemas de la multiprogramación de partición fija,
decidieron que una mejora notable sería permitir que los trabajos ocuparan tanto espacio (menor que la totalidad
del área de almacenamiento real) como necesitaran. No habría límite fijo. Este esquema se denomina
multiprogramación de partición variable.
En todos los esquemas de organización del almacenamiento implican algún grado de desperdicio. En la
multiprogramación de partición variable, el desperdicio no se evidencia hasta que los trabajos comienzan a
terminar y dejan agujeros en el almacenamiento principal. Estos agujeros pueden ser usados por otros trabajos,
pero aunque suceda esto, los agujeros restantes van haciendose más pequeños.

8.6.1 Combinació n de agujeros


Cuando un trabajo termina en un sistema de multiprogramación de partición variable, podemos comprobar si
el almacenamiento que libera tiene límites con otras áreas libres de almacenamiento (agujeros). Si ocurre esto,
entonces podemos registrar en el almacenamiento libre: 1) un agujero adicional, o 2) un solo agujero que
representa la fusión del agujero existente con el nuevo adyacente.
El proceso de fusionar agujeros adyacentes para formar uno sencillo más grande se llama combinación.

8.6.2 Compresió n (o compactació n) de almacenamiento


Aunque los agujeros estén combinados, suele suceder que los agujeros separados, distribuidos por todo el
almacenamiento principal, constituyen una cantidad significativa de almacenamiento.
La técnica de compresión de almacenamiento implica pasar todas las áreas ocupadas del almacenamiento a
uno de los extremos del almacenamiento principal. De manera convencional la compresión de almacenamiento se
denomina recogida de residuos.
___

8.6.3 Estrategias de colocació n del almacenamiento


Las estrategias de colocación del almacenamiento se utilizan para determinar, en el almacenamiento principal,
el lugar donde serán colocados los programas y datos que van llegando.
 Estrategia de mejor ajuste. Un trabajo nuevo, al llegar al almacenamiento principal, es colocado en el
agujero en el cual quepa de forma más ajustada y deje el menor espacio sin usar. Lista de almacenamiento
libre: mantiene en orden ascendente por tamaño de agujero.
 Estrategia de primer ajuste. Un trabajo nuevo, al llegar al almacenamiento principal, es colocado en el
primer agujero disponible con tamaño suficiente para acogerlo. Lista de almacenamiento libre : mantiene
en orden las direcciones de almacenamiento o, a veces, en orden aleatorio.
 Estrategia de peor ajuste. El peor ajuste consiste en colocar un programa en el almacenamiento principal,
en el agujero en el que quepa de la peor manera, es decir, en el agujero más grande posible. Lista de
almacenamiento libre: mantiene en orden descendente por tamaño de agujero.

36
51608191.docx
8.7 Multiprogramació n con intercambio de almacenamiento
En cada uno de los esquemas de multiprogramación estudiados hasta el momento, los programas del usuario
permanecen en la memoria principal hasta su terminación. Otro esquema, llamado intercambio, no requiere esto.
En algunos sistemas de intercambio, un trabajo ocupa el almacenamiento principal de inmediato. Este trabajo
se ejecuta hasta que ya no puede continuar y entonces cede el almacenamiento y el CPU al siguiente trabajo. Con
esto, la totalidad del almacenamiento se dedica a un trabajo durante un breve periodo, ese trabajo es entonces
retirado (es decir, intercambiado) y entra el nuevo. Un trabajo puede ser intercambiado varias veces, antes de
llegar a su terminación.
__

9 Organización del almacenamiento virtual

9.1 Introducció n
La memoria es una gran matriz de palabras o bytes, cada uno con su propia dirección. La CPU obtiene
instrucciones de la memoria según el valor del contador de programa. Estas instrucciones pueden hacer que se
carguen valores de direcciones de memoria específica o que se guarden en ellas.
Un ciclo de ejecución de instrucción representativo primero obtiene una instrucción de la memoria. Acto
seguido, la instrucción se decodifica y podría causar la obtención de operandos de la memoria. Una vez que se ha
ejecutado la instrucción con los operandos, podría almacenarse resultados en la memoria. Cabe señalar que la
unidad de memoria sólo ve una corriente de direcciones de memoria; no sabe cómo se generan (contador de
instrucciones, etc.) ni para qué son (instrucciones o datos). Por tanto, podemos olvidarnos de cómo un programa
genera una dirección de memoria; sólo nos interesa la secuencia de direcciones de memoria generada por el
programa en ejecución.

9.1.1 Vinculació n de direcciones


Normalmente, un programa reside en un disco como archivo binario ejecutable. Es proceso traer el programa
a la memoria y colocarlo dentro de un proceso para que se ejecute. Dependiendo de la gestión de memoria
empleada, el proceso podría transferirse entre el disco e y la memoria durante su ejecución. La colección de
procesos que están en el disco esperando que se les transfiera a la memoria para ejecutarse forma la cola de
entrada.
La mayor parte de los sistemas permiten a un proceso de usuario residir en cualquier parte de la memoria
física. Así, aunque el espacio de direcciones del computador comience en 00000, la primera dirección del proceso
de usuario no tiene que ser 00000. Esta organización afecta las direcciones que el programa de usuario puede
utilizar. En la mayor parte de los casos, un programa de usuario pasará por varias etapas (algunas de las cuales
podrían ser opcionales) antes de ejecutarse. Las direcciones podrían representarse de diferentes maneras en
dichas etapas,. Las direcciones del programa fuente generalmente son simbólicas (como CUENTA). Un compilador
por lo regular vincula tales direcciones simbólicas con direcciones reubicables ( como “14 bytes a partir del
principio de este módulo”). El editor de enlace o cargador, a su vez, vinculará estas direcciones reubicables con
direcciones absolutas (como 75014). Cada vinculación es un a trasformación de un espacio de direcciones a otro.
Tradicionalmente, la vinculación de instrucciones y datos con direcciones de memoria se puede efectuar en
cualquier etapa del camino:
- Compilación: Si en el momento de la compilación se sabe en qué parte de la memoria va a residir el
proceso, es posible generar código absoluto. Por ejemplo, si se sabe a priori que un proceso de usuario
residirá a partir de la posición R, el código generado por el compilador empezará en esa posición y se

37
51608191.docx
extenderá de ahí hacia arriba. Si posteriormente la posición de inicio cambia, será necesario recompilar el
código. Los programas con formato .COM de MS-DOS son código absoluto vinculado en el momento de la
compilación.
- Carga: Si al compilar el programa no se sabe en qué parte de la memoria va a residir el proceso, el
compilador deberá generar código reubicable. En este caso la vinculación final se posterga hasta el
momento del a carga. Si la dirección de inicio cambia, bastará con volver a cargar el código de usuario para
incorporar este valor modificado.
- Ejecución: Si, durante su ejecución, un proceso se podría pasar de un segmento de la memoria a otro, la
vinculación deberá postergarse hasta el momento de la ejecución. Se requiere de hardware especial para
que este esquema funcione.

9.1.2 Carga dinámica


Hasta aquí hemos supuesto que todo el programa y todos los datos de un proceso deben estar en la memoria
física para que el proceso se ejecute. El tamaño de un proceso está limitado al tamaño de la memoria física.
La carga dinámica es una técnica donde las rutinas no se cargan sino hasta que se invocan. Todas las rutinas se
mantienen en el disco en un formato de carga reubicable. El programa principal se carga en la memoria y se
ejecuta. Cuando una rutina necesita llamar a otra, lo primero que hace es ver si la otra rutina ya se cargó. Si no es
así, se invoca al cargador de enlace reubicable para que cargue la rutina deseada en la memoria y actualice las
tablas de direcciones del programa de modo que reflejen este cambio. Luego se transfiere el control a la rutina
que se acaba de cargar.
La ventaja de la carga dinámica es que una rutina que no se utiliza nunca se carga.

9.1.3 Enlace dinámico


El enlace estático es aquel en el que las bibliotecas de lenguaje del sistema se tratan como cualquier otro
módulo objeto que el cargador combina dentro de la imagen binaria del programa. El concepto de enlace
dinámico es similar al de carga dinámica. En lugar de posponer la carga hasta el momento de la ejecución, lo que
se pospone es el enlace. Esta característica suele usarse con las bibliotecas del sistema, como las bibliotecas de
subrutinas de un lenguaje. Si no se cuenta con este recurso, todos los programas de un sistema requerirán la
inclusión de una copia de su biblioteca de lenguaje (o al menos de las rutinas a las que el programa hace
referencia) en su imagen ejecutable. Este requisito desperdicia tanto espacio en disco como memoria principal.
Con enlace dinámico, se incluye un fragmento (stub) en la imagen por cada referencia a una rutina de biblioteca.
Este fragmento es una sección pequeña de código que indica cómo localizar la rutina de biblioteca apropiada, que
reside en la memoria, o cómo cargar la biblioteca si la rutina no está ya presente.
Cuando este fragmento se ejecuta, verifica si la rutina que necesita ya está en la memoria. Si no es así, el
programa la carga en la memoria. De cualquier manera, el fragmento se sustituye a si mismo por la dirección de la
rutina, y ejecuta la rutina. Así, la próxima vez que se llega al segmento de código la rutina de biblioteca se ejecuta
directamente, sin incurrir en el costo del enlace dinámico. Con este esquema, todos los procesos que utilizan una
biblioteca de lenguaje ejecutan una sola copia del código de la biblioteca.
Esta característica se puede extender a la actualización de bibliotecas (como cuando se corrigen errores). Una
biblioteca podría sustituirse por una versión nueva, y todos los programas que hagan referencia a la biblioteca
usarán automáticamente la nueva versión. Sin enlace dinámico, habría que volver a enlazar todos esos programas
para tener acceso a la biblioteca nueva. Para que los programas no ejecuten accidentalmente versiones nuevas e
incompatibles de las bibliotecas, se incluye información de versión tanto en los programas como en las bibliotecas.
Se podría cargar en memoria más de una versión de una biblioteca, y cada programa utilizará su información de
versión para decidir cuál copia de la biblioteca usará. Si los cambios son menores, se conserva el mismo número
38
51608191.docx
de versión; si los cambios son importantes, el número de versión se incrementa. Así, sólo los programas que se
compilan con la versión nueva de una biblioteca son afectados por los cambios incompatibles incorporados en
ella. Los programas que se enlazaron antes de que se instalara la nueva biblioteca seguirán usando la biblioteca
vieja. Este sistema se conoce como de bibliotecas compartidas.

9.1.4 Superposiciones (Overlays)


Para que un proceso pueda ser mayor que la cantidad de memoria que se le ha asignado, a veces se emplea
una técnica llamada de superposiciones. Lo que se busca es mantener en la memoria sólo las instrucciones y datos
que se necesitan en cualquier momento dado. Si se requieren otras instrucciones, se cargan en un espacio que
antes estaba ocupado por instrucciones que ya no se necesitan.
Las superposiciones no requieren soporte especial por parte del sistema operativo; el usuario las puede
implementar en su totalidad.

___

9.2. Espacio de direcciones lógico y físico


Una dirección generada por la CPU, se denomina dirección lógica, en tanto que la percibida por la unidad de
memoria ( esto es, la que se carga en el registro de dirección de memoria de la memoria) se conoce como
dirección física.
Los esquemas de vinculación de direcciones durante la compilación y durante la carga dan pie a un entorno en
el que las direcciones lógicas y físicas son las mismas. En cambio, la ejecución del esquema de vinculación de
direcciones durante la ejecución produce un entorno en el que las direcciones lógicas y físicas difieren. En este
caso, solemos llamar a la dirección lógica dirección virtual. Aquí los usaremos indistintamente. El conjunto de
todas las direcciones lógicas generadas por un programa es su espacio de direcciones lógicas; el conjunto de todas
las direcciones físicas que corresponden a esas direcciones lógicas es un espacio de direcciones físicas.
La transformación de direcciones virtuales a físicas en el momento de la ejecución corre por cuenta de la
unidad de gestión de memoria (MMU, memory-management unit), que es un dispositivo de hardware.
El registro base ahora se llama registro de reubicación, y el valor que contiene se suma a todas las direcciones
generadas por un proceso de usuario en el momento en que se envían a la memoria. Por ejemplo, si la base está
en 14000 y el usuario intenta direccionar la posición 0, la dirección se reubicará dinámicamente a la posición
14000; un acceso a la posición 346 se transforma en la posición 14346.
Cabe señalar que el programa de usuario nunca ve las direcciones físicas reales. El programa puede crear un
puntero a la posición 346, almacenarlo en memoria, manipularlo, compararlo con otras direcciones, etc., todo
como el número 346. Sólo cuando este número se usa como dirección de memoria (digamos en una carga o un
almacenamiento indirecto) se le reubica relativo al registro base. El programa de usuario maneja direcciones
lógicas. El hardware de transformación de memoria convierte direcciones lógicas en direcciones físicas. La
posición final de una dirección de memoria a la que se hace referencia no se determina sino hasta que se hace
dicha referencia.
Observe también que ahora tenemos dos tipos de direcciones distintos: direcciones lógicas (en el intervalo 0 a
max) y direcciones físicas (en el intervalo R + 0 a R + max si el valor base es de R). El usuario genera únicamente
direcciones lógicas y piensa que el proceso se ejecuta en las posiciones de 0 a max. EL programa de usuario
proporciona direcciones lógicas, las cuales deben transformarse en direcciones físicas antes de usarse.

39
51608191.docx
9.3 Almacenamiento virtual
El término almacenamiento virtual suele asociarse con la capacidad de direccionar un espacio de
almacenamiento mucho mayor que el disponible en el almacenamiento primario de determinado sistema de
computación.
Los dos métodos más comunes de implementación del almacenamiento virtual son la paginación y la
segmentación.
Evolución en las organizaciones de almacenamiento:

Real Real Virtual

Sistema
Sistemas de multiprogramación en
dedicado a un Multiprogramación en almacenamiento virtual
almacenamiento real
solo usuario.

Multiprogramación en Multiprogramación Paginación Segmentación Combinación paginación /


partición fija en partición variable pura pura segmentación

Absoluta Relocalizable

9.3.1 Almacenamiento virtual: Conceptos básicos


La clave del concepto de almacenamiento virtual está en la disociación de las direcciones a las que hace
referencia un programa de las direcciones disponibles en el almacenamiento primario.
Las direcciones referidas por un proceso en ejecución se denominan direcciones virtuales. Las direcciones
disponibles dentro del almacenamiento primario se denominan direcciones reales. El número de direcciones
virtuales a que puede hacer referencia un procesos, se llama espacio de direcciones virtuales, V, de ese proceso. El
número de direcciones reales disponibles en un sistema computacional determinado se llama espacio de
direcciones reales, R, de ese computador.
Aun cuando los procesos sólo hacen referencia a direcciones virtuales, éstas deben ejecutarse en el
almacenamiento real. Por esto, las direcciones virtuales deben ser transformadas dentro de las direcciones reales,
mientras el procesos está en ejecución. Los mecanismos de traducción dinámica de direcciones (DAT) convierten
las direcciones virtuales en reales al ejecutarse el proceso. Todos estos sistemas exhiben la propiedad de que las
direcciones contiguas dentro del espacio de direcciones virtuales de un procesos, no tiene por qué ser contiguas
dentro del almacenamiento real; eso se llama contigüidad artificial.

9.3.2 Organización del almacenamiento de niveles múltiples


Si se va a permitir que el espacio de direcciones virtuales de un usuario sea mayor que el espacio de
direcciones reales y si se va a multiprogramar de forma efectiva un sistema con muchos usuarios que compartan el
recurso del almacenamiento real, entonces hay que proporcionar los medios para retener programas y datos en
un gran almacenamiento auxiliar. Esto suele realizarse utilizando un esquema de almacenamiento de dos niveles.
El primer nivel es el de almacenamiento real, donde se ejecutan los procesos y donde deben estar los datos para
que un proceso pueda referirse a ellos. El segundo nivel consta de un medio de almacenamiento de gran
capacidad, como discos, que pueden mantener los programas y datos que no caben al mismo tiempo en el

40
51608191.docx
limitado almacenamiento real. Este segundo nivel de almacenamiento recibe los nombres de almacenamiento
auxiliar, secundario o adicional.

9.3.3 Transformación de bloques


Los mecanismos de traducción dinámica de direcciones deben mantener mapas que ilustren qué direcciones
del almacenamiento virtual se encuentran en el almacenamiento real y dónde se encuentran. No es rentable
transformar los elementos individualmente. Así pues, la información se agrupa en bloques, y el sistema está
informado del lugar del almacenamiento real donde han sido colocados los bloques de almacenamiento virtual.
Cuando los bloques son del mismo tamaño, reciben el nombre de páginas, y la organización de
almacenamiento virtual asociada se denomina paginación. Cuando los bloques pueden tener diferentes tamaños,
se llaman segmentos, y la organización de almacenamiento virtual asociada se conoce como segmentación.
Algunos sistemas combinan las dos técnicas, implementando los segmentos como entidades de tamaño variable
compuestas de páginas de tamaño fijo.
__

9.4 Paginació n

9.4.1 Método bá sico


La memoria física se divide en bloques de tamaño fijo llamados marcos ( frames ). La memoria lógica también
se divide en bloques del mismo tamaño llamados páginas. Cuando se va a ejecutar un proceso, sus páginas se
cargan desde el almacenamiento auxiliar, en cualesquier marcos de memoria que estén disponibles. El
almacenamiento auxiliar se divide en bloques de tamaño fijo que tienen el mismo tamaño que los marcos de
memoria.
Cada dirección generada por la CPU se divide en dos partes: un número de página (p) y un desplazamiento en
la página (d). El número de página se utiliza como índice de una tabla de páginas, la cual contiene la dirección
base de cada página en la memoria física. Esta dirección base se combina con el desplazamiento en la página para
definir la dirección de memoria física que se envía a la unidad de memoria.
El tamaño de página (al igual que el de marco) esta definido por el hardware, y suele ser una potencia de dos
que varía entre 512 bytes y 16 Mbytes por página, dependiendo de la arquitectura del computador. La selección
de una potencia de dos para el tamaño de las páginas facilita mucho la traducción de una dirección lógica a un
número de página y desplazamiento en la página, si el tamaño del espacio de direcciones lógico es de 2 m, y una
página contiene 2n unidades de direccionamiento (bytes o palabras), los m-n bits de orden alto de una dirección
lógica designan el número de página, y los n bits de orden bajo designan el desplazamiento en la página.
Cabe señalar que la paginación es realmente una forma de reubicación dinámica.
Cuando un proceso ingresa en el sistema para ejecutarse, se examina su tamaño expresado en páginas. Cada
página del proceso requiere un marco, así que si un proceso tiene n páginas, deberá haber al menos n marcos
disponibles en la memoria. Si los hay, se asignan al proceso entrante. La primera página del procese se asigna a
uno de los marcos asignados, y el número de marco se asienta en la tabla de páginas para este proceso. La
siguiente página se carga en otro marco, su número de marco se coloca en la tabla de páginas, y así
sucesivamente.
Un aspecto importante de la paginación es la marcada separación entre la visión que el usuario tiene de la
memoria y la memoria física real. El programa de usuario ve la memoria como un solo espacio contiguo, que sólo
contiene este programa. En realidad, el programa de usuario está disperso por toda la memoria física, que
también contiene otros programas. El hardware de traducción de direcciones concilia la diferencia entre la visión
del usuario y la memoria física real. Las direcciones lógicas se traducen en direcciones físicas. El usuario no ve esta
transformación, que está bajo el control del sistema operativo. Recuerde que, por definición, el proceso de

41
51608191.docx
usuario no puede acceder a memoria que no posee; no tiene manera de direccionar memoria que no esté en su
tabla de páginas, la cual sólo incluye las páginas propiedad de ese proceso.
Puesto que el sistema operativo administra la memoria física, debe tener conciencia de los detalles de su
asignación: cuales marcos están asignados, cuáles están libres, cuántos marcos hay en total, etc. Esta información
generalmente se guarda en una estructura de datos llamada tabla de marcos, la cual tiene, por cada marco de
página físico, una entrada en la que se indica si el marco está libre o asignado y, si está asignado, a qué página de
qué proceso se asignó.
__

9.4.2 Estructura de la tabla de pá ginas


Cada sistema operativo tiene sus propios métodos para almacenar tablas de páginas. Casi todos asignan una
tabla de páginas para cada proceso. Un puntero a la tabla se guarda junto con los valores de los demás registros
(como el contador de instrucciones) en el bloque de control del proceso.

9.4.2.1 Soporte de hardware


La implementación en hardware de la tabla de páginas se puede efectuar de varias formas distintas. En el caso
más sencillo, la tabla se implementa como un conjunto de registros dedicados.
El empleo de registros para la tabla de páginas es satisfactorio si la tabla es razonablemente pequeña. Cuando
la tabla es muy grande se mantiene en la memoria principal, y un registro base de tabla de páginas (PTBR, page-
table base register) apunta a ella. El problema de este enfoque es el tiempo requerido para acceder a una posición
de memoria de usuario.
La solución es usar un pequeño caché especial en hardware, de consulta rápida, que se conoce como registros
asociativos o buffers de traducción de mirada rápida (TLB, translation look-aside buffers). Cada registro consta de
dos partes: una clave y un valor. Cuando se presenta un elemento a los registros asociativos, se compara con
todas las claves simultáneamente. Si se encuentra el elemento, se devuelve el campo de valor correspondiente.
Los registros asociativos se utilizan con las tablas de páginas de la siguiente forma. Los registros contiene sólo
unas cuantas de las entradas de la tabla. Cuando la CPU genera una dirección lógica, su número de página se
presenta a un conjunto de registros asociativos que contiene números de páginas y sus números de marco
correspondiente. Si el número de página está en un registro asociativo, se obtiene de inmediato su número de
marco y se usa para acceder a la memoria.
Si el número de página no está en los registros asociativos, será preciso hacer una referencia a la tabla de
paginas en memoria. Una vez obtenido el número de marco, servirá para acceder a la memoria. Además, se
agrega el número de página y el de marco a los registros asociativos para poder encontrarlos rápidamente en la
siguiente referencia. Si el TLB ya está lleno de entradas, el sistema operativo deberá escoger una para sustituirla.
Cada vez que se escoge una tabla de páginas nuevas es preciso desalojar (borrar) el RLB para asegurar que el
siguiente proceso que se ejecute no emplee la información de traducción equivocada.

9.4.2.2 Protección
La protección de la memoria en un entorno paginado se logra con bits de protección asociados a cada marco.
Normalmente, estos bits se mantienen en la tabla de páginas. Un bit puede definir si la página es de lectura y
escritura o sólo de lectura. Cada referencia a la memoria pasa por la tabla de páginas para obtener el número de
marco correcto. Al mismo tiempo que se está calculando la dirección física, se pueden examinar los bits de
protección para comprobar que no se está tratando de escribir en una página en la que sólo se permite leer.
Semejante intento causaría la transferencia de control al sistema operativo a través de una trampa (violación de la
protección de memoria).
Tal estrategia de protección se puede ampliar fácilmente para ofrecer un nivel más detallado de protección.
42
51608191.docx
Generalmente se añade un bit más a cada entrada de la tabla de páginas: un bit de validez /no validez. Si este
bit indica “válido”, es que la página correspondiente está en el espacio de direcciones lógico del proceso, y por
ende es válida. Si el bit indica “no válido”, la página no está en el espacio de direcciones lógico del proceso. Las
direcciones no válidas se atrapan empleando el bit de validez /no validez. El sistema operativo establece este bit
para cada página a fin de permitir o prohibir el acceso a ella.
___

9.4.3 Paginació n multinivel


La generalidad de los sistemas de computador modernos maneja un espacio de direcciones lógicos muy
grande (232 a 264). En un entorno así, la tabla de páginas crece demasiado. Una solución sencilla es dividir la tabla
en fragmentos más pequeños. Hay varias formas de efectuar esto.
Una de ellas es adoptar un esquema de paginación de dos niveles, en el que la tabla de páginas misma
también se pagina. Apropiado en una máquina de 32 bits.
En un sistema con un espacio de direcciones lógico de 64 bits, un esquema de paginación de dos niveles ya no
es apropiado. El método obvio para evitar una tabla de páginas tan grande es dividir la tabla de páginas exterior
en fragmentos más pequeños. Podemos paginar la tabla de páginas exterior y tener un esquema de paginación de
tres niveles, lo cual sigue siendo enorme. El siguiente paso sería un esquema de paginación de cuatro niveles, el
que la tabla de páginas exterior de segundo nivel también se pagina.

9.4.4 Tabla de pá ginas invertida


Por lo regular, cada proceso tiene su propia tabla de páginas, la cual tiene una entrada por cada página que el
proceso está usando ( o una ranura por cada dirección virtual, sin importar la validez de esta última). Una de las
desventajas de este esquema es que cada tabla de páginas podría contener millones de entradas.
Para resolver este problema, podemos usar una tabla de páginas invertidas. Una tabla de páginas invertida
tiene una entrada por cada página (marco) real de la memoria. Cada entrada consiste en la dirección virtual de la
página almacenada en esa posición de memoria real, con información acerca del proceso dueño de esa página.
Así, solo hay una tabla de páginas en el sistema, y sólo tiene una entrada por cada página de memoria física.
Para ilustrar este esquema, describiremos una versión simplificada de la implementación de la tabla de
páginas invertida que se usa ene el IBM RT. Cada dirección virtual del sistema consiste en una tripleta
<id-proceso, núm-página, desplazamiento>.
Cada entrada de la tabla de páginas invertida es un par <id-proceso, núm-página>. Cuando ocurre una
referencia a la memoria, una parte de la dirección virtual, que consiste en <id-proceso, núm-página>, se presenta
al subsistema de memoria. A continuación se busca en la tabla de páginas invertidas un valor igual. Si se encuentra
dicho valor – digamos la entrada i – se genera la dirección física <i, desplazamiento>. Si ninguna entrada coincide,
es que se intentó un acceso a una dirección no válida.
Aunque este esquema reduce la cantidad de memoria necesaria para almacenar las tablas de páginas,
aumenta el tiempo que toma realizar la búsqueda en la tabla cuando ocurre una referencia a una página. Puesto
que la tabla está ordenada por dirección física, y lo que se busca es una dirección virtual, cabe la posibilidad de
tener que examinar toda la tabla para encontrar un valor coincidente.

9.4.5 Pá ginas compartidas


Otra ventaja de la paginación es la posibilidad de compartir código común. Esta consideración es importante
sobre todo en un entorno de tiempo compartido, en la que se tiene un programa de código reentrante que puede
ser utilizado por varios usuarios. El código reentrante (también llamado código puro) es código que no puede
modificarse a sí mismo. Si el código es reentrante, nunca cambia durante su ejecución. Así, dos o más procesos
pueden ejecutar el mimo código al mismo tiempo. Cada proceso tiene su copia de los registros y el

43
51608191.docx
almacenamiento de datos que contienen la información para la ejecución del proceso. Desde luego, los datos de
dos procesos distintos son diferentes.
Sólo hay que mantener una copia del editor en la memoria física. La tabla de páginas de cada usuario
establece una correspondencia con la misma copia física del código reentrante, pero las páginas de datos
corresponden a marcos distintos.

___

9.5 Segmentació n
Un aspecto importante de la gestión de memoria que se hizo inevitable al surgir la paginación es la separación
entre la visión que el usuario tiene de la memoria y la memoria física real. La visión del usuario no es igual a la
memoria física real; sólo tiene una correspondencia con ella. La correspondencia permite diferenciar entre la
memoria lógica y la física.

9.5.1 Método bá sico


¿cómo ve el usuario la memoria? ¿el usuario la considera una formación lineal de bytes, algunos de los cuales
contiene instrucciones y otros datos, o hay alguna otra visión preferida de la memoria? En general, se considera
que el usuario o programador de un sistema no ve la memoria como una formación lineal de bytes, más bien, la ve
como una colección de segmentos de tamaño variable, sin algún ordenamiento necesario entre los segmentos.
Pensemos en cómo visualizamos un programa cuando lo estamos escribiendo; lo vemos como un programa
principal con una serie de subrutinas, procedimientos, funciones o módulos. También podría haber diversas
estructuras de datos; tablas, arreglos, pilas, variables, etc. Hacemos referencia a cada uno de estos módulos o
elementos de datos por su nombre, sin que nos importe qué posición en la memoria ocupan tales elementos. No
nos interesa si el módulo 1 esta antes o después del módulo 2. Cada uno de estos segmentos tiene longitud
variable; la longitud está definida intrínsecamente por el propósito del segmento en el programa. Los elementos
dentro de un segmento se identifican mediante su distancia al inicio del segmento.
La segmentación es un esquema de gestión de memoria que apoya esta visión que el usuario tiene de la
memoria. Un espacio de direcciones lógicas es una colección de segmentos, cada uno de los cuales tiene un
nombre y una longitud. Las direcciones especifican tanto el nombre del segmento como las distancia dentro del
segmento. Así, el usuario especifica cada dirección con dos cantidades: un nombre de segmento y un
desplazamiento.(Contrástese este esquema con el de paginación, donde el usuario especificaba una sola dirección,
que el hardware dividía en un número de página y un desplazamiento, todo ello invisible par el programador.)
Para simplificar la implementación, los segmentos se numeran y se hace referencia a ellos por un número de
segmento, no por su nombre. Así, una dirección lógica consiste en una dupla
<núm-segmento, desplazamiento>
Normalmente, el programa de usuario se compila, y el compilador construye automáticamente segmentos
que reflejan al programa que se le alimentó.

9.5.2 Hardware
Aunque el usuario ahora puede referirse a los objetos del programa con una dirección bidimensional, la
memoria física real sigue siendo una secuencia unidimensional de bytes. Por ello, es preciso definir una
implementación que transforme las direcciones bidimensionales definidas por el usuario en direcciones físicas
unidimensionales. Esta transformación se efectúa con una tabla de segmentos. Cada entrada de la tabla tiene una
base de segmento y un límite de segmento. LA base contiene la dirección física inicial donde el segmento reside en
la memoria, mientras que el límite especifica la longitud del segmento.

44
51608191.docx
Una dirección lógica consta de dos partes: un número de segmento, s, y un desplazamiento dentro de ese
segmento, d. El número de segmento sirve como índice para consultar la tabla de segmentos. El desplazamiento d
de la dirección lógica debe estar entre 0 y el límite del segmento; si no, transferimos el control al sistema
operativo por una trampa (intento de direccionamiento lógico más allá del final del segmento). Si el
desplazamiento es válido, se suma a la base del segmento para producir la dirección del byte deseado en la
memoria física.

9.5.3 Implementació n de las tablas de segmentos


Al igual que la tabla de paginación, la tabla de segmentos se puede colocar en registros rápidos o bien en la
memoria. Una tabla de segmentos que se mantiene en registros se puede consultar rápidamente.
Si un programa puede tener un gran número de segmentos, no es factible mantener la tabla de segmentos en
registros , y hay que mantenerla en la memoria. Un registro base de la tabla de segmentos (STBR, segment-table
base register) apunta a la tabla de segmentos. También, dado que el número de segmentos que un programa usa
puede variar mucho, se mantiene un registro de longitud de la tabla de segmentos (STLS, segment-table length
register). Para una dirección lógica (s, d), primero se verifica que el número de segmento sea legal (es decir, s<
STLR); luego se suma el número de segmento al STBR para obtener la dirección en memoria (STBR + s) de la
entrada de la tabla de segmento. Se lee dicha entrada de la memoria y se procede igual que antes: se coteja el
desplazamiento con la longitud del segmento y se calcula la dirección física del byte deseado como la suma de la
base del segmento y el desplazamiento.
Como ocurre con la paginación, esta transformación hace al sistema de computación más lento. La solución
normal es utilizar un conjunto de registros asociativos para guardar las entradas de la tabla de segmentos que se
usaron más recientemente.

9.5.4 Protecció n y compartimiento


Una ventaja específica de la segmentación es que podemos asociar la protección con los segmentos. Dado que
los segmentos representan porciones semánticamente definidas de un programa, es probable que todas las
entradas del segmento se usen del mismo modo. Así, tendremos algunos segmentos que contiene instrucciones,
mientras que otros contienen datos. En una arquitectura moderna, las instrucciones no se pueden modificar a sí
mismas, así que los segmentos de instrucciones se pueden definir como sólo para lectura o sólo para ejecución. El
hardware de transformación de la memoria examina los bits de protección asociados a cada entrada de la tabla de
segmentos y evita los accesos no permitidos a la memoria, como los intentos de escribir en un segmento que sólo
puede leerse, o de usar como datos un segmento que sólo puede ejecutarse. Si colocamos un arreglo en su propio
segmento, el hardware de gestión de memoria verificará automáticamente que los índices del arreglo sean válidos
y no se salgan de los límites del arreglo.
Otra ventaja de la segmentación tiene que ver con el compartimiento de código o datos. Cada proceso tiene
asociada una tabla de segmentos, que el despachador usa para definir la tabla de segmentos en hardware cuando
se asigna la CPU a ese proceso. Los segmentos se comparten cuando estradas de las tablas de segmentos de dos
procesos distintos apuntan a las mismas posiciones físicas.
El compartimiento se hace en el nivel de segmentos. Así, cualquier información puede compartirse si se define
como un segmento. Es posible compartir varios segmentos, así que un programa compuesto por varios segmentos
puede compartirse.

9.5 Segmentació n con paginació n


En este método se pagina los segmentos. La diferencia entre esta solución y la segmentación pura es que la
entrada segmentable no contiene la dirección base del segmentos, sino la dirección base de una tabla de páginas
para este segmento.
45
51608191.docx
Ahora debemos tener una tabla de páginas individual para cada segmento. Sin embargo, dado que la longitud
de cada segmento está limitada por su entrada en la tabla de segmentos, no es necesaria que la tabla de páginas
sea grande; sólo tendrá tantas entradas como realmente se necesiten..

10 Memoria virtual
La memoria vitual es una técnica que permite ejecutar procesos que podrían no estar totalmente en la
memoria. La principal ventaja tangible de este esquema es que los programas pueden ser más grandes que la
memoria física. Además, dicho esquema hace una abstracción de la memoria considerándola como una matriz
uniforme y extremadamente grande de almacenamiento, con lo que separa la memoria lógica que el usuario ve,
de la memoria física.

10.1 Antecedentes
Los algoritmos de gestión de memoria vistos anteriormente son necesarios a causa de un requisito básico: las
instrucciones que se están ejecutando deben estar en la memoria física. La primera estrategia para satisfacer este
requisito es colocar todo el espacio de direcciones lógico en la memoria física. Las superposiciones y la carga
dinámica pueden ayudarnos a hacer menos limitante esta restricción. Esta restricción limita el tamaño de los
programas al tamaño de la memoria.
De hecho, si examinamos programas reales, veremos que en muchos casos no se necesita todo el programa.
La capacidad para ejecutar un programa que no está todo en la memoria tendría muchas ventajas:

- Los programas ya no estarían limitados por la cantidad de memoria física con que se cuenta. Los usuarios
podrían escribir programas para un espacio de direcciones virtual extremadamente grande, lo que
simplificaría la tarea de programación.
- Puesto que cada programa de usuario ocuparía menos memoria física, se podrían ejecutar más programas
al mismo tiempo. Esto aumentaría el aprovechamiento de la CPU y la productividad sin aumentar el
tiempo de respuesta ni el de retorno.
- Se requeriría menos E/S para cargar o intercambiar cada programa de usuario, por lo que su ejecución
sería más rápida.
La memoria virtual generalmente se implementa con paginación por demanda.

10.2 Paginación por demanda


Un sistema de paginación por demanda es similar a un sistema de paginación con intercambio. Los procesos
residen en memoria secundaria (generalmente un disco). Cuando queremos ejecutar un proceso, lo pasamos por
intercambio a la memoria; sin embargo, en ligar de intercambiar todo el proceso, usamos un intercambiados
perezoso. Un intercambiador perezoso nunca intercambia una página a la memoria si no se va a necesitar. Dado
que ahora visualizamos un proceso como una secuencia de páginas, y no como un espacio de direcciones contiguo
de gran tamaño, el uso del término intercambiador es técnicamente incorrecto. Un intercambiador manipula
proceso enteros, mientras que un paginador se ocupa de las páginas individuales de un proceso. Por ello,
usaremos el término paginador en lugar de intercambiador al hablar de paginación por demanda.
Cuando un proceso se va a traer a la memoria, el paginador adivina cuáles son las páginas que se usarán antes
de que el programa se intercambie de vuelta al disco. En lugar de traer a la memoria todo el proceso, el paginador

46
51608191.docx
sólo trae las páginas necesarias; así, evita leer y colocar en la memoria páginas que de todos modos no se usarán,
con lo que se reduce el tiempo de intercambio y la cantidad de memoria física requerida.
Con este esquema, necesitamos alguna forma de soporte de hardware para distinguir entre las páginas que
están en la memoria y las que están en disco. Podemos usar para este fin el esquema de bit de validez-no validez,
donde ahora el valor de “válido” del bit indica que la página correspondiente es válida y está en la memoria. Si el
bit tiene el valor “no válido”, quiere decir que la página o bien no es válida (es decir, no está en el espacio de
direcciones lógico del procesos) o es válida pero no está en la memoria. La entrada de la tabla de páginas
correspondiente a una página que se trajo a la memoria se establece de la forma acostumbrada, pero la
correspondiente a una página que actualmente no está en la memoria simplemente se marca como no válida, o
bien contiene la dirección de la página en el disco.
Cabe señalar que marcar una página como no válida no tiene efecto alguno si el procesos nunca intenta
acceder a esa página. Por tanto, si adivinamos correctamente y traemos a la memoria todas las páginas que en
verdad se necesitan, y únicamente esas, el proceso se ejecutará exactamente igual que si hubiéramos traído todas
las páginas. Muestra el proceso ejecute y acceda a páginas residentes en memoria, la ejecución se realizará
normalmente.
Pero, ¿qué sucede si el proceso trata de usar una página que no se trajo a la memoria? El acceso a una página
marcada como no válida causa una trampa de fallo de página (page fault). El hardware de paginación, al traducir
la dirección utilizando la tabla de páginas, se percatará de que el bit de no validez está encendido y causará una
transferencia de control al sistema operativo. Esta trampa ocurre porque el sistema operativo no pudo traer la
página deseada a la memoria (en un intento por minimizar el gasto extra de transferencia del disco y las
necesidades de memoria), no es un error de dirección no válida causado por un intento de usar una dirección de
memoria no permitida (como cuando se usa un subíndice de arreglo incorrecto).
El procedimiento para manejar este fallo es:
1. Consultar una tabla interna (que usualmente se guarda junto con el bloque de control de proceso) de este
proceso, para determinar si la referencia fue un acceso válido o no válido a la memoria.
2. Si la referencia no era válida, se termina el proceso; si era válida, pero todavía no se ha traído esa página,
proceder a traerla.
3. Encontrar un marco libre (tomando uno de la lista de marcos libres).
4. Planificar una operación de disco para leer la página deseada y colocarla en el marco recién asignado.
5. Al terminar la lectura del disco, modificar la tabla interna que se guarde junto con el proceso y la tabla de
páginas, d modo que indiquen que la página ya está en la memoria.
6. Reiniciar la instrucción que se interrumpió por la trampa de dirección no válida. Ahora el proceso puede
acceder a la página como si siempre hubiera estado en la memoria.

10.3 Reemplazo de páginas


En estos esquemas, la frecuencia de fallos de página no ha representado un problema grave porque una
página dada puede dar pie cuando más a un solo fallo de página, el cual, si ocurre, lo hará la primera vez que se
haga referencia a esa página.
AL aumentar el grado de multiprogramación, estaremos sobreasignando la memoria. La sobreasignación se
hace evidente como sigue. Mientras se está ejecutando un proceso de usuario, ocurre un fallo de página. El
hardware transfiere el control la sistema operativo por una trampa, y éste examina sus páginas internas para
comprobar que se trat de un fallo de página y no de un acceso a memoria no válido. El sistema operativo
determina en qué parte del disco reside la página deseada, pero luego se da cuenta de que no hay marcos libres
en la lista de marcos libres; se está usando toda la memoria.

47
51608191.docx
Al llegar a este punto, el sistema operativo tiene varias opciones. Una de ellas sería terminar el proceso de
usuario. O se podría intercambiar a disco un proceso para liberar todos sus marcos y reducir el nivel de
programación. O se podría hacer el reemplazo de páginas.
El reemplazo de páginas adopta el siguiente enfoque: si no hay marcos libres, encontramos uno que no se está
usando y lo liberamos. Podemos liberar un marco escribiendo su contenido en el espacio de intercambio y
modificando la tabla de páginas (y todas las demás tablas) de modo que indiquen que la página ya no está en la
memoria. Ahora, el marco liberado puede servir para contener la página por la cual ocurrió el fallo. La rutina de
servicio de fallos de página se modifica así para incluir el reemplazo de páginas:
1. Encontrar la página deseada en el disco.
2. Hallar un marco libre:
a. Si hay un marco libre, usarlo.
b. Si no, usar un algoritmo de reemplazo de páginas para escoger un marco víctima.
c. Escribir la página víctima en el disco; modificar de manera acorde las tablas de páginas y de
marcos.
3. Leer la página deseada y colocarla en el marco recién liberado; modificar las tablas de páginas y de
marcos.
4. Reiniciar el proceso de usuario.
Observe que, si no hay marcos libres, se requieren dos transferencias de página. Este gasto extra pude
reducirse empleado un bit de modificación, o bit sucio. Cada página o marco pude tener en hardware un bit de
modificación asociado a ella. El hardware “enciende” (pone en 1) el bit de modificación de una página siempre que
se escribe una palabra o byte de la página, e indica que la página se modificó. Cuando seleccionamos una página
para reemplazarla, examinamos su bit de modificación. Si el bit está encendido, sabemos que la página se
modificó después de haberse leído del disco. En este caso es preciso escribir la página en el disco. Si el bit de
modificación está apagado, la página no se ha modificado desde que se trajo a la memoria. Por tanto, si la copia
de la página que está en el disco no se ha sobrescrito (con alguna otra página, por ejemplo) podemos evitar la
escritura en disco de la página que está en la memoria, pues ya está en el disco. Esta técnica también aplica a las
páginas que sólo pueden leerse. Tales páginas no pueden modificarse, así que pueden desecharse cuando se
desee.
Por lo tanto es necesario resolver el problema de cómo reemplazar las páginas.

10.4 Algoritmos de reemplazo de páginas

10.4.1 Algoritmo FIFO


El algoritmo de reemplazo de páginas más sencillo es del tipo primero en entrar, primero en salir (FIFO, first-
in, first-out). Un algoritmo de reemplazo FIFO asocia a cada página el instante en que esa página se trajo a la
memoria. Si es necesario reemplazar una página, se escoge la más vieja. Cabe señalar que no es estrictamente
necesario registrar el instante en que se trae una página. Podemos crear una cola FIFO que contenga todas las
páginas que están en la memoria, y reemplazar la página que esté a la cabeza de la cola. Cuando traemos una
página a la memoria, la insertamos al final de la cola.

10.4.2 Algoritmo óptimo

48
51608191.docx
La anomalía de Belady refleja el hecho de que, con algunos algoritmos de reemplazo de páginas, la frecuencia
de fallos de página podría aumentar al aumentar el número de marcos asignados. Esperaríamos que conceder más
memoria a un proceso mejoraría su desempeño, lo cual no siempre se cumple.
Un resultado del descubrimiento de la anomalía de Belady fue la búsqueda de una algoritmo de reemplazo de
páginas óptimo. Un algoritmo óptimo tiene la frecuencia de fallos de página más bajo de todos los algoritmos de
reemplazo de páginas, y nunca exhibe la anomalía de Belady. Existe un algoritmo de reemplazo de páginas óptimo,
que se ha denominado OPT o MIN, y es sencillamente
Reemplazar la página que no se usará durante más tiempo
El empleo de este algoritmo de reemplazo de páginas garantiza la frecuencia de fallos de página más baja para
un número fijo de marcos.

10.4.3 Algoritmo LRU


Si el algoritmo óptimo no es factible, tal vez podría lograrse una aproximación. La distinción clave entre los
algoritmos FIFO y OPT (aparte de mirar hacia atrás y hacia delante en el tiempo) es que el primero usa el instante
en que una página se trajo a la memoria, mientras que el segundo usa el instante en que se usará una página. Si
utilizamos el pasado reciente como una aproximación del futuro cercano, sustituiremos la página que no se ha
usado durante más tiempo. La estrategia es el algoritmo de menos recientemente usada (LRU, least recently
used).
El reemplazo LRU asocia a cada página el instante en que se usó por última vez. Si es necesario reemplazar una
página, LRU escoge la página que tiene más tiempo sin usarse. Esta estrategia es el algoritmo de reemplazo
óptimo mirando hacia atrás en el tiempo en vez de hacia delante.
La política LRU se usa mucho como algoritmo de reemplazo de páginas y se considera excelente; el problema
principal es cómo implementarla. Hay dos implementaciones factibles:
- Contadores: En el caso más sencillo, asociamos a cada entrada de la tabla de páginas un campo de
“tiempo de uso”, y añadimos a la CPU un reloj lógico o contador. El reloj se incrementa en cada referencia
a la memoria. Cada vez que se hace referencia a una página, el contenido del registro de reloj se copia en
el campo de tiempo de uso de la entrad de tabla de páginas para esa página. Reemplazamos la página que
tiene el valor de tiempo más pequeño.
- Pila: Otra estrategia para implementar el reemplazo LRU es mantener una pila de números de página.
Cuando se hace referencia a una página, se saca de la pila y se la coloca arriba. De este modo, el tope de la
pila siempre es la página más recientemente utilizada, y la base es la página LRU

10.4.4 Algoritmo de aproximación a LRU


Pocos sistemas de computación ofrecen suficiente soporte de hardware para el verdadero reemplazo de
páginas LRU. Muchos sistemas proporcionan un poco de ayuda, en forma de un bit de referencia. El hardware
enciende (pone en 1) el bit de referencia de una página de cada vez que se hace referencia a ella (sea para leer o
escribir cualquier byte de la página). Cada entrada de la tabla de páginas tiene asociado un bit de referencia.
Inicialmente, el sistema operativo apaga (pone en 0) todos los bits. A medida que un proceso se ejecuta, el
hardware enciende el bit asociado a cada página a la que se hace referencia. Después de cierto tiempo, podremos
determinar cuáles páginas se han usado y cuáles no examinando los bits de referencia.

10.4.4.1 Algoritmo con bits de referencia adicionales

49
51608191.docx
Podemos obtener información de ordenamiento adicional si registramos los bits de referencia a intervalos
adicionales. Podemos mantener un byte histórico de ocho bits para cada página de una tabla que está en
memoria. A intervalos regulares, una interrupción del temporizador transfiere el control al sistema operativo, el
cual introduce el bit de referencia de cada página en el bit de orden alto de su byte histórico, desplazando los
demás bits de una posición hacia la derecha y desechando el bit de orden bajo. Estos registros de desplazamiento
de ocho bits contienen la historia de uso de la página durante los últimos ocho periodos del temporizador. Si el
registro de desplazamiento contiene 0000000, la página no se ha usado durante ocho periodos del temporizador;
una página que se ha usado al menos una vez cada periodo tendrá un valor de 11111111 en el registro de
desplazamiento.
Una página cuyo registro histórico contiene el valor 11000100 se usó más recientemente que uno cuyo
registro contiene 01110111. Si interpretamos estos byte como enteros sin signo, la página que contiene el número
más bajo es la página LRU, y se puede sustituir. Cabe señalar que no está garantizado la unicidad de dichos
números. Podemos optar por reemplazar (intercambiar a disco) todas las páginas que tiene el valor más bajo, o
bien usar unas selección FIFO entre ellos.
Se puede variar el número de bits históricos, con un caso extremo de reducir el número a cero, dejando sólo el
bit de referencia. En este caso el algoritmo de reemplazo de páginas se denomina de segunda oportunidad.

10.4.4.2 Algoritmo de segunda oportunidad


El algoritmo básico de reemplazo de segunda oportunidad es un algoritmo FIFO, excepto que una vez que se
ha seleccionado una página se examina su bit de referencia. Si el valor es cero, procedemos a reemplazar la
página, pero si es 1, damos a esa página una segunda oportunidad y seleccionamos la siguiente página FIFO.
Cuando se da una página una segunda oportunidad, su bit de referencia se pone en cero y su hora de llegada se
restablece a la hora actual. Así, una página a la que se le dio una segunda oportunidad no será reemplazada hasta
que todas las demás páginas se reemplacen (o reciban una segunda oportunidad). Además, si una página se usa
con la suficiente frecuencia como para mantener encendido su bit de referencia, nunca será reemplazada.
Una forma de implementar el algoritmo de segunda oportunidad (también conocido como algoritmo de reloj)
es con una cola circular. Un puntero indica cuál página se debe reemplazar a continuación. Cuando se necesita un
marco, el puntero avanza hasta encontrar una página cuyo bit de referencia esté apagado. Al avanzar el puntero,
los bits de referencia encendidos se van apagando. Una vez hallada una página víctima, se reemplaza y la nueva
página se inserta en la cola circular en esa posición. Observe que, en el peor de los casos, en el que todos los bits
están encendidos, el puntero recorre toda la cola, dando a cada página una segunda oportunidad, y todos los bits
de referencia se apagan antes de seleccionarse la siguiente página a reemplazar. El reemplazo de segunda
oportunidad degenera a reemplazo FIFO si todos los bits están encendidos.

10.4.4.3 Algoritmo de segunda oportunidad mejorado


El algoritmo de segunda oportunidad puede mejorarse si consideramos tanto el bit de referencia como el bit
de modificación como un par ordenado. Con estos dos bits, tenemos las cuatro clases posibles siguientes:
1. (0,0) ni se usó recientemente ni se modificó; es la mejor página que se puede reemplazar.
2. (0,1) no se usó recientemente pero si se modificó; no es tan buena, porque habrá que escribir en disco la
página antes de reemplazarla.
3. (1,0) se usó recientemente pero no se ha modificado, probablemente se usará otra vez pronto.
4. (1,1) se usó recientemente y se modificó; probablemente se usará otra vez, y será necesario escribirla en
disco antes de reemplazarla.

50
51608191.docx
Si es preciso reemplazar una página, todas las páginas pertenecen a una de estas cuatro clases. Utilizamos el
mismo esquema que en el algoritmo de reloj, pero en lugar de ver si el bit de referencia de la página a la que
apunta el puntero está encendido, se determina a la calase a la que la página pertenece. Reemplazaremos la
primera página que encontremos en la clase más baja que no esté vacía.

10.4.5 Algoritmos de conteo


Otros algoritmos que se pueden usar son aquellos en que se mantiene un contador del número de referencias
que se han hecho a cada página, por ejemplo:
- Algoritmo LFU: El algoritmo de reemplazo de páginas menos frecuentemente usadas (LFU, least frequently
used) exige reemplazar la página que tiene la cuenta más baja. La razón de esta selección es que una
página que se ha usado activamente debe tener una cuenta de referencias grandes. Este algorimo no es
eficiente en el caso de páginas que se usaron mucho durante la fase inicial del proceso y luego nunca se
vuelven a usar. Al haberse usado mucho, tiene una cuenta grande y permanecerán en memoria aunque ya
no se necesiten. Una solución sería desplazar alas cuentas un bit a la derecha a intervalos regulares par
formar una cuenta de uso promedio con decaimiento exponencial.
- Algoritmo MFU: El algoritmo de reemplazo de páginas más frecuentemente usadas (MFU, most frequently
used) se basa en el argumento de que la página con la cuenta más baja probablemente se acaba de traer a
la memoria y todavía no se usa.

10.4.5 Algoritmo de colocación de páginas en buffers


Es común utilizar otros procedimientos además de un algoritmo de reemplazo de páginas específico. Por
ejemplo, muchos sistemas mantienen una reserva de marcos libres. Cuando ocurre una fallo de página, se escoge
un marco de víctima igual que antes. Sin embargo, la página deseada se coloca en un marco libre de la reserva
antes de escribir la víctima en el disco. Este procedimiento permite al proceso reiniciarse lo más pronto posible,
sin esperar a que la página víctima se escriba en el disco. Cuando la víctima termina de escribirse en el disco, su
marco se añade a la reserva de marcos libres.
Una expansión de esta idea es mantener una lista de páginas modificadas. Siempre que el dispositivo de
paginación está ocioso, se escoge una página modificada y se escribe en el disco, después de lo cual se apaga su
bit de modificación. Este esquema aumenta la probabilidad de que una página esté “limpia” cuando se le escoja
para ser reemplazada, y no tenga que escribirse.
Otra modificación consiste en mantener una reserva de marcos libres, pero recordar cuál página estaba en
cada marco. Puesto que el contenido de un marco no se modifica cuando la página que contiene se escribe en el
disco, es posible reutilizar la página vieja directamente de la reserva de marcos libres si llega a necesitarse antes
de que vuelva a usarse ese marco.

51

You might also like