Segmentación
En los sistemas de “segmentación” un programa y sus datos pueden ocupar varios bloques separados de almacenamiento real
Los bloques:
- No necesitan ser de igual tamaño.
- Los bloques separados no necesitan ser adyacentes.
- Deben estar compuestos de posiciones contiguas de almacenamiento.
Se complica la protección de bloques de memoria de un proceso de usuario.
Es más difícil limitar el rango de acceso de cualquier programa .
Un esquema posible de protección es el uso de claves de protección del almacenamiento
- Las claves están bajo el control estricto del S. O.
- Un programa de usuario, a quien corresponde una cierta clave en la cpu, solo puede hacer referencia a los otros bloques del almacenamiento con igual clave de protección.
Una dirección virtual es un par ordenado v=(s,d)
- “s” es el número del segmento del almacenamiento virtual en el cual residen los elementos referidos.
- “d” es el desplazamiento en el segmento “s” en el cual se encuentra el elemento referido.
Un proceso solo puede ejecutarse si su segmento actual (como mínimo) está en el almacenamiento primario.
Los segmentos se transfieren del almacenamiento secundario al primario como unidades completas.
Un nuevo
segmento puede ser colocado en una serie disponible de posiciones
contiguas del almacenamiento primario de tamaño suficiente para alojar
al segmento.
La traducción dinámica de direcciones utiliza una “tabla de mapa de segmentos”.
Control de Acceso en Sistemas de Segmentación
Se le otorga a
cada proceso ciertos derechos de acceso a todos los segmentos y se le
niega completamente el acceso a muchos otros.
Si un proceso tiene “acceso de lectura” a un segmento, puede obtener cualquier elemento de información contenido en ese segmento.
Si un proceso tiene “acceso de escritura” a
un segmento, puede modificar cualquier contenido del segmento y puede
introducirle información adicional, incluso destruir toda la información
del segmento.
Un proceso con “acceso de ejecución” de un segmento puede ejecutarlo como si fuera un programa.
Un proceso con “acceso de adición” puede escribir información adicional al final del segmento, pero no puede modificar la información existente.
En base a los “tipos de control de acceso” indicados pueden crearse distintos “modos de control de acceso”.
Ejemplos de combinación de los accesos de lectura, escritura y ejecución para producir modos de protección útiles se dan en la Tabla 3.1 y en la Tabla 3.2 [7, Deitel].
Modo
|
Lectura
|
Escritura
|
Ejecución
|
Explicación
|
0
|
N
|
N
|
N
|
No hay permiso de acceso
|
1
|
N
|
N
|
S
|
Solo ejecución
|
2
|
S
|
N
|
N
|
Solo lectura
|
3
|
S
|
N
|
S
|
Lectura / ejecución
|
4
|
S
|
S
|
N
|
Lectura / escritura pero no ejecución
|
5
|
S
|
S
|
S
|
Acceso no limitado
|
Tabla 3.1: Ejemplo de combinación de accesos.
| ||||
Modo
|
Aplicación
|
0
|
Seguridad
|
1
|
Un programa disponible a los usuarios, que no pueden copiarlo ni modificarlo, pero sí ejecutarlo
|
2
|
Recuperación de información
|
3
|
Un programa puede ser copiado o ejecutado, pero no puede ser modificado
|
4
|
Protege los datos contra un intento erróneo de ejecutarlos
|
5
|
Este acceso se concede a los usuarios de confianza
|
Tabla 3.2: Ejemplo de aplicaciones de la combinación de accesos.
| |
Traducción de Direcciones de Segmentación por Transformación Directa
- Por transformación directa, asociativa o combinación de asociativa / directa.
- Con caché suficiente para alojar la tabla completa de mapa de segmentos o caché parciales que contengan solo las entradas de los segmentos de referencia más reciente
Se considerará la traducción de direcciones de segmentación con la tabla completa de mapa de segmentos en la caché.
Un proceso en ejecución hace referencia a la dirección virtual v = (s,d):
- El segmento número “s” se añade a la dirección base “b” en el registro origen de la tabla de mapa de segmentos formando la dirección de memoria real “b + s”, de la entrada para el segmento “s” de latabla de mapa de segmentos, que contiene la dirección del almacenamiento primario “s ’ ”, donde comienza el segmento.
- El desplazamiento “d” se añade a “s ’ ” formando la dirección real “r = d + s ’ ”, correspondiente a la dirección virtual “v = (s,d)”.
Un “bit de residencia”, “r”, indica si en la actualidad el segmento se encuentra o no en el almacenamiento primario.
Si el segmento se encuentra en el almacenamiento primario “s ’ ” es la dirección en este almacenamiento donde comienza el segmento.
Si el segmento no se encuentra en el almacenamiento primario “a” es la dirección en el almacenamiento secundario de donde debe recuperarse antes que el proceso pueda continuar.
Se compara cada referencia a un segmento con los bits de protección para determinar si se permite la operación que se está intentando.
Si el segmento buscado no está en el almacenamiento primario se genera un “fallo de pérdida de segmento”:
- El S. O. obtiene el control y carga el segmento referido desde la dirección “a” del almacenamiento secundario.
- Se comprueba si el desplazamiento “d” es menor o igual a la longitud del segmento “l ”:
- Si no es así se genera un “fallo de desbordamiento de segmento” y el S. O. obtiene el control y termina la ejecución del proceso.
- Si el desplazamiento está en el rango del segmento se comprueban los bits de protecciónpara asegurarse si se permite la operación que se está intentando:
- Si es así entonces la dirección base del segmento, “s ’ ”, en el almacenamiento primario se añade al desplazamiento “d” formando la dirección de memoria real“r = s ’ + d”, que corresponde a la dirección del almacenamiento virtual “v = (s,d)”.
- Si la operación intentada no se permite se genera un “fallo de protección de segmento” y el S. O. obtiene el control y termina la ejecución del proceso.
Compartimiento en un Sistema de Segmentación
Una de las ventajas de la segmentación sobre la paginación es que se trata más de un hecho lógico que físico:
- En un sistema de segmentación, una vez que un segmento ha sido declarado como compartido, entonces las estructuras que lo integran pueden cambiar de tamaño.
- Lo anterior no cambia el hecho lógico de que residen en un segmento compartido.
Dos procesos pueden compartir un segmento con solo tener entradas en sus tablas generales que apunten al mismo segmento del almacenamiento primario .
Segmentación pura
La segmentación se aprovecha del hecho de que los programas se dividen
en partes lógicas, como son las partes de datos, de código y de pila
(stack). La segmentación asigna particiones de memoria a cada segmento
de un programa y busca como objetivos el hacer fácil el compartir
segmentos ( por ejemplo librerías compartidas ) y el intercambio entre
memoria y los medios de almacenamiento secundario.
Por ejemplo, en la versión de UNIX SunOS 3.5, no existían librerías
compartidas para algunas herramientas, por ejemplo, para los editores de
texto orientados al ratón y menús. Cada vez que un usuario invocaba a
un editor, se tenía que reservar 1 megabyte de memoria. Como los
editores son una herramienta muy solicitada y frecuentemente usada, se
dividió en segmentos para le versión 4.x ( que a su vez se dividen en
páginas ), pero lo importante es que la mayor parte del editor es común
para todos los usuarios, de manera que la primera vez que cualquier
usuario lo invocaba, se reservaba un megabyte de memoria como antes,
pero para el segundo, tercero y resto de usuarios, cada editor extra
sólo consumía 20 kilobytes de memoria. El ahorro es impresionante.
Obsérvese que en la segmentación pura las particiones de memoria son de
tamaño variable, en contraste con páginas de tamaño fijo en la
paginación pura. También se puede decir que la segmentación pura tiene
una granularidad menor que la paginación por el tamanó de segmentos
versus tamaño de páginas. Nuevamente, para comprender mejor la
segmentación, se debe dar un repaso a la forma en que las direcciones
virtuales son traducidas a direcciones reales, y para ellos se usa la
figura 4.4. Prácticamente la traducción es igual que la llevada a cabo
en la paginación pura, tomando en consideracióñ que el tamaño de los
bloques a controlar por la tabla de traducción son variables, por lo
cual, cada entrada en dicha tabla debe contener la longitud de cada
segmento a controlar. Otra vez se cuenta con un registro base que
contiene la dirección del comienzo de la tabla de segmentos. La
dirección virtual se compone de un número de segmento (s) y un
desplazamiento ( d ) para ubicar un byte (o palabra ) dentro de dicho
segmento. Es importante que el desplazamiento no sea mayor que el tamaño
del segmento, lo cual se controla simplemente checando que ese valor
sea mayor que la dirección del inicio del segmento y menor que el inicio
sumado al tamaño.
Una ves dada una dirección virtual v=( s,d ), se realiza la operación b +
s para hallar el registro (o entrada de la tabla de segmentos ) que
contiene la dirección de inicio del segmento en la memoria real,
denotado por s'. Ya conociendo la dirección de inicio en memoria real s'
sólo resta encontrar el byte o palabra deseada, lo cual se hace
sumándole a s' el valor del desplazamiento, de modo que la dirección
real ® r = s'+ d.
Cada entrada en la tabla de segmentos tiene un formato similar al
mostrado en la figura 4.5. Se tienen campos que indican la longitud, los
permisos, la presencia o ausencia y dirección de inicio en memoria real
del segmento.
Según amplios experimentos [Deitel93] sugieren que un tamaño de páginas
de 1024 bytes generalmente ofrece un desempeño muy aceptable.
Intuitivamente parecería que el tener páginas del mayor tamaño posible
haría que el desempeño fuera óptimo pero no es así, a menos que la
página fuera del tamaño del proceso total. No es así con tamaños grandes
de página menores que el proceso, ya que cuando se trae a memoria
principal una página por motivo de un solo byte o palabra, se están
trayendo muchísimos más bytes de los deseados. La dependencia entre el
número de fallas respecto al tamaño de las páginas se muestra en la
figura 4.6.
Un hecho notable en los sistemas que manejan paginación es que cuando el
proceso comienza a ejecutarse ocurren un gran número de fallos de
página, porque es cuando está referenciando muchas direcciones nuevas
por vez primera, después el sistema se estabiliza, conforme el número de
marcos asignados se acerca al tamaño del conjunto de trabajo.
El la figura 4.7 se muestra la relación entre el tiempo promedio entre
fallas de página y el número de marcos de página asignados a un proceso.
Allí se ve que el tiempo entre fallas decrece conforme se le asignan
más páginas al proceso. La gráfica se curva en un punto, el cual
corresponde a que el proceso tiene un número de páginas asignado igual
al que necesita para almacenar su conjunto de trabajo. Después de eso,
el asignarle a un proceso más páginas que las de su conjunto de trabajo
ya no conviene, ya que el tiempo promedio entre fallas permanece sin
mucha mejora. Un aspecto curioso de aumentar el número de páginas a un
proceso cuando el algoritmo de selección de páginas candidatas a irse a
disco es la primera en entrar primera en salir es la llamada `anomalía
FIFO' a `anomalía de Belady'. Belady encontró ejemplos en los que un
sistema con un número de páginas igual a tres tenía menos fallas de
páginas que un sistema con cuatro páginas. El ejemplo descrito en
[Tanxx] es injusto. Si se mira con cuidado, obviamente si se compara un
sistema con 10 páginas contra otro de 5, ya de inicio el primer sistema
tendrá 5 fallos de página más que el de 5, porque se necesitan diez
fallos para cargarlo. A esto debería llamársele `anomalía de Belady con
corrección.
No hay comentarios:
Publicar un comentario