Está en la página 1de 3

Tema 4: Segmentación

1. Segmentación: Base/Bounds generalizados


La segmentación se creó en la década de 1960 como una solución al gran desperdicio de
espacio que crea base and bounds.
La segmentación trata de tener un base/bounds generalizado, es decir, tener un base/bounds
por cada segmento (porción contigua al espacio de direcciones que tiene tamaño concreto).
En espacio de direcciones hay 3 tipos de segmento: código, stack y heap. El sistema
operativo coloca los tres segmentos de un proceso en distintas posiciones de la memoria
física.
Ventajas:
➢ Evita rellenar la memoria física con espacios de direcciones virtuales no utilizados.
➢ Se evita tener “espacios de direcciones escasos” que son grandes espacios de
memoria con muchas direcciones sin utilizar.
Se almacena la cantidad de bytes asociados a un determinado segmento.

Ejemplo: memoria física de 64 KB con16 KB para el sistema


operativo en la que podemos encontrar los 3 segmentos. Solo se
asigna el espacio en la memoria física de la memoria usada por lo
que hay muchas direcciones sin usar (espacio de direcciones
escasos).
Size = bounds

Con espacio de direcciones:


0 – 2KB
Code

4KB-7KB
heap

14KB-16KB stack
Suponiendo que referenciamos la dirección virtual 100, esa dirección se encuentra en code,
comprobamos que 100 <= 2KB. Como se cumple sumamos su base con la dirección
virtual: 32KB + 100 = 32868
Suponiendo otra dirección perteneciente a heap como 4200, debemos hallar donde se
encuentra realmente la dirección buscada, por lo que hay que restar la dirección donde
inicia heap en el espacio de direcciones (4KB) con el desplazamiento dado (4200), se
obtiene 104 <= 3KB por lo que sumamos su base (34KB) obteniendo como dirección física
34920.
2. Localizar un segmento
Para identificar el tipo de segmento podemos usar 2 estrategias:
➢ Estrategia explícita: se trocea el espacio de direcciones en segmentos.

Segment sirve para identificar el contenido del segmento (00-code, 10-stack o 01-
heap, en el espacio de direcciones anterior). El resto de los bits del segmento
contienen el offset a sumar a la “base”. Además, debe aparecer el size y grow
support que indica si es creciente(heap) o decreciente(stack).
Desventaja: el tamaño máximo está limitado y mermado y puede que no sea posible
albergar un programa determinado.

➢ Estrategia implícita: El hardware se encarga de determinar el segmento según


cómo se construyó.

3. Stack
Ejemplo: En el ejemplo anterior hemos calculado direcciones físicas de heap y de code,
pero no de stack (que crece en negativo).
Esto indica que stack crece negativamente.
Por lo que vamos a suponer que queremos
acceder a la dirección virtual 15KB.
Debemos hallar la dirección que es 15KB-14KB = 1KB y este restárselo a base →28KB –
1KB = 27KB.

4. Compartición
La compartición de segmentos de memoria entre espacios de direcciones diferentes ,de
forma transparente al proceso. Esto crea la necesidad de proteger esos segmentos contra
modificaciones. Esto se hace usando bits de protección que indica si las direcciones se
pueden leer, escribir y/o ejecutar.

4. Fine-grain vs coarse-grain
La granularidad es dividir el espacio de direcciones en fragmentos de mayor o menor
tamaño.

➢ Segmentación de grano fino: muchos segmentos cortos

➢ Segmentación de grano grueso: corta el espacio de direcciones en muchos segmentos


relativamente largos.
Se necesita una tabla de segmentos almacenada en memoria como el apoyo al hardware
que describa esos segmentos.
5. ¿Qué necesita el sistema operativo?
¿Qué ocurre en caso de cambio de contexto? Se deben almacenar todos los registros y
restaurarlos.
¿Qué ocurre cuando un segmento crece o decrece? Esto puede ocurrir en heap y para
ello se llama al sistema sbrk() aunque puede que esta llamada no se pueda realizar.
La fragmentación es la existencia de múltiples huecos de memoria sin uso dispersos a lo
largo del espacio físico de direcciones. Se combate compactando el espacio, es decir,
desfragmentando. Esto es costoso.
¿Qué ocurre con los huecos libres? Fragmentación externa ( la memoria física se llena
rápidamente de pequeños agujeros de espacio libre, lo que dificulta la asignación de
nuevos segmentos).
¿Qué ocurre cuando se asigna más memoria de la solicitada a un proceso?
Fragmentación interna (va a haber espacios en esa reserva que no se usen)

También podría gustarte