You are on page 1of 39

TEMA 3 SOM

ESTRUCTURA DEL SISTEMA OPERATIVO

PRIMERA PARTE DEL TEMA 3.


INDICE

1. ELEMENTOS Y ESTRUCTURA DEL SISTEMA OPERATIVO........................................................ 2


2. FUNCIONES DEL SISTEMA OPERATIVO. RECURSOS .............................................................. 6
3. GESTION DE PROCESOS ......................................................................................................... 7
4. GESTION DE MEMORIA PRINCIPAL ..................................................................................... 23

1
1. ELEMENTOS Y ESTRUCTURA DEL SISTEMA OPERATIVO

Podríamos definir el concepto de Sistema Operativo como un programa, o un


conjunto de programas que colaboran entre ellos para administrar los elementos
físicos de un sistema informático, optimizando su uso y ofreciendo determinados
servicios a los programas de aplicación.
Un sistema operativo se encargará de aspectos como:

• El uso, compartido y ordenado, de los recursos entre diferentes usuarios.


• La protección de recursos, para evitar que un usuario acceda a recursos
para los que no está autorizado.

Para que esta protección sea posible, el sistema informático debe ser capaz de
ejecutar instrucciones en dos niveles diferentes:

• En modo usuario: es el modo menos privilegiado de funcionamiento del


sistema. En este modo no se permite el acceso directo al hardware. Las
instrucciones que se ejecutan en este modo sólo pueden acceder a su
propio espacio de direcciones de memoria y utilizan el API del sistema
para requerir los servicios del sistema operativo. Este es el modo de
ejecución que utilizan todos los programas de aplicación que tengamos
instalados

• En modo núcleo (también llamado modo kernel) o modo supervisor: En él,


las instrucciones se ejecutan en un modo privilegiado, teniendo acceso
directo a toda la memoria (incluidos los espacios de direcciones de todos
los procesos que estén ejecutándose). También podrán acceder a todo
el hardware disponible. En este modo sólo se ejecutan algunas partes
del sistema operativo.

Desde un punto de vista comercial, los sistemas operativos se ofrecen como


un software que incluye diferentes herramientas para proporcionar
funcionalidades básicas al usuario.

2
Esto hace que el usuario piense en el navegador web o en el editor de
textos como partes del sistema operativo. Sin embargo, esta creencia es
errónea, ya que el navegador web, el procesador de textos e incluso la
propia interfaz gráfica que estamos utilizando forman parte del concepto
de software de aplicación. El verdadero sistema operativo se encuentra oculto
bajo estas y otras herramientas, haciendo de intermediario entre ellas y
el hardware del ordenador.

Elementos de un sistema operativo


Como podemos imaginar, un sistema operativo es un programa muy
complejo que debe estar muy bien organizado y estructurado internamente para
llevar a cabo su trabajo de una forma muy eficiente. En este sentido, los sistemas
operativos se subdividen en diferentes componentes que se encuentran
especializados en aspectos muy concretos del mismo.

Los elementos que constituyen la mayoría de los sistemas operativos son los
siguientes:

• Gestor de procesos.
• Gestor de memoria virtual.
• Gestor de almacenamiento secundario.
• Gestor de entrada y salida.
• Sistema de archivos.
• Sistemas de protección.
• Sistema de comunicaciones.
• Programas de sistema.
• Gestor de recursos.

Como puede suponerse, cada uno de los elementos que componen el


sistema operativo se encarga de una función particular. Más abajo estudiaremos
las principales funciones que resuelve un sistema operativo.

3
Estructura de un sistema operativo
Ahora que ya sabemos que el sistema operativo se divide en distintos elementos,
podemos plantearnos el modo en el que dichos elementos se organizan dentro
del sistema operativo para llevar a cabo su cometido. También será importante
para el diseño del sistema establecer qué componentes del mismo se ejecutan
en modo núcleo y cuáles en modo usuario.

En este sentido, los planteamientos que se aplican en los sistemas


operativos más conocidos son los siguientes:

• Monolítico.
• Micronúcleo.
• Núcleo híbrido.

Sistemas operativos con estructura monolítica


En este tipo de sistemas, el núcleo concentra la mayor parte de la
funcionalidad del sistema operativo (sistema de archivos, gestión de memoria,
etc), de modo que todos sus componentes principales se ejecutarán en modo
núcleo. Aunque estos componentes se programen de forma separada se unen
durante el proceso de compilación mediante un enlazador (linker).

Para añadir flexibilidad a esta estructura, los sistemas operativos modernos que
la utilizan (como es el caso de GNU/Linux) pueden cargar módulos ejecutables
de forma dinámica, permitiéndole actuar, en cierto modo, como un micronúcleo.

En una estructura monolítica pura tendríamos un núcleo complejo y de gran


tamaño que debería ser recompilado por completo ante cualquier modificación.
Sin embargo, cuando se utiliza la carga dinámica de módulos, éstos pueden
compilarse por separado y cargarse durante la ejecución del sistema. En
cualquier caso, seguirán ejecutándose en modo privilegiado, lo que, comparado
con un sistema con estructura de micronúcleo, lo hace más rápido, pero más
vulnerable a errores de programación.

Como ejemplos de sistemas con estructura monolítica podemos


nombrar Solaris, FreeBSD, OSX (versiones anteriores a la 9), GNU/Linux y las
versiones de escritorio de Windows anteriores a XP.

4
Sistemas operativos con estructura de micronúcleo
En este tipo de sistemas, el núcleo sólo contiene la implementación de servicios
básicos como el soporte de acceso a memoria de bajo nivel, la administración
de tareas y la comunicación entre procesos (también conocida como IPC, del
inglés, Inter-Process Communication).

En este tipo de arquitectura, el micronúcleo es el único componente que se


ejecuta en modo privilegiado. El resto de las funciones del sistema, como
los controladores de dispositivos (drivers), el sistema de archivos, la gestión de
E/S, etc, se ejecutan en modo usuario. De esta forma, es más difícil que un error
de programación en uno de los módulos afecten al funcionamiento del resto
(haciendo que el sistema sea más fiable). Además, los módulos se pueden
programar, compilar y cargar por separado.

Sin embargo, pueden presentar dificultades en la sincronización de sus


componentes, pueden ocasionar una mayor complejidad del código resultante y
puede ofrecer un bajo rendimiento por las continuas llamadas entre módulos y
los constantes cambios en el modo de ejecución.

Como ejemplos de sistemas con estructura de micronúcleo podemos


nombrar AIX, AmigaOS, Minix, Symbian (aunque en algunos textos aparece
como monolítico con carga dinámica de módulos) y NeXTStep (aunque a veces
lo encontramos entre los sistemas con núcleo híbrido).

De cualquier modo, el que probablemente despierte más interés, a pesar de que


aún no se ha presentado en el momento de escribir este documento,
sea HarmonyOS, el nuevo sistema operativo de Huawei diseñado para
dispositivos móviles.

5
2. FUNCIONES DEL SISTEMA OPERATIVO. RECURSOS
La estructura de un sistema operativo se divide en diferentes módulos que suelen
estar especializados en funciones concretas. Aunque antes hemos nombrado los
módulos más comunes, en este apartado nos vamos a centrar únicamente en
las funciones que realizan. En algunos casos existe una relación directa entre un
determinado módulo y una función concreta del sistema operativo. Sin embargo,
en otros casos, son varios los módulos que cooperan de algún modo para llevar
a cabo una función específica.

A continuación, incluiremos las principales funciones que lleva a cabo cualquier


sistema operativo:

• Gestión de procesos.

• Gestión de memoria.

• Gestión de archivos.

• Gestión de Entrada/Salida (E/S)

En este tema (parte del tema) vamos a estudiar los dos primeros puntos.

6
3. GESTION DE PROCESOS
La idea fundamental que tenemos de un sistema informático consiste en un
dispositivo que es capaz de ejecutar ordenes agrupadas en forma de programas.

Mientras un programa no se encuentre en ejecución, no será nada más que un


archivo de datos en un medio de almacenamiento.

En este sentido, podemos entender el concepto de proceso como un programa


que se está ejecutando. Sin embargo, una definición más académica sería así:

Una unidad de actividad que ejecuta una secuencia ordenada de instrucciones,


que dispone de una serie de recursos asignados por el sistema y que se
encuentra en un estado particular.

Otro matiz a tener en cuenta es que un programa, entendido como un archivo


que contiene órdenes, reside en la memoria secundaria del ordenador, mientras
que un proceso reside en la memoria principal.

Todo proceso tiene asociado un espacio de direcciones en la memoria principal,


donde se guardan las propias instrucciones del proceso y los datos que maneja.
Además, el sistema dispondrá de una Tabla de procesos donde guarda la
información relevante de cada proceso. Esta información puede variar según el
sistema operativo del que hablemos pero, en general, nos encontraremos estos
datos:

• El identificador del proceso (PID, del inglés, Process IDentifier)

• El estado del proceso, es decir, si se está ejecutando, o no.

• Su prioridad con respecto al resto de los procesos del sistema.

• La posición de memoria donde se encuentra.

• Etc.

7
Dada su importancia, normalmente, los sistemas operativos se diseñan en torno
al modo en el que manejan los procesos, tratando de resolver de la mejor forma
posible las siguientes situaciones:

• Ofrecer a los procesos los recursos que necesiten, atendiendo a una


estrategia de asignación concreta (permisos, prioridad, evitar
interbloqueos, etc.)

• Repartir el tiempo de ejecución del procesador entre varios procesos, de


forma que esté ocupado el mayor tiempo posible, ofreciendo la sensación
de que los procesos se están ejecutando a la vez y permitiendo que todos
ellos tengan un tiempo de respuesta adecuado.

• Facilitar la creación de procesos por parte del usuario y de otros procesos,


y la comunicación entre distintos procesos. La creación de un proceso hijo
por parte de un proceso padre se denomina process spawning.

¿Cómo se ejecuta un proceso?


Como hemos dicho antes, para que un proceso se ejecute, su secuencia de
instrucciones debe encontrarse en la memoria principal. Además, en todos los
sistemas operativos modernos, se va intercalando la ejecución de distintos
procesos, de forma que se alternan el uso del procesador.

Para saber en qué posición de memoria se encuentra la siguiente instrucción


que debe ejecutarse, el procesador dispone de un registro llamado Contador de
programa (en inglés, Program Counter, o PC), que irá cambiando de valor según
pase el tiempo.

La secuencia de valores que vaya teniendo el Contador de programa podrán


apuntar a instrucciones de diferentes procesos.

El procesador ejecutará el código perteneciente a un módulo del sistema


operativo, llamado Distribuidor (en inglés, Dispatcher), cada vez que un proceso
haya consumido su tiempo (medido en ciclos de instrucción) o haya solicitado
algún servicio por el que deba esperar (p. ej. una operación de E/S).

8
Podemos definir un ciclo de instrucción como el tiempo que emplea el
procesador en ejecutar una instrucción en lenguaje máquina y, de un modo
simplificado, podríamos dividirlo en dos pasos:

• El ciclo de lectura (en inglés, fetch), que consiste en cargar una


instrucción desde la memoria principal a los registros del procesador

• El ciclo de ejecución (en inglés, execute), que consiste en interpretar la


instrucción (decodificarla) y ejecutarla, enviando las señales adecuadas a
los componentes que deben realizar la operación que indica la instrucción.

Por este motivo, también suele llamarse ciclo de fetch-and-execute o fetch-


decode-execute.

Llamamos multitarea o multiprogramación a la capacidad que tienen los


sistemas operativos actuales de alternar el uso del procesador entre distintos
procesos. Dada la velocidad a la que funcionan los procesadores, el usuario tiene
la sensación de que los procesos se ejecutan al mismo tiempo.

9
Por otro lado, cuando en un sistema informático disponemos de varios
procesadores (o incluso un único procesador con varios núcleos), pueden
ejecutarse varios procesos al mismo tiempo. A esta técnica la
llamamos multiproceso o multiprocesamiento. Cuando todos los procesadores
(o núcleos) actúan en igualdad de condiciones, hablamos de multiproceso
simétrico o SMP (del inglés Symmetric Multi-Processing). Cuando el sistema
dispone de procesadores con funciones especializadas, hablamos
de multiproceso asimétrico o AMP (del inglés, Asymmetric Multi-Processing).

10
¿Cómo se intercalan los procesos?
Ya hemos dicho más arriba que el procesador ejecutará el código perteneciente
a un módulo del sistema operativo, llamado Distribuidor, cada vez que un
proceso haya consumido su tiempo o haya solicitado algún servicio por el que
deba esperar. Así se evita que un proceso se apropie del procesador de forma
indefinida.

De la idea anterior, podemos deducir que un proceso en particular puede


encontrarse en tres situaciones diferentes:

11
• En ejecución: En este estado se encontrará el proceso que ocupa la
atención del procesador en ese momento. Si el ordenador dispone de
varios procesadores, o varios núcleos, podrá existir un proceso en
ejecución por cada uno de los núcleos presentes.

• Preparado: En este estado se encuentran los procesos que no se están


ejecutando, pero que podrían hacerlo en cualquier momento y sólo
esperan su oportunidad para hacerlo.

• Bloqueado: En este estado estarán los procesos que han solicitado algún
servicio del sistema operativo y están esperando una respuesta.

• Cada vez que se crea un nuevo proceso, este es situado en estado


de Preparado.

• Cuando el proceso que se está ejecutando es interrumpido,


el Distribuidor elige un nuevo proceso entre los que se encuentran en
estado Preparado. El estado del proceso elegido pasa a ser En
ejecución mientras que el proceso que abandona la ejecución pasará a
estado Preparado (si ha consumido su tiempo) o Bloqueado (si ha
realizado una petición al sistema).

• Los procesos que se encuentran en estado Preparado aguardan su turno


en una cola.

12
Cuando se ejecuta el módulo del kernel que se encarga de parar la ejecución de
un proceso y realizar los cambios necesarios para que se ejecute un proceso
diferente, decimos que se ha producido un cambio de contexto.

13
Un cambio de contexto lleva a cabo las siguientes acciones:

1. Guarda en la memoria principal el valor de los registros del procesador


para el proceso que se estaba ejecutando.

2. Recupera el valor de los registros del procesador, desde la memoria


principal, para el proceso que toma el relevo. El proceso elegido
dependerá del Planificador del sistema operativo, que aplicará una
determinada política para elegirlo (turno, prioridad, etc.).

3. Se ejecuta la instrucción indicada en el Contador de Programa, que forma


parte del contexto que acabamos de recuperar y, por lo tanto, será la
siguiente del nuevo proceso.

¿Cuándo acaba un proceso?

Todos los sistemas operativos deben tener un mecanismo para identificar


cuando termina un proceso. Si se trata de un script o un proceso por lotes (batch)
concluirá cuando acaben sus instrucciones o cuando se encuentre una orden de
parada (Halt). Si es un proceso interactivo, será el usuario el que elija el momento
de terminar.

14
Además, un proceso puede verse interrumpido abruptamente por diversos
motivos. Entre ellos, podemos encontrar los siguientes:

• Sobrepasar el tiempo de ejecución asignado al proceso (tiempo real, de


uso del procesador, etc.) o el tiempo máximo de espera ante un suceso.

• No disponer de memoria suficiente para satisfacer las solicitudes del


proceso

• Que el proceso trate de acceder a posiciones de memoria o recursos del


sistema que no tiene autorizados.

• Que una de sus instrucciones contenga un error aritmético o los datos no


sean del tipo o tamaño adecuado.

• Que surja un error en una operación de entrada/salida (no existe un


archivo, se produce un error de lectura, etc.)

• Que una instrucción del programa no exista en el juego de instrucciones o


que sea una instrucción reservada al sistema operativo.

• Que el sistema operativo, el usuario o el proceso padre decida terminarlo.


También suelen terminar los procesos hijos cuando termina el proceso
padre.

Lógicamente, cuando un proceso termina, abandona su estado (En


ejecución, Preparado, Bloqueado) y es eliminado de la cola o colas que
dependan del Distribuidor.

Planificación de procesos

Una de las claves para que un sistema multiprogramado sea eficaz es


la Planificación de procesos, que consiste en ir asignando procesos al
procesador (o procesadores / núcleos) a lo largo del tiempo, de forma que se
cumplan los objetivos en varios aspectos:

• Rendimiento: Trata de maximizar el número de acciones que se


completan en un plazo de tiempo determinado.

• Tiempo de respuesta: El sistema debe responder a las solicitudes de los


usuarios en un tiempo adecuado.

• Tiempo de retorno: El sistema debe ofrecer resultados de los procesos


por lotes en un tiempo adecuado.

• Equidad: Todos los procesos deben ser considerados según sus


características.

• Eficiencia: Se debe aspirar a que el procesador esté activo


constantemente.

15
Como cabe esperar, el módulo del sistema operativo que se encarga de esta
tarea se denomina Planificador (en inglés, Scheduler).

Según el diseño del sistema operativo, el Planificador utilizará unos criterios u


otros para llevar a cabo su tarea. Estos criterios reciben el nombre de Algoritmos
de Planificación (o también, Políticas de Planificación).

A continuación, nombramos los más importantes:


Primero en llegar primero en ser servido, o FCFS (del
inglés, First Come First Served)

Se emplea en procesos por lotes (sin intervención del usuario) y es no


apropiativo. Los procesos se van poniendo en cola según llegan y se les asigna
el estado Preparado. Cuando es asignado al procesador, no lo abandona hasta
que termina.

Una de sus ventajas principales consiste en que es un algoritmo muy sencillo de


implementar y también es fácilmente predecible.

Entre sus principales inconvenientes podemos mencionar que los procesos


largos pueden hacer esperar mucho a los procesos cortos y que el tiempo de
servicio mínimo variará mucho según el número de procesos ejecutados y la
duración de los mismos. Además, el tiempo medio de espera depende de que
lleguen antes los procesos más cortos o los más largos.

Ejemplo:

16
Primero el más corto, o SJF (del inglés, Shortest Job First)

Se emplea en procesos por lotes (sin intervención del usuario) y es no


apropiativo. Los procesos se van poniendo en cola según llegan y se les asigna
el estado Preparado, pero el Planificador elige el que tiene un menor tiempo
previsto de ejecución.

17
Primero el de menor tiempo restante, o SRTN (del
inglés, Shortest Remaining Time Nex)

Existe una versión apropiativa de este algoritmo denominada Primero el de


menor tiempo restante, o SRTN (del inglés, Shortest Remaining Time Next). En
este caso, si un proceso bloqueado pasa al estado Preparado, el distribuidor
comprueba si su tiempo restante es inferior que el del proceso que se encuentra
en ejecución. En caso afirmativo, éste toma el control del procesador y el proceso
que está ejecutándose pasa al estado Preparado.

Aunque es un algoritmo muy eficaz para los procesos cortos, resulta difícil
predecir los intervalos de asignación del procesador e, incluso, puede haber
procesos largos que sufran de inanición, es decir, que no lleguen a ejecutarse
mientras existan procesos cortos esperando turno.

18
Por turnos, o Round Robin

Se emplea en procesos interactivos (en los que interviene el usuario) y es


apropiativo. Los procesos se van poniendo en cola según llegan y se les asigna
el estado Preparado. El procesador se irá asignando a cada proceso, por orden,
durante una fracción de tiempo llamada Quantum, que es igual para todos. Si el
proceso se acaba, se bloquea, o si se agota su tiempo, el procesador es liberado
para el siguiente proceso de la lista.

Por lo tanto, la cola de procesos actúa como una estructura circular con
organización FIFO.

19
Planificación de Colas Múltiples, o MQS (Multilevel Queue
Scheduling)

Se emplea tanto en procesos interactivos como en procesos por lotes (en los
que no interviene el usuario) y es apropiativo. Consiste en fragmentar la cola de
procesos en estado Preparado en varias colas más pequeñas, de modo que
cada una puede estar administrada por un algoritmo de planificación diferente.
De este modo, cada proceso será asignado a una determinada cola en función
de sus características pudiendo tratar de manera diferente, por ejemplo, a los
procesos interactivos y a los procesos por lotes.

Comunicación entre procesos

En muchas ocasiones, un sistema operativo ejecuta varios procesos que


deben comunicarse entre ellos para colaborar en un objetivo común. Para
lograrlo, el sistema puede ofrecer una serie de funciones llamadas IPC (del
inglés, Inter-Process Communication) que facilitan el envío de mensajes entre
los procesos para comunicarse y sincronizarse. Otra forma que tienen los
procesos de comunicarse entre sí es compartiendo determinadas zonas de
memoria.

Cuando los procesos que necesitan comunicarse están en ordenadores


diferentes, se utiliza RPC (del inglés, Remote Procedure Call). Sin embargo,
quien programa dichos procesos no tendrá que preocuparse de su ubicación
física y de los aspectos que deriven de esa circunstancia. Para ellos, no habrá
diferencia con la comunicación con procedimientos locales. Es decir, será el
sistema operativo quien se encargue de resolver los problemas que se deriven
de esta situación.

20
Procesos y servicios
En los sistemas operativos existe un tipo de proceso con características
particulares a los que suele llamarse Servicios. Este tipo de procesos suele
ejecutarse en segundo plano, es decir, sin que el usuario tenga constancia
directa de su presencia y, normalmente, esperan un tipo de suceso para ofrecer
una determinada prestación al usuario.

Por ejemplo, el servicio de impresión se encarga de administrar todas las


solicitudes de los diferentes programas para usar la impresora. Normalmente, no
tendremos constancia de que se está ejecutando. Salvo que se produzca algún
incidente, lo único que comprobamos es que el trabajo de impresión se realiza
correctamente, incluso cuando varios programas traten de imprimir un
documento al mismo tiempo.

Es muy común que un servicio no ofrezca información sobre su


funcionamiento a través de la pantalla, sino que suelen utilizarse archivos de
registro donde realizan anotaciones (conocidos como archivos “log”, cuya
traducción, más o menos literal al español, puede ser “anotar”).

El visor de eventos de Windows nos permite ver la información referida a este


apartado.

21
22
4. GESTION DE MEMORIA PRINCIPAL
Podemos entender la memoria principal como un inmenso casillero, que
almacena programas y datos. Cada una de las casillas está numerada (con una
dirección).
Los sistemas operativos modernos son, casi siempre, multiprogramados. Es
decir, ejecutan varios procesos de forma concurrente. Esto significa que la
memoria debe dividirse para darles cabida.
Cuanto más eficaz sea ese reparto, más procesos podrán ejecutarse a la vez,
lo que redundará en un mayor rendimiento (no debemos olvidar que el
procesador es el elemento más rápido del sistema y que el objetivo principal
consiste en que siempre tenga instrucciones listas para ser ejecutadas).
Además, la gestión de memoria deberá cumplir con las siguientes
necesidades:
• Protección: Debe evitarse que un proceso haga referencia a posiciones
de memoria de un proceso diferente.

Como el sistema operativo no puede anticiparse a todos los accesos que


realizará un proceso durante su ejecución, es el procesador quien debe tener un
mecanismo que intercepte los accesos no permitidos.
• Reubicación: Como veremos más adelante, una forma de dar cabida a
más procesos consiste en descargar a disco la totalidad o una parte de la
memoria ocupada por un proceso (por ejemplo, mientras se
encuentra bloqueado). La reubicación consiste en que, al volver a la
memoria, no sea necesario que ocupe la posición original.

23
Para que esto sea posible las referencias que hagan los programas a
direcciones de memoria deben ser lógicas y serán el hardware y el sistema
operativo quienes colaboren para realizar la traducción.
• Compartición: Debe existir la posibilidad de que varios procesos
compartan información a través de una zona de memoria compartida. Por
ejemplo, es más eficiente que varios procesos accedan al mismo código
de una biblioteca de funciones compartida (lo que
en Windows conocemos como DLL), que mantener varias copias de ésta.
Igual puede ocurrir con datos que manejen diferentes procesos.
Como dijimos al hablar de procesos, para que un programa pueda ejecutarse,
sus instrucciones y sus datos tendrán que estar presentes en la memoria
principal del sistema, lo que conocemos como memoria RAM. Como hemos visto
más arriba, planificando el uso del procesador, mejoraremos el rendimiento
general del sistema, pero esto implicará la necesidad de compartir la memoria
principal entre varios procesos de forma simultánea. Por lo tanto, una buena
administración de la memoria, repercutirá de forma inmediata en el
comportamiento de todo el sistema informático.

El gestor de memoria deberá asignar la porción necesaria de memoria


principal a cada proceso que lo necesite.

Como ya dijimos, para ejecutar una instrucción, habría que leerla desde la
memoria a un registro del procesador y decodificarla (averiguar qué significa). A
continuación, es posible que el sistema deba volver a la memoria para obtener

24
los datos implicados en la operación. Finalmente, es común que los resultados
obtenidos también haya que guardarlos en la memoria. Por todo ello, si la gestión
de la memoria no es adecuada, el rendimiento general del sistema se verá
inmediatamente disminuido.

Sin embargo, para tratar de comprender la complejidad de la gestión de


memoria, estudiaremos distintos mecanismos, de más sencillo a más complejo,
pudiendo entender la explicación como una evolución.

Gestión de memoria para un solo proceso

En los primeros ordenadores, la memoria principal se dividía en dos


partes: una para la parte del sistema operativo que debía estar siempre en
memoria (que recibía el nombre de monitor) y otra para un único proceso de
usuario. Un ejemplo de este esquema lo representan las primeras versiones del
sistema operativo MS-DOS, aunque, en su caso, la parte superior del espacio de
direcciones lo ocupaba el software de la BIOS.

Los esquemas que se usan en informática son:


▪ Memoria Real
• Asignación contigua
o Particiones fijas
o Particiones variables
• Asignación no contigua
o Paginación simple
o Segmentación simple
o Segmentación + paginación
▪ Memoria virtual
• Paginación por demanda
• Segmentación por demanda
• Segmentación + paginación

25
Gestión de memoria con particiones fijas

El administrador (o incluso un operador) divide la memoria en fragmentos


antes del inicio de la ejecución de los programas. Cuando llega un nuevo
proceso, el planificador lo ubica en la partición con el tamaño más adecuado y,
cuando un proceso acaba, su partición queda libre para un nuevo uso.
Este método recibe también el nombre de Multiprogramación con un
número fijo de tareas, o MFT (del inglés, Multitasking with a Fixed number of
Tasks).
Era frecuente organizar la carga de trabajo según las particiones de
memoria, creando una lista para cada una de ellas en función de su tamaño.

Otra opción es disponer de una cola única y elegir las tareas que se
adapten a las particiones que quedan libres, aunque esto discrimina a las tareas
con menos requisitos, porque tienden a desperdiciar espacio.

26
En este tipo de esquema surge el concepto de intercambio (en
inglés, swapping), que consiste, básicamente en mover a memoria secundaria
(normalmente disco), los procesos que se encuentran bloqueados en espera de
un suceso. De esta forma, se puede dar cabida a nuevos procesos.

El módulo del sistema operativo que se encarga del intercambio se llama,


precisamente, intercambiador y se encarga de elegir los procesos que deben
moverse de memoria principal a secundaria y a la inversa. También administra
el espacio reservado en la memoria secundaria para estos fines.

La dificultad en este esquema de memoria es obtener el equilibrio entre el


tamaño de las particiones y el de los procesos que deben ubicarse en ellas. En
este sentido, podemos encontrarnos con dos formas diferentes de
desaprovechamiento:

• Fragmentación interna: Ocurre cuando existen particiones grandes y la


mayoría de los procesos no las ocuparán enteras. Es decir, el derroche
de memoria se produce dentro de la asignación al proceso.

• Fragmentación externa: Ocurre cuando hay particiones excesivamente


pequeñas y es difícil encontrar procesos que quepan dentro. Es decir, el
derroche se produce entre la memoria que no está asignada a ningún
proceso.

27
Gestión de memoria con particiones variables

Se basa en la idea de que las particiones de memoria vayan cambiando


de tamaño a lo largo del tiempo. El sistema dispondrá de una tabla donde se
representen las zonas de memoria que se encuentran ocupadas.

Cuando llega un proceso, se busca un bloque de memoria


suficientemente grande para contenerlo y se le asigna sólo la porción necesaria.
El resto del bloque queda libre para otra asignación. Cuando un proceso termina,
la memoria que ocupaba queda disponible y, si se encuentra junto a otro bloque
libre, se une a él.

28
En cualquier caso, el problema de esta idea es que, si hay múltiples
asignaciones y liberaciones de memoria, ésta tenderá a tener una
gran fragmentación externa.
Sin embargo, el problema se resuelve aplicando, cuando sea necesario,
un procedimiento de compactación de memoria, que consiste en desplazar los
bloques asignados hacia un extremo y uniendo a su vez todos los bloques libres
en uno más grande. Lógicamente, el tiempo que debe emplearse para realizar
esta tarea es su gran inconveniente.

En cuanto a la asignación, debe estar destinada a retrasar el momento en


que sea necesaria la compactación de memoria. Existen diferentes opciones a
la hora de elegir el bloque más adecuado para un proceso:

• El primer ajuste: Se asigna el proceso al primer bloque libre en el que


quepa. Con el tiempo, los espacios disponibles del principio de la memoria
tenderán a ser pequeños y difíciles de utilizar.

Es bastante rápido, aunque necesita recorrer los primeros bloques hasta


encontrar un hueco disponible.

• El siguiente ajuste: Busca un hueco a partir de la última asignación. Es


frecuente que se reserve espacio en el bloque que queda disponible al
final de la memoria, que se divide en pequeñas porciones.

Lo normal es que requiera frecuentes compactaciones de memoria para


obtener un bloque grande al final de la memoria.

• El mejor ajuste: Se asigna el bloque más pequeño cuya capacidad sea


suficiente para contener al proceso. El resultado es peor que el anterior,
porque los fragmentos resultantes son más pequeños y, por lo tanto,
difíciles de utilizar.

Lo normal es que requiera frecuentes compactaciones de memoria.

• El peor ajuste: Se asignan primero los fragmentos de memoria más


grandes, esperando que los restos obtenidos puedan ser más sencillos
de utilizar. Suele requerir compactaciones de memoria más tardías,
aunque necesita recorrer todos los bloques libres antes de elegir cada
destino.

Usando las particiones variables, se pueden seguir aplicando técnicas


de intercambio, para mover a memoria secundaria, los procesos que se
encuentran bloqueados en espera de un suceso.

29
Según lo que acabamos de decir, cada vez que un proceso (o una parte
de este), se descargue a memoria secundaria (o cada vez que se compacte la
memoria), al volver a ejecutarse, podrán haber cambiado las direcciones
físicas donde se encontraba. Este mecanismo recibe el nombre de Reubicación.

Para lograr que la Reubicación funcione, el proceso de traducción


de direcciones virtuales a direcciones físicas necesitará de la participación de
dos registros en el procesador:

• Registro base: Que contiene la dirección en memoria principal del


proceso.

• Registro límite: Que contiene la última posición a la que puede hacer


referencia el proceso.

Si cuando sumamos la dirección relativa al registro base obtenemos un resultado


inferior a dicho registro base o superior al registro límite, el procesador genera
una interrupción que deberá ser procesada por el sistema operativo.

Ejemplo:

Sea un sistema gestionado con un mecanismo de particiones variables en


el que la memoria física tiene 4200 palabras. En un instante la memoria está
ocupada por 3 bloques de código/datos de la forma:

30
La estrategia utilizada cuando se carga un nuevo bloque en memoria es
la del mejor ajuste en primer lugar. Si falla, se crea un hueco mayor desplazando
los bloques en memoria hacia la dirección 0. Esta acción siempre empieza con
el bloque actualmente en la dirección de memoria más baja, y prosigue
únicamente hasta encontrar un hueco suficiente para el nuevo bloque. A partir
de ese momento, hay que cargar tres bloques de 500, 1200 y 200 (en ese orden).
Describir el contenido de la memoria una vez satisfechas las peticiones.

La situación inicial de la memoria seria la siguiente:

A partir de este momento cargamos los nuevos bloques, comenzando por el


bloque 4 de 500 palabras utilizando el mejor ajuste

El siguiente bloque que se ha de ubicar en memoria es el bloque 5 con 1200


palabras. Hay espacio suficiente en memoria, pero aparece el problema de la
fragmentación externa por tanto se hace necesario utilizar un algoritmo de
compactación.

31
Después de la compactación han quedado libres 1400 palabras contiguas en un
único hueco, la suma de los tamaños de los bloques 5 y 6 son de 1400 por tanto
no habrá problema para la ubicación.

Paginación

En la Gestión de memoria con particiones variables, hemos visto que la


memoria disponible tiende a no estar en posiciones contiguas, por lo que se
produce una considerable fragmentación externa (la memoria disponible se
dispersa a lo largo del espacio de direcciones.

Para resolver esta circunstancia, se planteó la posibilidad de que el


espacio de memoria que usa un determinado proceso no tuviese que estar en
posiciones contiguas. Así, en un esquema de paginación, la memoria se divide
en trozos del mismo tamaño que reciben el nombre de marcos de página (o, en
inglés, frames). Del mismo modo, los procesos se dividen en fragmentos del
mismo tamaño denominados páginas.

De este modo, cuando llegue un nuevo proceso, el único problema será


encontrar la cantidad suficiente de marcos de página disponibles en la memoria
principal. Gracias a este planteamiento, se acaba con la fragmentación externa,
y la fragmentación interna quedará reducida al último marco de página asignado
a cada proceso.

32
Cabe esperar que, por término medio, la mitad del último marco de
página quede desocupado.
Como podrás suponer, este esquema necesita un método que traduzca
las direcciones virtuales a direcciones físicas, teniendo en cuenta la ubicación
real de cada marco de página. Este método se basa en la creación de una tabla
de páginas, para cada proceso, en el momento de cargarlo en memoria. En ella
se establecerá el paralelismo entre cada página y su marco de
página correspondiente.

33
Por lo tanto, las direcciones virtuales constarán de un número de página y un
desplazamiento dentro de ella. El número de página actuará como índice en
la tabla de páginas.
Además, es frecuente que el sistema operativo mantenga una lista de marcos de
página disponibles.

34
Dado que este método implica constantes traducciones de direcciones
virtuales a direcciones físicas, para evitar que el sistema sufra una importante
penalización de rendimiento, habrá que recurrir a un hardware específico para la
traducción.
Por otra parte, el sistema operativo dispondrá de un mapa de la memoria,
con una entrada por cada marco de página, donde se indique cuáles están libres
y cuáles ocupados.

Un aspecto a tener en cuenta será el tamaño de los marcos de página:

• Con marcos de página pequeños, tendremos poca fragmentación


interna y tablas de páginas grandes.

• Con marcos de página grandes, tendremos más fragmentación


interna y tablas de páginas pequeñas.

Usando la paginación, se pueden seguir aplicando técnicas de intercambio, para


mover a memoria secundaria, los procesos que se encuentran bloqueados en
espera de un suceso.

https://www.youtube.com/watch?v=VaYk1m12OOM&ab_channel=ElprofeGarc
%C3%ADa

Otro esquema de paginación seria:

35
Segmentación

Hasta ahora, hemos visto el problema de la gestión de memoria desde el


punto de vista del sistema operativo, donde la asignación de memoria se realiza
en función del tamaño total de un proceso o dividiendo éste en porciones de la
misma longitud. Sin embargo, los programadores y los usuarios necesitan
manejar sus datos de un modo más flexible: Tanto las funciones y
procedimientos en las que se dividen los programas, como las estructuras en las
que se organizan los datos (como tablas o pilas), tienen tamaños diversos.

Por lo tanto, podemos decir que un programa es un conjunto de elementos


lógicos de tamaños variables. Es como si el zumo del ejemplo anterior fuese en
realidad una mezcla (por ejemplo, naranja, kiwi y fresa) y nos interesara
mantenerlos separados. Entonces, podríamos utilizar varios envases más
pequeños. Todos juntos representarían al mismo proceso:

Para dar cobertura a este planteamiento, la segmentación plantea que en


el momento de compilar un programa, éste se convierta en un conjunto
de segmentos a los que se asignará un identificador, un punto de inicio y un
tamaño. Las direcciones se expresarán mediante un número de segmento y un
desplazamiento dentro de él, y el tamaño asegura que no se realizan referencias
a direcciones ilegales dentro del segmento.

Además, como cada componente lógico del proceso se encuentra en


un segmento diferente, podemos mejorar la protección haciendo que los
segmentos que contienen código sean de solo lectura. También podemos
asegurar que un fragmento de código no acceda al código de un fragmento
diferente.

Por otra parte, al encontrarse cada bloque lógico del programa en un segmento
distinto, podría compartirse código entre diferentes programas de un modo
sencillo.

De forma parecida a como ocurría en la paginación, la conversión de una


dirección virtual a su correspondiente dirección física se realiza utilizando
una tabla de segmentos:

36
Ejemplo:
SEGMENTOS BASE LIMITE
0 219 600
1 2300 14
2 90 100
3 1327 580
4 1952 96

PROCESO S D
A 0 430
B 1 10
C 2 500
D 3 400
E 4 112

A
• Segmento 0
• Base 219
• Limite 600
• Desplazamiento 430

Desplazamiento<limite 430<600
B
• Segmento 1
• Base 2300
• Limite 14
• Desplazamiento 10

Desplazamiento<limite 10<14

37
C

38

You might also like