Segmentación

De Wiki de Sistemas Operativos
Revisión del 16:59 27 nov 2013 de Danababar (discusión | contribuciones) (Características)
Saltar a: navegación, buscar

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 de indicarse explícitamente que una porción de memoria puede 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 un segmento siempre que haya posiciones libres contiguas.
  • 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).
  • 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 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.


Superposición de segmentos

Varios segmentos pueden estar parcial o totalmente solapados en memoria. Una dirección física se puede corresponder con múltiples direcciones lógicas. Los segmentos superpuestos pueden tener incluso distintos permisos (segmento 0 y 1 ). Si son totalmente superpuestos se denominan segmentos alias.

Se aplica para implementar la técnica de "copy on write" (animación). Se crea inicialmente un segmento de datos, con permiso de lectura y escritura. Al crear el segmento de COW, este se crea con la misma dirección y tamaño (totalmente solapado), pero nótese que se quita el permiso de escritura en ambos segmentos. Si se intenta escribir en uno de los dos, se produce un fallo de protección. Entonces se copia el segundo segmento sobre una nueva ubicación, actualizándose su dirección y restituyéndose en ambos el permiso de escritura. Otra aplicación: en un micro que no permita modificar segmento de código, se puede crear un segmento alias de dato para modificarlo.

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 detrás, se cambia el tamaño en el descriptor; si no hay suficiente espacio: se copia al hueco libre (compactando si es necesario) y se cambia el tamaño ( y dirección base, claro está). Existe la posibilidad de crecimiento automático, a cada segmento se asocia un atributo "permitir crecer"; Si se sobrepasa el límite en un segmento que puede crecer, el tratamiento de la excepción es el que hará crecer al segmento. Gracias a la segmentación, todas las direcciones son reubicables.