Diferencia entre revisiones de «Segmentación»

De Wiki de Sistemas Operativos
Saltar a: navegación, buscar
(Enlazado estático VS enlazado dinámico:: ampliación.)
(Añadidas formas de uso de descriptores, reordenado, adaptado al temario actual)
Línea 14: Línea 14:
  
 
*Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).
 
*Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).
 
*Aspectos materiales : Hay 2 registros que funcionan como dispositivos de traducción segmentada; uno de dirección de comienzo de la tabla de segmentos, y otro para el número de entradas en ella.
 
 
*Esto supone dos accesos a memoria física real. La tabla de segmentos ocupa memoria, siendo deseable que permanezcan en cache.
 
  
 
*Cuando un proceso requiere más memoria se crea un nuevo segmento.
 
*Cuando un proceso requiere más memoria se crea un nuevo segmento.
Línea 26: Línea 22:
  
 
*Gestión compleja, sobretodo por su tamaño variable
 
*Gestión compleja, sobretodo por su tamaño variable
 +
 +
*Permite la carga de segmentos a petición, de manera que no se disponga de todos los segmentos en memoria principal, que se puedan descargar a disco (en la zona de intercambio o swap) en base a un cierto criterio (ver [[Intro | Memoria virtual]]). Esta zona de intercambio puede ser:
 +
**Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar
 +
**Un fichero oculto de tamaño fijo o variable dependiendo de la configuración dada por el usuario (Windows).
  
 
=Mecanismos=
 
=Mecanismos=
Línea 38: Línea 38:
 
* Un fichero oculto de tamaño fijo o variable dependiendo de la configuracion dada por el usuario (Windows).
 
* Un fichero oculto de tamaño fijo o variable dependiendo de la configuracion dada por el usuario (Windows).
  
==Enlace dinámico==
+
==Formas de uso de los descriptores==
Uso de llamadas a funciones que están en disco.
+
En cuanto a aspectos materiales, se plantea el problema de que no es habitual que la tabla de segmentos quepa en el dispositivo de traducción (MMU), por lo que se almacena la tabla en memoria, y el MMU contiene su dirección. El problema es que esta técnica hace que el tiempo de acceso se duplique, al haber un primer acceso al MMU y un segundo acceso a la dirección efectiva. Se plantean dos soluciones no excluyentes:
 
+
* '''Uso de registros descriptores de segmento en MMU:'''
El uso de esta técnica nos aporta ventajas como reducir el trabajo del montador de enlaces (y por tanto el tiempo necesario para sus operaciones) además de que podemos tener referencias a funciones o bibliotecas que no estén en memoria principal (permite ir cargando bajo demanda los segmentos que contengan el código necesario).
+
<blockquote>
 
+
En MMU nos encontraremos varios registros que pueden contener descriptores, en los que se copiarán los que se vayan a usar en un futuro inmediato. Hay dos tipos de registros:
=== Enlazado estático VS enlazado dinámico: ===
+
*Registros de propósito general:
 
+
Registros sobre los que se cargan los próximos descriptores a usar, y dos tipos de direcciones:
 
+
<br>- Las que hacen referencia a un descriptor en la tabla de memoria (y necesitan más bits para hacer referencia al descriptor)
Los montadores de enlaces convencionales (estáticos) deben enlazar en tiempo de compilación todos los módulos, segmentos y referencias de un
+
<br>- Las que hacen referencia a un descriptor en MMU (y necesitan menos bits para referir al descriptor)
programa para completar sus instrucciones (si el número de instrucciones es muy elevado la cantidad de trabajo del montador será enorme)
+
*Registros especializados:
mientras que los montadores de enlaces dinámicos realizarán el enlazado durante la ejecución o durante la carga del programa.
+
Registros capaces de albergar a un descriptor concreto, como el DS (Para manejo de datos), SS (Para manipulación de pila) o el CS (Para instrucciones de salto y llamadas a rutinas). También existen dos tipos de direcciones:
 
+
<br>- Las que hacen referencia a un descriptor en la tabla de memoria
*'''Pros y contras:'''
+
<br>- Las que no hacen referencia a ningún descriptor, y emplean descriptores de MMU, según el tipo de instrucción
La ventaja de usar enlaces dinámicos es que los programas serán más livianos, aunque se crea una cierta dependencia del programa el cual no
+
</blockquote>
funcionará correctamente si se modifica algún módulo, segmento o referencia (en windows los errores debidos a actualizaciones de librerías
 
dinámicas .dll son bastante comunes [http://www.http://es.wikipedia.org/wiki/Infierno_de_las_DLL]). Por otro lado la ventaja de usar enlaces estáticos es que los programas son totalmente independientes,
 
lo que facilita su distribución.
 
 
 
*'''Enlazado dinámico durante la carga:'''
 
En los ss.oo. de este tipo los ejecutables incluyen una relación de los objetos externos que necesita. Al cargar el programa se buscan los
 
segmentos ya cargados y los que se necesitan y se resuelven los enlaces.
 
  
*'''Enlazado dinámino durante la ejecución:'''
+
* '''Uso de descriptores en memoria asociativa (Cache):'''
El enlazado dinámico durante la ejecución se basa en emplear referencias indirectas (la referencia apunta a una dirección de memoria la cual
+
<blockquote>
contiene la referencia al objeto) y en dotar al procesador de un tipo especial de interrupción llamado excepción de enlace.
+
La MMU contiene una memoria asociativa indexada por número de descriptor. Para cada acceso, se busca en la memoria asociativa el número de descriptor, y si no está, se carga a esta (Si se llena la memoria asociativa se lleva a cabo reemplazo). Este tipo de memoria es transparente, por lo que se puede usar en conjunción con registros descriptores de segmento en MMU.
El compilador establece de forma indirecta las referencias a elementos de otros segmentos, utilizando como objeto intermedio un puntero con el
+
</blockquote>
bit de excepción de enlace activado y que apunta hacia el identificador del elemento referido. Cuando se alcanza una referencia de este tipo
 
se lanza la excepción de enlace y el ss.oo. la atrapa el cual busca el objeto y localiza su dirección segmentada, con esa información el
 
ss.oo. modifica el puntero asignandole la dirección hallada y desactivando el bit de excepción (el enlace especial se reduce a una referencia
 
indirecta normal).
 
Para facilitar la ejecución las referencias a un mismo objeto se concentran en un único puntero (así la excepción de enlace se producirá
 
una sola vez) y todos los enlaces se concentran en un segmento especial llamado segmento de enlace.
 

Revisión del 16:29 13 ene 2013

Definición

Un segmento es un espacio de memoria de tamaño variable, compuesto por:

  • Descriptor: Identificador único del segmento (dentro del espacio de memoria del proceso).
  • Tamaño del segmento

Funcionamiento

Segmentos.png

Características

  • Cada proceso en ejecución (esté activo, bloqueado o preparado) tiene su tabla de segmentos.
  • Solapamiento: 2 segmentos pueden compartir zona de memoria. Ojo! problemas de concurrencia. Habría que usar algún método para su sincronización si se intenta.
  • Protección de memoria: añadir 3 bits a la tabla de descriptores de segmentos para los permisos ( r w x ).
  • Cuando un proceso requiere más memoria se crea un nuevo segmento.
  • Dos instancias de un mismo proceso pueden compartir segmentos de memoria de instrucciones/código, pero no para datos ya que esto complicaría la gestión.
  • No se redimensionan.
  • Gestión compleja, sobretodo por su tamaño variable
  • Permite la carga de segmentos a petición, de manera que no se disponga de todos los segmentos en memoria principal, que se puedan descargar a disco (en la zona de intercambio o swap) en base a un cierto criterio (ver Memoria virtual). Esta zona de intercambio puede ser:
    • Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar
    • Un fichero oculto de tamaño fijo o variable dependiendo de la configuración dada por el usuario (Windows).

Mecanismos

Los diferentes mecanismos que nos ofrece la segmentación de memoria son los siguientes.

Carga de segmentos a petición

Es un mecanismo que permite a un proceso no disponer de todos sus segmentos en memoria principal, se pueden descargar a disco (en la zona de intercambio o swap) segmentos en base a un cierto criterio (ver Memoria virtual).

Esta zona de intercambio puede ser:

  • Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar
  • Un fichero oculto de tamaño fijo o variable dependiendo de la configuracion dada por el usuario (Windows).

Formas de uso de los descriptores

En cuanto a aspectos materiales, se plantea el problema de que no es habitual que la tabla de segmentos quepa en el dispositivo de traducción (MMU), por lo que se almacena la tabla en memoria, y el MMU contiene su dirección. El problema es que esta técnica hace que el tiempo de acceso se duplique, al haber un primer acceso al MMU y un segundo acceso a la dirección efectiva. Se plantean dos soluciones no excluyentes:

  • Uso de registros descriptores de segmento en MMU:

En MMU nos encontraremos varios registros que pueden contener descriptores, en los que se copiarán los que se vayan a usar en un futuro inmediato. Hay dos tipos de registros:

  • Registros de propósito general:

Registros sobre los que se cargan los próximos descriptores a usar, y dos tipos de direcciones:
- Las que hacen referencia a un descriptor en la tabla de memoria (y necesitan más bits para hacer referencia al descriptor)
- Las que hacen referencia a un descriptor en MMU (y necesitan menos bits para referir al descriptor)

  • Registros especializados:

Registros capaces de albergar a un descriptor concreto, como el DS (Para manejo de datos), SS (Para manipulación de pila) o el CS (Para instrucciones de salto y llamadas a rutinas). También existen dos tipos de direcciones:
- Las que hacen referencia a un descriptor en la tabla de memoria
- Las que no hacen referencia a ningún descriptor, y emplean descriptores de MMU, según el tipo de instrucción

  • Uso de descriptores en memoria asociativa (Cache):

La MMU contiene una memoria asociativa indexada por número de descriptor. Para cada acceso, se busca en la memoria asociativa el número de descriptor, y si no está, se carga a esta (Si se llena la memoria asociativa se lleva a cabo reemplazo). Este tipo de memoria es transparente, por lo que se puede usar en conjunción con registros descriptores de segmento en MMU.