UNIDAD II. METODOS PARA COMPARTIR RECURSOS
2.1
Introducción.
Se entiende como recurso
un elemento que un programa o
proceso puede utilizar en la computadora donde se está ejecutando. Por ejemplo un dispositivo
hardware (una impresora ) como una cierta cantidad de información (Por ejemplo
un registro de un archivo ). En una
computadora pueden existir muchos tipos de recursos, e incluso varios del mismo
tipo.
Un recurso se define como algo que puede ser
utilizado por un solo proceso en un
instante dado.
Recursos.
Un sistema se compone de un número finito de recursos que se distribuyen entre varios procesos que compiten entre ellos.
Los recursos se dividen en varios tipos, de cada uno de los cuales pueden
existir ejemplares idénticos:
·
físicos: ciclos de CPU,
espacio de memoria, dispositivos de E/S (impresoras,
unidades de cinta, etc.).
·
lógicos: ficheros tablas del sistema semáforos.
2.1
Justificación.
Compartir un recurso de software significa que dos o más procesos
puedan utilizar una misma rutina que está en memoria (habiendo una sola
instancia de la rutina). La rutina es el recurso que se comparte en los
procesos (Justificación). La compartición de recursos de software hace
que un sistema operativo sea más flexible y eficiente ya que aumenta la
capacidad de atención de procesos.
2.2 REQUISITOS
Requisitos.
Para la compartición de recursos de software se requiere
principalmente que el sistema operativo permita la repetición de apuntadores en
las tablas de segmento o de página (dependiendo del método empleado).
Además,
si la compartición será dinámica, se requiere que el sistema operativo soporte
carga/descarga y ligado dinámico, para lo cual se requiere implementar tablas
auxiliares como
Para que un proceso pueda utilizar un
recurso, deberá realizar la siguiente secuencia de operaciones:
* Solicitar el recurso.
Si no estuviera disponible el proceso, quedará
bloqueado hasta que
le pueda ser asignado.
*
Utilizar el recurso. Hacer uso de
determinado recurso en el sistema.
* Liberar el recurso.
Dejar de utilizar el recurso.
La solicitud y liberación de recursos
son llamadas al sistema. Algunos ejemplos son las parejas de llamadas
Abrir/Cerrar archivos y Asignar/Liberar memoria. De igual forma, la utilización
de recursos sólo puede conseguirse mediante llamadas al sistema, de modo que
para cada utilización el sistema operativo comprueba que el proceso que usa el
recurso lo había solicitado previamente y ya lo tiene asignado.
Una tabla del sistema registra si cada
uno de los recursos está libre o asignado y, de estar asignado, a qué proceso
solicita un recurso que ya se encuentra asignado a otro, puede añadirse a la
cola de procesos que esperan tal recurso.
2.4 PROCEDIMIENTOS
REENTRANTES
Para que sean compartidos
eficientemente en un sistema de multiprogramación, los procesos deben ser
concurrentemente reutilizables (también llamados procesos puros). Un proceso
puro opera solamente sobre variables que están en registros del CPU o sobre
datos que están en otros segmentos asociados con la tarea; nunca se modifican a
sí mismos. Ejemplo: Los Archivos Ejecutables (EXE). Ejemplo de Archivos No
Reentrantes: Archivos de Comando (COM).
El
mecanismo o función que permite transformar el espacio de nombres al espacio de
memoria principal se le denomina memoria
virtual. Los mecanismos pueden ser: Utilización de registro base, Paginación,
Segmentación, Segmentación-Paginación.
La memoria virtual es implementada comúnmente por
Paginación por Demanda.
Paginación
por demanda = paginación con swapping
Por demanda = hasta que se hace
referencia a una de ellas.
Las
páginas que no se encuentran en memoria se marcan en la tabla de páginas como
invalidas.
Si
se quiere utilizar una pagina que no este en memoria principal se produce un
error por fallo de página, el cual es atrapado por el sistema operativo,
Observe la figura # 1.

S.O.

![]()
![]()
Trap.
M.V.
Fallo de página
![]()
![]()

CPU
![]()
![]()
![]()
![]()
Y
Mem. Secundaria
![]()
![]()
Tabla de
página
¿Problema? Si no libera el sistema
¿Cuál
algoritmo utilizar?
manda un algoritmo
para hacer el reemplazo.
Figura # 1. Trap del sistema operativo.
Al
sistema operativo se le presenta un problema ¿Cual algoritmo utilizar?. Para la
sustitución de página
El
rendimiento de un sistema de paginación por demanda depende del número de
fallas de página que existan:
En
resumen tenemos que:
-
Atender la interrupción de falla de página.
-
Hacer swap.
-
Restablecer el proceso.
-
Toma 4 milisegundos más el tiempo de espera a disco.
Un
reemplazo de página ocurre cuando no hay frames libres, es necesario escoger
una víctima y llevarla a disco, actualizando las tablas correspondientes.
Lo
que origina el encontrar un algoritmo que minimice el número de fallas de
página.
Para
esto existen varios algoritmos de sustitución de páginas.
Cuando
la página que se necesita no se encuentra en la memoria (fallo de página), se
usan los algoritmos de sustitución para determinar cuál de las páginas (en la
memoria) se debe bajar.
Los
algoritmos son los siguientes:
.
Obtener para cada página, del conjunto en memoria, el número de instrucciones
que se ejecutaran antes de que dicha página sea referida por vez primera.
.
Cambiar la página con el número mayor (eliminarse) de instrucciones.
Desventaja:
. El algoritmo es irrealizable, no
existe forma de saber cuándo se hará referencia a las páginas.
Observe
![]()
![]()
![]()
![]()
![]()
![]()
Residencia Dirección
Marco
(0,1) No esta / esta en la memoria principal.
![]()
![]()
Dirección en la memoria secundaria.
Marco de página.
Mapa de memoria Programa
![]()

![]()
![]()
0 1000 0

![]()
1 1100
1
![]()
0 1200
0 Marco de pagina

![]()
1 1300 4

![]()
![]()
1 1400
5 Marco
1
1 1500
2 Marco
2
![]()
![]()
![]()
![]()
0 1600 0 Marco
3
![]()
![]()
![]()
1 1700
3 Marco
4
![]()
1 1800
0 Marco
5
![]()
1 1900 6 Marco
6

Dirección de inicio en
Disco
1000
Tamaño
de pagina 100
Figura #
2. Mapa de control de páginas.
Sustitución
de página no usada recientemente.
Para
este algoritmo se deben agrupar dos bits de control en la estructura del mapa
de memoria.
R
= referido
![]()
![]()
![]()
![]()
R M
M
= modificado
El bit R
indica que se ha realizado una lectura o una escritura en la página.
El
bit M indica que s ha realizado una escritura en la página. El manejo de los
bits es el siguiente:
* De
inicio ambos bits son cero para todas las páginas
* A través del hardware se ponen a 1 los bits R y
M de acuerdo a las operaciones que se
hagan en una página. Una vez que un bit haya fijado a 1, éste seguirá siendo
1 hasta que el sistema lo ponga a 0 por software.
* En forma periódica se elimina el bit R con el fin de distinguir las
páginas que no se han usado recientemente
* El bit M se pone a 0 cuando se guarda la
página.
Cuando
ocurre una falla de página se deben agrupar las páginas en las siguientes
cuatro categorías:
0 No referido, No modificado 00
1 No referido, modificado 01
2 referido, No modificado 10
y se elimina una página, elegida al azar, de la
clase no vacía con número de categorías inferior.
Nota. Es mejor
cambiar una página que se modificó pero que no se usa mas al borrar una que no
se modifica pero se usa frecuentemente.
Sustitución de páginas
donde la primera que entre es la primera que sale (FIFO).
-
Es el algoritmo más simple, pero tiene la desventaja de que puede retirarse una
página que se usa frecuentemente. Esto puede implicar que se baje una página
que deberá ser cargada en una de las próximas solicitudes, en el peor de los casos la siguiente.
Una modificación a este algoritmo
implica leer los bits R y M y eliminar la página más antigua de la clase no
vacía con número de categoría inferior (0,1,2,3).
Otra opción es el algoritmo que se conoce
como segunda
oportunidad, el cual plantea lo siguiente:
Obtener la página más antigua
Si su bit R es 0
Sustituir dicha página
De lo contrario (R == 1)
Cambiar R a 0
Colocarla al final de la lista (FIFO)
Iniciar el proceso
Nota. Se busca la
página que no se ha usado en el ciclo anterior del reloj. Si todas las páginas
han sido referidas al algoritmo se degenera en un FIFO puro.
Sustitución de página
usada menos recientemente (LRU)
Este algoritmo se aproxima al óptimo. Se parte de
la idea de que las páginas que se han utilizado con frecuencia en las últimas
instrucciones probablemente se usarán de
la misma forma en las siguientes y, a la
inversa, las páginas que no se han utilizado recientemente muy probablemente no
se usarán en las siguientes instrucciones.
Cuando
ocurra una falla de página se desecha la página que ha estado sin uso el
periodo de tiempo más largo. Esto le da una eficiencia en el manejo de las
páginas, ya que asegura que una página que sé esta usando con frecuencia
permanecerá en el almacenamiento principal.
No es barata, se requiere un algoritmo
de decisión, implica un mecanismo de actualización del uso de la página, un mecanismo para probar la
antigüedad de uso de una página.
Una
propuesta consiste en tener una lista
ordenada de las páginas en memoria, Observe la
figura # 3.

Más reciente Menos reciente.
Figura #
3. Lista ordenada de páginas.
En este esquema la sustitución implica
localizar la página, sacarla de la lista y llevarla al inicio de la lista. Esto
es caro aún en hardware.
Opción de la matriz de
bit’s.
Se coloca en una, matriz cuadrada las páginas
del proceso. Al accesar una página se pone a
uno su renglón y posteriormente a cero su columna. La página cuyo
renglón representa el número binario menor es la página usada menos
recientemente, Observe la figura #4., donde
muestra una matriz de bits.



0 1
2 3 0 1
2 3 0 1
2 3
0 1 2
3
0
0 1 1
1 0 0
1 0 1 0 0
1 0 0 0 0
0 0 0
1
0 0
0 0 1 0
0 0 0 1 0
0 0 0 1 1
0 1 1
2
0 0 0
0 2 1
1 0 1 2 1
1 0 0 2 1
0 0 0
![]()
![]()
3
0 0 0
0 3 0
0 0 0 3 1
1 1 0 3 1
0 1 0
![]()
P.0 P.2 P.3 P.4
Paginas
usadas menos
Recientemente.
Figura # 4. Matriz de bits para seleccionar la página usada menos recientemente.
Simulación
de la página usada menos recientemente en software.
Otra
opción es agregar un contador en la estructura del mapa de páginas. El contador
se incrementa cada vez que una instrucción accesa una página, cuando ocurre una
falla de página se busca la página cuyo contador es menor.
Este
esquema tiene la desventaja de que "No olvida", esto es un
problema en el caso de un proceso que al inicio usa mucho algunas páginas y
después no las usa más (compiladores). Cuando se necesita bajar una página que
tiene poco tiempo en memoria ya que su número de acceso siempre será pequeño.
En estos casos la distribución del almacenamiento real se divide en dos
espacios: uno grande que no se usa (sólo en el inicio) y uno pequeño sometido a
un intenso intercambio.
Una
variante de este algoritmo implica considerar el envejecimiento de las páginas
que están en la memoria, de tal manera que una página que sólo se usa de inicio
puede ser eliminada por no usarse más.
El algoritmo es el siguiente, para cada ciclo de
reloj,
. Correr
los contadores un bit a la derecha antes de sumar el bit R.
. El bit R se suma al bit de la posición más a la
izquierda, en vez del bit más a la
derecha.
. Cuando ocurre una falla de página, la página
cuyo contador es el menor se elimina.
Es claro que una página
que no se ha usado para N ciclos de reloj, tendrá N ceros a la izquierda en su
contador y por lo tanto tendrá un valor menor que la página que no se ha
referido en N-1 pulsos de reloj. Por ejemplo:
0000 1010 N
0001 1010 N-1
Control
de acceso a los sistemas de segmentación.
No
es recomendable el acceso ilimitado de cada proceso a todos los segmentos del
sistema. De hecho, uno de los atractivos de los sistemas de segmentación es el cuidadoso control de
acceso posible. Esto se consigue al darle a cada proceso ciertos derechos de
acceso a unos segmentos y negarle por completo el acceso a muchos otros.
El
sistema de control de acceso consiste en asociar a cada segmento un grupo de
bits que indique los derechos de acceso.
Lectura R
El segmento puede ser leído
Escritura W
El segmento puede ser modificado
Ejecución E
El segmento puede ser ejecutado
Adición A
El segmento puede ser aceptado
Agregar información
Al
incluir los bits de acceso en la estructura básica de la tabla del mapa de
segmentos se tiene, observe figura
# 5.
![]()
![]()
![]()
![]()
![]()
![]()
![]()

r a l R W E A s’
![]()
![]()
![]()
![]()
![]()
Bit de residencia
Dirección en memoria
secundaria
Longitud del segmento
Bits de acceso
Dirección en memoria
primaria
Figura #
5. Tabla de mapa de segmento.
2.5 RECURSOS COMPARTIDOS
Recursos
compartidos asignados estáticamente.
Cuando los procesos compartidos se cargan
completamente en memoria desde el inicio de su ejecución, se dice que la
compartición es estática. Ejemplo: Rutinas del servicio de Interrupción del
BIOS o MS-DOS.
* Asignación Estática.
En este
caso la correspondencia entre las páginas del espacio virtual y los bloques de
memoria auxiliar se hace a la iniciación del sistema. Para poderlo hacer se
necesita conocer el número y el tamaño de los espacios virtuales.
Desventajas
.
Por esta razón es un método que no se puede aplicar a los sistemas con
segmentación pura, ni a los de espacios múltiples, a menos que se impongan
ciertas limitaciones.
.
No permite implantar un equilibrio dinámico de la carga entre las distintas
unidades de soporte. Se refiere al hecho de poder seleccionar el dispositivo en
el cual se va a escribir una página, con el fin de hacerlo en el que tenga un
tráfico menor.
Como
ejemplo de sistemas que utilizan esta técnica el IBM DOS / OS y el IBM OS/VS1.
En el primero de ellos,
la memoria auxiliar debe estar contenida en un solo dispositivo físico, además,
la dirección en disco de una página de espacio virtual puede deducirse
directamente de su número, sin necesidad de una tabla auxiliar, observe la
figura # 6.
Espacio
virtual
Memoria Auxiliar
SISTEMA
![]()
![]()
ZONA
![]()
V = R
![]()
ZONA
B - 6
![]()
P - 4
![]()
![]()
P - 3
![]()
P-
2
![]()
![]()
![]()
P -1
Figura # 6.
Manejo de la memoria auxiliar en el
sistema IBM DOS/VS.
En
el sistema operativo OS / VS1 el método usado es similar, pero se permite la
repartición de la memoria auxiliar en varios dispositivos (máximo 8). La
definición de éstos se hace a la iniciación del sistema, o en el momento de la
generación del mismo.
Asignación
cuando se hace la primera utilización de la página.
Se
asigna el espacio en la memoria auxiliar cuando se hace la primera referencia a
la página (y se produce por lo tanto un fallo de página).
Una
variables consiste en diferir la asignación hasta el momento en que se requiere
escribir la página en la memoria auxiliar.
2.6 RECURSOS COMPARTIDOS ASIGNADOS DINAMICAMENTE
Recursos Compartidos asignados dinámicamente.
La
compartición dinámica consiste en cargar en memoria solo la parte requerida de
los procesos compartidos. Al necesitarse código que no está en memoria, éste
será cargado durante la ejecución de las tareas. Ejemplo: Cuadros de Dialogo de
Windows.
* Asignación dinámica.
La
utilización eficiente de varios niveles de memoria auxiliar implica una
distribución dinámica de las páginas en los diversos niveles en función de las
frecuencias de utilización para ello hay dos posibilidades:
.
Asignar globalmente el espacio en la memoria auxiliar. En este caso hablamos de
migraciones.
.
Asignar el espacio de la memoria auxiliar por páginas, esto es, cada vez que se
escribe una página en la memoria auxiliar.
Compartición de Recursos de software en Windows
3.1.
MÓDULOS.
En Windows 3.1 el término
módulo describe una colección relacionada de código, datos y otros recursos
(por ejemplo, mapas de bits) presentes en memoria. Normalmente, tal colección
conformará o bien un único programa ejecutable o una biblioteca de ligado
dinámico (DLL). Windows 3.1 implementa una estructura de datos conocida como
Base de Datos del Modulo (MDB), que identifica todos los módulos que están
activos en el sistema.
Es importante tener un
registro de los módulos cargados en cada instante, ya que tal registro es la
base para la compartición de recursos que implementa Windows 3.1. Por ejemplo,
la segunda vez que se ejecuta digamos un editor, Windows 3.1 detecta que los
segmentos de código y el mapa de bits que forman el icono, ya están en uso. En
lugar de cargar una segunda copia y ocupar más memoria, Windows crea
referencias adicionales para los recursos que ya están en uso.
2.8.
Durante la vida del sistema, Windows mantiene una cuenta de
uso para cada recurso. Cuando las aplicaciones hacen uso de un recurso, el
sistema incrementa la cuenta de referencia. Cuando finaliza la aplicación, el
sistema decrementa la cuenta de referencia. Una cuenta de referencia con valor
0 indica que el recurso ya no está en uso y el sistema puede ocupar
Se implementa mediante el
uso de unas estructuras de datos llamadas objetos de núcleo. Una aplicación
Win32 crea, abre y maneja objetos de núcleo con regularidad. El sistema crea y
maneja varios tipos de objetos de núcleo como por ejemplo, objetos proceso,
objetos suceso, objetos semáforo, objetos hilo, etc.
Estos objetos se forman
llamando a varias funciones de Win32, ejemplo, la función CreateFileMapping()
provoca que el sistema cree un objeto proyectado en archivo.
Cada
objeto del núcleo es un bloque de memoria asignado por el Kernel y al que solo
puede acceder el Kernel. Este bloque de memoria es una estructura de datos
cuyos elementos contienen información sobre un objeto. La cantidad y el tipo de
estos elementos varían dependiendo del tipo de objeto del núcleo implementado.
Algunos estarán presentes
en todos los tipos, por ejemplo, nombre del objeto, descriptor de seguridad,
contador de utilización, etc., mientras que otros serán incluidos de acuerdo al
tipo de objeto. Por ejemplo, un objeto-proceso contendrá una identificación del
proceso, una prioridad de base y un código de salida, mientras que un objeto-archivo contendrá un
desplazamiento de bytes, un modo de compartición y un modo de apertura.
EL CONTADOR
DE UTILIZACIÓN.
Es el Kernel quien tiene
el control sobre los objetos de núcleo, no los procesos. Esto es, si un proceso
llama a una función que crea un objeto de núcleo y después el proceso termina,
no es forzoso que se destruya el objeto del núcleo, dado que si otro proceso
está utilizando el objeto de núcleo, el Kernel sabe que no debe destruir el
objeto del núcleo, sino hasta que ya no haya procesos utilizándolo.
El Kernel sabe cuantos
procesos están utilizando cierto objeto del núcleo, ya que cada objeto del
núcleo contiene un contador de utilización. El contador de utilización es uno
de los elementos comunes en todos los tipos de objetos de núcleo. El Kernel
incrementa o decrementa el contador de cada objeto según sea su utilización. Un
contador con valor 0 (cero) significa que no hay procesos utilizando ese objeto
de núcleo, por lo que el Kernel lo destruye.
memoria
liberada.