1) Un sistema operativo gestiona el hardware de la computadora y proporciona un entorno para ejecutar programas de aplicación. 2) Un sistema operativo permite tener varios trabajos en memoria al mismo tiempo mediante la multiprogramación, asegurando que la CPU siempre tenga un trabajo que ejecutar. 3) Un sistema operativo gestiona los procesos, la memoria, el almacenamiento y protege los recursos del sistema.
0 calificaciones0% encontró este documento útil (0 votos)
97 vistas14 páginas
1) Un sistema operativo gestiona el hardware de la computadora y proporciona un entorno para ejecutar programas de aplicación. 2) Un sistema operativo permite tener varios trabajos en memoria al mismo tiempo mediante la multiprogramación, asegurando que la CPU siempre tenga un trabajo que ejecutar. 3) Un sistema operativo gestiona los procesos, la memoria, el almacenamiento y protege los recursos del sistema.
1) Un sistema operativo gestiona el hardware de la computadora y proporciona un entorno para ejecutar programas de aplicación. 2) Un sistema operativo permite tener varios trabajos en memoria al mismo tiempo mediante la multiprogramación, asegurando que la CPU siempre tenga un trabajo que ejecutar. 3) Un sistema operativo gestiona los procesos, la memoria, el almacenamiento y protege los recursos del sistema.
1) Un sistema operativo gestiona el hardware de la computadora y proporciona un entorno para ejecutar programas de aplicación. 2) Un sistema operativo permite tener varios trabajos en memoria al mismo tiempo mediante la multiprogramación, asegurando que la CPU siempre tenga un trabajo que ejecutar. 3) Un sistema operativo gestiona los procesos, la memoria, el almacenamiento y protege los recursos del sistema.
Descargue como DOCX, PDF, TXT o lea en línea desde Scribd
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.