Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Parcial I - Sistemas Operativos

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 14

1.

13 Resumen Capítulo 1 (Introducción)


Un sistema operativo es un software que gestiona el hardware de la computadora
y proporciona un entorno para ejecutar los programas de aplicación. Quizá el aspecto
más visible de un sistema operativo sea la interfaz que el sistema informático proporciona
al usuario.
Para que una computadora haga su trabajo de ejecutar programas, los programas
deben encontrarse en la memoria principal. La memoria principal es la única área de
almacenamiento de gran tamaño a la que el procesador puede acceder directamente. Es
una matriz de palabras o bytes, con un tamaño que va de millones a miles de millones
de posiciones distintas. Cada palabra de la memoria tiene su propia dirección.
Normalmente, la memoria principal es un dispositivo de almacenamiento volátil que
pierde su contenido cuando se desconecta o desaparece la alimentación.
La mayoría de los sistemas informáticos proporcionan un almacenamiento
secundario como extensión de la memoria principal. El almacenamiento secundario
proporciona una forma de almacenamiento no volátil, que es capaz de mantener
enormes cantidades de datos de forma permanente.
El dispositivo de almacenamiento secundario más común es el disco magnético,
que proporciona un sistema de almacenamiento para programas y datos. La amplia
variedad de sistemas de almacenamiento en un sistema informático puede organizarse
en una jerarquía, en función de su velocidad y su coste. Los niveles superiores son más
caros, pero más rápidos. A medida que se desciende por la jerarquía, el coste por bit
generalmente disminuye, mientras que el tiempo de acceso por regla general aumenta.
Existen varias estrategias diferentes para diseñar un sistema informático. Los
sistemas monoprocesador sólo disponen de un procesador, mientras que los sistemas
multiprocesador tienen dos o más procesadores que comparten la memoria física y los
dispositivos periféricos. El diseño multiprocesador más común es el multiprocesamiento
simétrico (o SMP), donde todos los procesadores se consideran iguales y operan
independientemente unos de otros. Los sistemas conectados en clúster constituyen una
forma especializada de sistema multiprocesador y constan de múltiples computadoras
conectadas mediante una red de área local.
Para un mejor uso de la CPU, los sistemas operativos modernos emplean
multiprogramación, la cual permite tener en memoria a la vez varios trabajos, asegurando
por tanto que la CPU tenga siempre un trabajo que ejecutar. Los sistemas de tiempo
compartido son una extensión de la multiprogramación, en la que los algoritmos de
planificación de la CPU conmutan rápidamente entre varios trabajos, proporcionando la
ilusión de que cada trabajo está ejecutándose de forma concurrente.
El sistema operativo debe asegurar la correcta operación del sistema informático.
Para impedir que los programas dé usuario interfieran con el apropiado funcionamiento
del sistema, el hardware soporta dos modos de trabajo: modo usuario y modo kernel.
Diversas instrucciones, como las instrucciones de E/S y las instrucciones de espera, son
instrucciones privilegiadas y sólo se pueden ejecutar en el modo kernel. La memoria en
la que el sistema operativo reside debe protegerse frente a modificaciones por parte del
usuario. Un temporizador impide los bucles infinitos. Estas características (modo dual,
instrucciones privilegiadas, protección de memoria e interrupciones del temporizador)
son los bloques básicos que emplea el sistema operativo para conseguir un correcto
funcionamiento.
Un proceso (o trabajo) es la unidad fundamental de trabajo en un sistema
operativo. La gestión de procesos incluye la creación y borrado de procesos y
proporciona mecanismos para que los procesos se comuniquen y sincronicen entre sí.
Un sistema operativo gestiona la memoria haciendo un seguimiento de qué partes de la
misma están siendo usadas y por quién. El sistema operativo también es responsable de
la asignación dinámica y liberación del espacio de memoria. El sistema operativo también
gestiona el espacio de almacenamiento, lo que incluye proporciona: sistemas de archivos
para representar archivos y directorios y gestionar el espacio en los dispositivos de
almacenamiento masivo.
Los sistemas operativos también deben ocuparse de la protección y seguridad del
propio sistema operativo y de los usuarios. El concepto de protección incluye los
mecanismos que controlan el acceso de los procesos o usuarios a los recursos que el
sistema informático pone a su disposición. Las medidas de seguridad son responsables
de defender al sistema informático de los ataques externos e internos.
Los sistemas distribuidos permiten a los usuarios compartir los recursos
disponibles en una serie de hosts dispersos geográficamente, conectados a través de
una red de computadoras. Los servicios pueden ser proporcionados según el modelo
cliente-servidor o el modelo entre iguales.
En un sistema en clúster, las múltiples máquinas pueden realizar cálculos sobre
los datos que residen en sistemas de almacenamiento compartidos y los cálculos pueden
continuar incluso cuando algún subconjunto de los miembros del clúster falle.
Las LAN y WAN son los dos tipos básicos de redes. Las redes LAN permiten que
un conjunto de procesadores distribuidos en un área geográfica pequeña se comuniquen,
mientras que las WAN permiten que se comuniquen diversos procesadores distribuidos
en un área más grande. Las redes LAN son típicamente más rápidas que las WAN.
Existen diversos tipos de sistemas informáticos que sirven a propósitos
específicos. Entre estos se incluyen los sistemas operativos en tiempo real diseñados
para entornos embebidos, tales como los dispositivos de consumo, automóviles y
equipos robóticos. Los sistemas operativos en tiempo real tienen restricciones de tiempo
fijas y bien definidas. El procesamiento tiene que realizarse dentro de las restricciones
definidas, o el sistema fallará. Los sistemas multimedia implican el suministro de datos
multimedia y, a menudo, tienen requisitos especiales para visualizar o reproducir audio,
vídeo o flujos sincronizados de audio y vídeo. Recientemente, la influencia de Internet y
la World Wide Web ha llevado al desarrollo de sistemas operativos modernos que
integran exploradores web y software de red y comunicaciones.
2.11 Resumen Capítulo 2 (Estructura de un Sistema Operativo)
Los sistemas operativos proporcionan una serie de servicios. En el nivel más bajo,
las llamadas al sistema permiten que un programa en ejecución haga solicitudes
directamente al sistema operativo. En un nivel superior, el intérprete de comandos o shell
proporciona un mecanismo para que el usuario ejecute una solicitud sin escribir un
programa. Los comandos pueden proceder de archivos de procesamiento por lotes o
directamente de un terminal, cuando se está en modo interactivo o de tiempo compartido.
Normalmente, se proporcionan programas del sistema para satisfacer muchas de las
solicitudes más habituales de los usuarios. Los tipos de solicitudes varían de acuerdo
con el nivel. El nivel de gestión de las llamadas al sistema debe proporcionar funciones
básicas, como las de control de procesos y de manipulación de archivos y dispositivos.
Las solicitudes de nivel superior, satisfechas por el intérprete de comandos o los
programas del sistema, se traducen a una secuencia de llamadas al sistema.
Los servicios del sistema se pueden clasificar en varias categorías: control de
programas, solicitudes de estado y solicitudes de E/S. Los errores de programa pueden
considerarse como solicitudes implícitas de servicio.
Una vez que se han definido los servicios del sistema, se puede desarrollar la
estructura del sistema. Son necesarias varias tablas para describir la información que
define el estado del sistema informático y el de los trabajos que el sistema esté
ejecutando.
El diseño de un sistema operativo nuevo es una tarea de gran envergadura. Es
fundamental que los objetivos del sistema estén bien definidos antes de comenzar el
diseño. El tipo de sistema deseado dictará las opciones que se elijan, entre los distintos
algoritmos y estrategias necesarios. Dado que un sistema operativo tiene una gran
complejidad, la modularidad es importante.
Dos técnicas adecuadas son diseñar el sistema como una secuencia de niveles o
usando un microkernel. El concepto de máquina virtual se basa en una arquitectura en
niveles y trata tanto al kernel del sistema operativo como al hardware como si fueran
hardware. Incluso es posible cargar otros sistemas operativos por encima de esta
máquina virtual. A lo largo de todo el ciclo de diseño del sistema operativo debemos ser
cuidadosos a la hora de separar las decisiones de política de los detalles de
implementación (mecanismos). Esta separación permite conseguir la máxima flexibilidad
si las decisiones de política se cambian con posterioridad.
Hoy en día, los sistemas operativos se escriben casi siempre en un lenguaje de
implementación de sistemas o en un lenguaje de alto nivel. Este hecho facilita las tareas
de implementación, mantenimiento y portabilidad. Para crear un sistema operativo para
una determinada configuración de máquina, debemos llevar a cabo la generación del
sistema.
Para que un sistema informático empiece a funcionar, la CPU debe inicializarse e
iniciar la ejecución del programa de arranque implementado en firmware. El programa de
arranque puede ejecutar directamente el sistema operativo si éste también está en el
firmware, o puede completar una secuencia en la que progresivamente se cargan
programas más inteligentes desde el firmware y el disco, hasta que el propio sistema
operativo se carga en memoria y se ejecuta.
3.7. Resumen Capítulo 3 (Procesos)
Un proceso es un programa en ejecución. Cuando un proceso se ejecuta, cambia
de estado. El estado de un proceso se define en función de la actividad actual del mismo.
Cada proceso puede estar en uno de los siguientes estados: nuevo, preparado,
en ejecución, en espera o terminado. Cada proceso se representa en el sistema
operativo mediante su propio bloque de control de proceso (PCB).
Un proceso, cuando no se está ejecutando, se encuentra en alguna cola en
espera. Existen dos clases principales de colas en un sistema operativo: colas de
solicitudes de E/S y cola de procesos preparados. Esta última contiene todos los
procesos que están preparados para ejecutarse y están esperando a que se les asigne
la CPU. Cada proceso se representa mediante un bloque PCB y los PCB se pueden
enlazar para formar una cola de procesos preparados. La planificación a largo plazo
(trabajos) es la selección de los procesos a los que se permitirá contender por la CPU.
Normalmente, la planificación a largo p lazo se ve extremadamente influenciada
por las consideraciones de asignación de recursos, especialmente por la gestión de
memoria. La planificación a corto plazo (CPU) es la selección de un proceso de la cola
de procesos preparados.
Los sistemas operativos deben proporcionar un mecanismo para que los procesos
padre creen nuevos procesos hijo. El padre puede esperar a que sus hijos terminen antes
de continuar, o el padre y los hijos pueden ejecutarse de forma concurrente.
Existen varias razones para permitir la ejecución concurrente: compartición de
información, aceleración de los cálculos, modularidad y comodidad.
Los procesos que se ejecutan en el sistema operativo pueden ser procesos
independientes o procesos cooperativos. Los procesos cooperativos requieren un
mecanismo de comunicación interprocesos para comunicarse entre sí.
Fundamentalmente, la comunicación se consigue a través de dos esquemas: memoria
compartida y paso de mensajes. El método de memoria compartida requiere que los
procesos que se van a comunicar compartan algunas variables; los procesos deben
intercambiar información a través del uso de estas variables compartidas. En un sistema
de memoria compartida, el proporcionar mecanismos de comunicación es
responsabilidad de los programadores de la aplicación; el sistema operativo sólo tiene
que proporcionar la memoria compartida.
El método de paso de mensajes permite a los procesos intercambiar mensajes; la
responsabilidad de proporcionar mecanismos de comunicación corresponde, en este
caso, al propio sistema operativo. Estos esquemas no son mutuamente exclusivos y se
pueden emplear simultáneamente dentro de un mismo sistema operativo.
La comunicación en los sistemas cliente-servidor puede utilizar (1) sockets, (2)
llamadas a procedimientos remotos (RPC) o (3) invocación de métodos remotos (RMI)
de Java.
Un socket se define como un punto terminal para una comunicación. Cada
conexión entre un par de aplicaciones consta de una pareja de sockets, uno en cada
extremo del canal de comunicación.
Las llamadas RPC constituyen otra forma de comunicación distribuida; una
llamada RPC se produce cuando un proceso (o hebra) llama a un procedimiento de una
aplicación remota. El mecanismo RMI es la versión Java de RPC. Este mecanismo de
invocación de métodos remotos permite a una hebra invocar un método sobre un objeto
remoto, del mismo modo que invocaría un método sobre un objeto local.
La principal diferencia entre RPC y RMI es que en el primero de esos dos
mecanismos se pasan los datos al procedimiento remoto usando una estructura de datos
ordinaria, mientras que la invocación de métodos remotos permite pasar objetos en las
llamadas a los métodos remotos.
4.6 Resumen Capítulo 4 (Hebras)
Una hebra es un flujo de control dentro de un proceso. Un proceso multihebra
contiene varios flujos de control diferentes dentro del mismo espacio de direcciones.
Las ventajas de los mecanismos, multihebra son que proporcionan una mayor
capacidad de respuesta al usuario, la compartición de recursos dentro del proceso, una
mayor economía y la capacidad de aprovechar las ventajas ellas arquitecturas
multiprocesador.
Las hebras de nivel de usuario son hebras visibles para el programador y
desconocidas para el kernel. El kernel del sistema operativo soporta y gestiona las
hebras del nivel de kernel.
En genera las hebras de usuario se crean y gestionan más rápidamente que las
del kernel, ya que no es necesaria la intervención del kernel. Existen tres modelos
diferentes que permiten relacionar las hebras de usuario y las hebras del kernel.
El modelo muchos-a-uno asigna muchas hebras de usuario a una sola hebra del
kernel; el modelo uno-a-uno asigna a cada hebra de usuario la correspondiente hebra
del kernel; el modelo muchos-a-muchos multiplexa muchas hebras de usuario sobre un
número menor o igual de hebras del kernel.
La mayoría de los sistemas operativos modernos proporcionan soporte para
hebras en el kernel; entre ellos se encuentran Windows 98, NT, 2000 y XP, así como
Solaris y Linux.
Las bibliotecas de hebras proporcionan al programador de la aplicación una API
para crear gestionar hebras. Las tres bibliotecas de hebras principales de uso como ún
son: Pthreads de POSl> las hebras de W in32 para los sistemas W indow s y las hebras
de Java.
Los programas multihebra plantean muchos retos a los programadores, entre los
que se incluye la semántica de las llamadas al sistema fork() y exec(). Otras cuestiones
relevantes son la cancelación de hebras, el tratamiento de señales y los datos
específicos de las hebras.
5. Resumen Capítulo 5 (Planificación del CPU)
La planificación de la CPU es la tarea de seleccionar un proceso en espera de la
cola de procesos preparados y asignarle la CPU. El despachador asigna la CPU al
proceso seleccionado.
La planificación FCFS (first-come, first-served; primero en llegar, primero en ser
servido) es el algoritmo de planificación más sencillo, pero puede dar lugar a que los
procesos de corta duración tengan que esperar a que se ejecuten otros procesos de
duración mucho más grande.
Probablemente, el algoritmo de planificación SJF (shortest-job-first, primero el
trabajo más corto) es el óptimo, proporcionando el tiempo medio de espera más corto.
Sin embargo, la implementación del mecanismo de planificación SJF es complicada, ya
que resulta difícil predecir la duración de la siguiente ráfaga de CPU.
El algoritmo SJF es un caso especial del algoritmo de planificación general
mediante prioridades, que simplemente asigna la CPU al proceso con prioridad más alta.
Tanto la planificación por prioridades como la planificación SFJ presentan el
problema de que los procesos pueden sufrir bloqueos indefinidos. El envejecimiento es
una técnica que trata, precisamente, de evitar los bloqueos indefinidos.
La planificación por turnos es más apropiada para los sistemas de tiempo
compartido (interactivos).
La planificación por turnos asigna la CPU al primer proceso de la cola de procesos
preparados durante q unidades de tiempo, donde q es el cuanto de tiempo. Después de
q unidades de tiempo, si el proceso no ha cedido la CPU, es desalojado y se coloca al
final de la cola de procesos preparados. El problema principal es la selección del tamaño
del cuanto de tiempo. Si es demasiado largo, la planificación por turnos degenera en una
planificación FCFS; si el cuanto de tiempo es demasiado corto, la carga de trabajo
adicional asociada a las tareas de planificación (debido a los cambios de contexto) se
hace excesiva.
El algoritmo FCFS es cooperativo; el algoritmo de planificación por turnos es
apropiativo. Los algoritmos de planificación por prioridades y SFJ pueden ser apropiativo
o sin desalojo (cooperativos).
Los algoritmos de colas multinivel permiten utilizar diferentes algoritmos para las
diferentes clases de procesos. El modelo más común incluye una cola de procesos
interactivos de prime: plano que usa la planificación por turnos y una cola de procesos
por lotes de segundo plano que usa la planificación FCFS. Las colas multinivel
realimentadas permiten pasar los procesos de una cola a otra.
Muchos sistemas informáticos actuales soportan múltiples procesadores y
permiten que cada procesador se auto-planifique de forma independiente. Normalmente,
cada procesador mantiene su propia cola privada de procesos (o hebras), disponibles
para ejecutarse. Entre los problemas relativos a la planificación de sistemas
multiprocesador se encuentran los mecanismos de afinidad al procesador y de
equilibrado de carga.
Los sistemas operativos que soportan hebras en el nivel del kernel deben
planificar hebras, no procesos, para que se ejecuten en los procesadores disponibles;
éste es el caso de Solaris y Windows XP. Ambos sistemas planifican las hebras usando
algoritmos de planificación basados en prioridades y apropiativos, incluyendo soporte
para hebras en tiempo real. El planificador de procesos de Linux usa un algoritmo basado
en prioridades, también con soporte para tiempo real.
Los algoritmos de planificación para estos tres sistemas operativos normalmente
favorecen los procesos interactivos frente a los procesos por lotes y los procesos
limitados por la CPU.
La amplia variedad de algoritmos de planificación obliga a emplear métodos para
elegir entre ellos. Los métodos analíticos usan el análisis matemático para determinar el
rendimiento de un algoritmo. Los métodos de simulación determinan el rendimiento
imitando el algoritmo de planificación sobre una muestra “representativa” de procesos
y calculando el rendimiento resultante.
Sin embargo, la simulación sólo puede, como mucho, proporcionar una
aproximación al verdadero rendimiento del sistema real; la única técnica plenamente
fiable para evaluar un algoritmo de planificación es implementar el algoritmo en un
sistema real y monitorizar su rendimiento en un entorno real.
6.10 Resumen Capítulo 6 (Sincronización de procesos)
Dada una colección de procesos secuenciales cooperativos que compartan datos,
es necesario proporcionar mecanismos de exclusión mutua.
Una solución consiste en garantizar que una sección crítica de código sólo sea
utilizada por un proceso o hebra cada vez.
Existen diferentes algoritmos para resolver el problema de la sección crítica,
suponiendo que sólo haya disponibles bloqueos del almacenamiento.
La principal desventaja de estas soluciones codificadas por el programador es que
todas ellas requieren una espera activa. Los semáforos permiten resolver este problema.
Los semáforos se pueden emplear para solucionar varios problemas de sincronización y
se pueden implementar de forma eficiente, especialmente si se dispone de soporte
hardware para ejecutar las operaciones atómicamente.
Clásicamente, se han definido diversos problemas de sincronización (como el
problema del búfer limitado, el problema de los procesos lectores-escritores, v el
problema de la cena de los filósofos) que son importantes principalmente como ejemplos
de una amplia dase de problemas de control de concurrencia. Estos problemas clásicos
se utilizan para probar casi todos los nuevos esquemas de sincronización propuestos.
El sistema operativo debe proporcionar los medios de protección frente a los
errores de temporización. Se han propuesto diversas estructuras para afrontar estos
problemas. Los monitores proporcionan mecanismos de sincronización para compartir
tipos abstractos de datos. Las variables de condición proporcionan un método mediante
el que un procedimiento de un monitor puede bloquear su ejecución hasta recibir la señal
de que puede continuar.
Los sistemas operativos también proporcionan soporte para la sincronización. Por
ejemplo, Solaris, Windows XP y Linux proporcionan mecanismos como semáforos,
mútex, bloqueos mediante bucles sin fin y variables de condición para controlar el acceso
a datos compartidos. La API de Pthreads proporciona soporte para bloqueos mútex y
variables de condición.
Una transacción es una unidad de programa que se debe ejecutar atómicamente;
es decir, todas las operaciones asociadas con ella se ejecutan hasta completarse, o no
se ejecuta ninguna de las operaciones. Para asegurar la atomicidad a pesar de los fallos
del sistema, podemos usar un registro de escritura anticipada. Todas las actualizaciones
se escriben en el registro, que se almacena en un medio de almacenamiento estable. Si
se produce un fallo catastrófico del sistema, la información contenida en el registro se
usa para restaurar el estado de los elementos de datos actualizados, lo que se consigue
a través de las operaciones de deshacer (undo) y rehacer (redo). Para disminuir el trabajo
de buscar en el registro después de haberse producido un fallo del sistema, podemos
usar un mecanismo de puntos de comprobación.
Para asegurar la señalización cuando se solapa la ejecución de varias
transacciones, debemos emplear un esquema de control de concurrencia. Hay diversos
esquemas de control de concurrencia que aseguran la señalización retardando una
operación o cancelando la transacción que ejecutó la operación. Los métodos más
habitualmente utilizados son los protocolos de bloqueo y los esquemas de ordenación
mediante marcas temporales.
7.8 Resumen Capítulo 7 (Interbloqueos)
Un estado de interbloqueo se produce cuando dos o más procesos están
esperando indefinidamente a que se produzca un suceso que sólo puede producirse
como resultado de alguna operación efectuada por otro de los procesos en espera.
Existen tres métodos principales para tratar los interbloqueos:
• Utilizar algún protocolo de prevención o evasión de los interbloqueos,
asegurando que el sistema nunca entrará en un estado de interbloqueo.
• Permitir que el sistema entre en un estado de interbloqueo, detectarlo y luego
recuperarse de él.
• ignorar el problema y actuar como si los interbloqueos nunca fueran a
producirse en el sistema.
La tercera solución es la que aplican la mayor parte de los sistemas operativos,
incluyendo UNIX y Windows.
Un interbloqueo puede producirse sólo si se dan simultáneamente en el sistema
cuatro condiciones necesarias: exclusión mutua, retención y espera, ausencia de
mecanismos de desalojo y espera circular.
Para prevenir los interbloqueos, podemos hacer que al menos una de las
condiciones necesarias nunca llegue a cumplirse.
Un método de evasión de los interbloqueos que es menos restrictivo que los
algoritmos de prevención requiere que el sistema operativo disponga de antemano de
información sobre el modo en que cada proceso utilizará los recursos del sistema. Por
ejemplo, el algoritmo del banquero requiere tener de antemano información sobre el
número máximo de recursos de cada clase que cada proceso puede solicitar. Con esta
información, podemos definir un algoritmo para evitar los interbloqueos.
Si un sistema no emplea un protocolo para asegurar que nunca se produzcan
interbloqueos, entonces debe utilizarse un esquema de detección y recuperación. Es
necesario invocar un algoritmo de detección de interbloqueos para determinar si se ha
producido un interbloqueo. En caso afirmativo, el sistema tiene que recuperarse
terminando algunos de los procesos interbloqueados o desalojando recursos de algunos
de los procesos interbloqueados.
Cuando se emplean técnicas de apropiación para tratar los interbloqueos, deben
tenerse en cuenta tres cuestiones: la selección de una víctima, las operaciones de
anulación y la muerte por inanición de los procesos.
En un sistema que seleccione a las víctimas a las que hay que aplicar las
operaciones de anulación fundamentalmente basándose en los costes, puede producirse
la muerte por inanición de los procesos y el proceso seleccionado puede no llegar nunca
a completar sus tareas.
Por último, algunos investigadores sostienen que ninguno de los métodos básicos
resulta apropiado, por sí solo, para cubrir el espectro completo de los problemas de
asignación de recursos en los sistemas operativos. Sin embargo, pueden combinarse los
distintos métodos básicos con el fin de poder seleccionar un método óptimo para cada
clase de recursos de un sistema.
8.8 Resumen capítulo 8 (memoria principal)
Los algoritmos de gestión de memoria para los sistemas operativos
multiprogramados van desde la técnica simple de los sistemas monousuario hasta los
mecanismos de segmentación paginada.
La consideración más importante a la hora de determinar el método que hay que
utilizar en un sistema completo es el hardware proporcionado. Cada dirección de
memoria generada por la CPU puede ser comprobada para verificar su legalidad y debe
también, posiblemente, ser mapeada sobre una dirección física. Esas comprobaciones
no pueden implementarse (de manera eficiente) por software; por tanto, estamos
constreñidos por el hardware disponible.
Los diversos algoritmos de gestión de memoria (asignación contigua, paginación,
segmentación y la combinación de los mecanismos de paginación y segmentación)
difieren en muchos aspectos. A la hora de comparar las diferentes estrategias de gestión
de memoria, utilizamos las siguientes consideraciones:
• Soporte hardware. Un simple registro base o una pareja de registros base-
límite resulta suficiente para los esquemas de partición simple y múltiple,
mientras que la paginación y la segmentación necesitan tablas de mapeo para
definir el mapa de direcciones.
• Rendimiento. A medida que se incrementa la complejidad del algoritmo de
gestión de memoria, el tiempo requerido para mapear una dirección lógica
sobre una dirección física también aumenta. Para los sistemas simples, sólo
necesitamos realizar operaciones de comparación o de sumas con la dirección
lógica, operaciones que son rápidas de realizar. La paginación y la
segmentación pueden ser igualmente rápidas si la tabla de mapeo está
implementada en registros de alta velocidad. Sin embargo, si la tabla está en
memoria, los accesos a la memoria de usuario pueden degradarse de manera
sustancial. Un TLB puede reducir esa degradación hasta un nivel aceptable.
• Fragmentación. Un sistema multiprogramado tendrá, generalmente, un mayor
rendimiento y una mayor eficiencia si tiene un alto grado de multiprogramación.
Para un conjunto dado de procesos, sólo podemos incrementar el nivel de
multiprogramación haciendo que quepan más procesos en memoria. Para
poder conseguir esto, necesitamos reducir memoria desperdiciada debido a la
fragmentación. Los sistemas con unidades de asignación de tamaño fijo, como
los esquemas de partición simple y de paginación, presentan un problema de
la fragmentación interna. Los sistemas con unidades de asignación de tamaño
variable, como los esquemas de partición múltiple y de segmentación,
presentan el problema de la fragmentación externa.
• Reubicación. Una solución al problema de la fragmentación externa es la
compactación. El mecanismo de compactación implica mover un programa en
memoria de tal forma que no note el cambio. Este proceso requiere que las
direcciones lógicas se reubiquen dinámicamente en tiempo de ejecución. Si
las direcciones sólo se reubican en tiempo de carga podremos compactar el
espacio de almacenamiento.
• Intercambio. Podemos añadir mecanismos de intercambio a cualquier
algoritmo. A intervalos determinados con el sistema operativo, usualmente
dictados por las políticas de planificación de la CPU, los procesos se copian
desde la memoria principal a un almacén de respaldo y luego se vuelven a
copiar de vuelta a la memoria principal. Este esquema permite ejecutar más
procesos de los que cabrían en memoria en cualquier instante determinado^
• Compartición. Otro medio de incrementar el nivel de multiprogramación
consiste en compartir el código y los datos entre diferentes usuarios. La
compartición requiere, generalmente, que se utilice un mecanismo de
paginación o de segmentación, con el fin de disponer a pequeños paquetes de
información (páginas o segmentos) que puedan ser compartidos. La
compartición es un modo de ejecutar múltiples procesos con una cantidad
limitada de memoria, pero los programas y datos compartidos deben ser
diseñados con sumo cuidado.
• Protección. Si se proporciona un mecanismo de paginación o segmentación,
las diferentes secciones de un programa de usuario pueden declararse como
de sólo ejecución, de sólo lectura o de lectura-escritura. Esta restricción es
necesaria para el código o los datos compartídos y resulta, generalmente, útil
en cualquier caso para proporcionar un mecanismo simple de comprobación
en tiempo de ejecución, con el que evitar errores de programación comunes.
9.11 Resumen Capítulo 9 (Memoria Virtual)
Resulta deseable poder ejecutar un proceso cuyo espacio lógico de direcciones
sea mayor que el espacio físico de direcciones disponible. La memoria virtual es una
técnica que nos permite mapear un espacio lógico de direcciones de gran tamaño sobre
una memoria física más pequeña.
La memoria virtual nos permite ejecutar procesos extremadamente grandes e
incrementar el grado de multiprogramación, aumentando así la tasa de utilización de la
CPU. Además, evita que los programadores de aplicaciones tengan que preocuparse
acerca de la disponibilidad de memoria. Además, con la memoria virtual, varios procesos
pueden compartir las bibliotecas del sistema y la memoria. La memoria virtual también
nos permite utilizar un eficiente tipo de mecanismo de creación de procesos conocido
con el nombre de copia durante la escritura y que es un mecanismo mediante el que los
procesos padre e hijo comparten páginas de la memoria.
La memoria virtual se suele implementar mediante un mecanismo de paginación
bajo demanda. En la paginación bajo demanda pura nunca se carga una página en
memoria hasta que se haga referencia a esa página. La primera referencia provoca un
fallo de página que deberá ser tratado por el sistema operativo. El kernel del sistema
Operativo consulta una tabla interna para determinar dónde está ubicada la página
dentro del dispositivo de almacenamiento del respaldo. A continuación, localiza un marco
libre y carga en él la página desde ese dispositivo de almacenamiento. La tabla de
páginas se actualiza para reflejar este cambio y a continuación se reinicia la instrucción
que provocó el fallo de página. Esta técnica permite que un proceso se ejecute aun
cuando no se encuentre completa en la memoria principal toda su imagen de memoria.
Siempre que la tasa de fallos de páginas sea razonablemente baja, el rendimiento será
aceptable.
Podemos utilizar la paginación bajo demanda para reducir el número de marcos
asignado un proceso. Este mecanismo puede incrementar el grado de multiprogramación
(permitiendo que haya más procesos disponibles para ejecución en cada momento) y, al
menos en teoría, la tasa de utilización de la CPU del sistema. También permite que se
ejecuten procesos aunque sus requerimientos totales de memoria excedan de la
memoria física disponible total. Dichos procesos se ejecuten memoria virtual.
Si los requisitos totales de memoria sobrepasan la memoria física disponible,
puede que sea necesario sustituir páginas de la memoria, con el fin de liberar marcos
para cargar las páginas que utilizan diversos algoritmos de sustitución de páginas. La
sustitución de páginas FIFO es fácil de programar pero sufre de la denominada anomalía
de Belady. La sustitución óptima de páginas requiere un conocimiento futuro sobre la
secuencia de referencias a memoria. La sustitución, o dinámica, es una aproximación de
la sustitución óptima de páginas, pero puede resultar difícil de implementar. La mayoría
de los algoritmos de sustitución de páginas, como el algoritmo de segunda oportunidad,
son aproximaciones del mecanismo de sustitución LRU. Además del algoritmo de
sustitución de páginas, hace falta definir una política de asignación de marcos. La
asignación puede ser fija, lo que favorece una sustitución local de páginas, o dinámica
mica, lo que favorece una sustitución global. El modelo del conjunto de trabajo presupone
que los procesos se ejecutan en localidades. El conjunto de trabajo es el conjunto de
páginas contenidas la localidad actual. Correspondientemente, a cada proceso debe
asignárseles los suficientes marcos para su conjunto de trabajo actual. Si un proceso no
dispone de la suficiente memoria paras conjunto de trabajo, entrará en sobrepaginación.
Proporcionar los suficientes marcos a cada proceso para evitar la sobrepaginación puede
requerir mecanismos de intercambio y planificación de procesos.
La mayoría de los sistemas operativos proporcionan funciones para mapear en
memoria los archivos, permitiendo así tratar la E/S de archivo como si fuera una serie de
accesos normales a memoria. La API Win32 implementa la memoria compartida
mediante un mecanismo de mapeo en memoria de archivos.
Los procesos del kernel suelen requerir que se les asigne memoria utilizando
páginas que sea físicamente contiguas. El sistema de descomposición binaria asigna la
memoria a los procesos del kernel en una serie de unidades cuyo tamaño es una
potencia de 2, lo que provoca a menudo que aparezca el fenómeno de la fragmentación.
El mecanismo de asignación de franjas asigna las estructuras de datos del kernel a una
serie de cachés asociadas con franjas, que estén compuestas de una o más páginas
físicamente contiguas. Con la asignación de franjas, no se desperdicia memoria debido
a la fragmentación y las solicitudes de memoria pueden satisfacerse rápidamente.
Además de requerir que resolvamos los problemas principales, que son la
sustitución de páginas y la asignación de marcos, un apropiado diseño de un sistema de
paginación requiere que tengamos en cuenta el tamaño de las páginas, la E /S , el
bloqueo, la prepaginación, la creación de procesos, la estructura de los programas y
otras cuestiones.

También podría gustarte