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.)
 
(No se muestran 20 ediciones intermedias de 11 usuarios)
Línea 11: Línea 11:
 
*Cada proceso en ejecución (esté activo, bloqueado o preparado) tiene su tabla de segmentos.
 
*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.
+
*Solapamiento: Se puede hacer que 2 segmentos se superpongan de manera que compartan direcciones de memoria física con direcciones lógicas diferentes. Para evitar problemas de concurrencia, debe indicarse explícitamente que una porción de memoria pueda ser compartida. De esta manera, procesos diferentes pueden compartir información y código usando la memoria común.
  
 
*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.
+
*Cuando un proceso requiere más memoria se crea un nuevo segmento.
  
*Esto supone dos accesos a memoria física real. La tabla de segmentos ocupa memoria, siendo deseable que permanezcan en cache.
+
*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.
  
*Cuando un proceso requiere más memoria se crea un nuevo segmento.
+
*Es posible la redimensión de segmentos siempre que haya posiciones libres contiguas, o crear un nuevo segmento y copiar el contenido del anterior.
  
*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.
+
*Gestión compleja, sobre todo por su tamaño variable
  
*No se redimensionan.
+
*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).
  
*Gestión compleja, sobretodo por su tamaño variable
+
*La segmentación se hizo para equipos con poca memoria, no está pensada para sistemas modernos.
  
 
=Mecanismos=
 
=Mecanismos=
Línea 36: Línea 38:
 
* Un lugar fijo en el disco (Linux, Unix). El administrador de memoria decide qué segmento se va a descargar
 
* 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).
+
* Un fichero oculto de tamaño fijo o variable dependiendo de la configuración dada por el usuario (Windows).
 
 
==Enlace dinámico==
 
Uso de llamadas a funciones que están en disco.
 
 
 
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).
 
  
=== Enlazado estático VS enlazado dinámico: ===
+
==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 (Memory management unit o 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:'''
 +
<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:
 +
*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)
 +
<br>- 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:
 +
<br>- Las que hacen referencia a un descriptor en la tabla de memoria
 +
<br>- Las que no hacen referencia a ningún descriptor, y emplean descriptores de MMU, según el tipo de instrucción
 +
</blockquote>
  
 +
* '''Uso de descriptores en memoria asociativa (Cache):'''
 +
<blockquote>
 +
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.
 +
</blockquote>
  
Los montadores de enlaces convencionales (estáticos) deben enlazar en tiempo de compilación todos los módulos, segmentos y referencias de un
+
=Superposición de segmentos=
programa para completar sus instrucciones (si el número de instrucciones es muy elevado la cantidad de trabajo del montador será enorme)
 
mientras que los montadores de enlaces dinámicos realizarán el enlazado durante la ejecución o durante la carga del programa.
 
  
*'''Pros y contras:'''
+
El administrador de memoria puede definir segmentos superpuestos para crear áreas de memoria compartidas entre dos o más procesos del sistema. Los procesos emplean una llamada al sistema explícita para solicitar la creación del área de memoria compartida. El mecanismo de segmentos solapados es un aspecto propio del administrador de memoria, del que se puede valer para implementar la memoria compartida.
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
 
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:'''
+
=Crecimiento de proceso=
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
+
Existen dos formas de crecimiento: Asignando nuevos segmentos al proceso, y haciendo crecer algún segmento asignado.  
segmentos ya cargados y los que se necesitan y se resuelven los enlaces.
+
Para crecer un segmento: si hay suficiente espacio libre contiguo, se actualiza el tamaño en el descriptor del segmento. Si no hay suficiente espacio: se define un nuevo segmento y se copia el contenido al nuevo segmento.
  
*'''Enlazado dinámino durante la ejecución:'''
+
7.4 [[Paginación | Paginación]]
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
 
contiene la referencia al objeto) y en dotar al procesador de un tipo especial de interrupción llamado excepción de enlace.
 
El compilador establece de forma indirecta las referencias a elementos de otros segmentos, utilizando como objeto intermedio un puntero con el
 
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 actual del 18:38 2 abr 2020

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: Se puede hacer que 2 segmentos se superpongan de manera que compartan direcciones de memoria física con direcciones lógicas diferentes. Para evitar problemas de concurrencia, debe indicarse explícitamente que una porción de memoria pueda ser compartida. De esta manera, procesos diferentes pueden compartir información y código usando la memoria común.
  • 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.
  • Es posible la redimensión de segmentos siempre que haya posiciones libres contiguas, o crear un nuevo segmento y copiar el contenido del anterior.
  • Gestión compleja, sobre todo 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).
  • La segmentación se hizo para equipos con poca memoria, no está pensada para sistemas modernos.

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 configuración 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 (Memory management unit o 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.

Superposición de segmentos

El administrador de memoria puede definir segmentos superpuestos para crear áreas de memoria compartidas entre dos o más procesos del sistema. Los procesos emplean una llamada al sistema explícita para solicitar la creación del área de memoria compartida. El mecanismo de segmentos solapados es un aspecto propio del administrador de memoria, del que se puede valer para implementar la memoria compartida.

Crecimiento de proceso

Existen dos formas de crecimiento: Asignando nuevos segmentos al proceso, y haciendo crecer algún segmento asignado. Para crecer un segmento: si hay suficiente espacio libre contiguo, se actualiza el tamaño en el descriptor del segmento. Si no hay suficiente espacio: se define un nuevo segmento y se copia el contenido al nuevo segmento.

7.4 Paginación