Capítulo 5: Gestión de la memoria principal
Segmentación
Hasta ahora, hemos visto el problema de la gestión de memoria desde el punto de vista del sistema operativo, donde la asignación de memoria se realiza en función del tamaño total de un proceso o dividiendo éste en porciones de la misma longitud. Sin embargo, los programadores y los usuarios necesitan manejar sus datos de un modo más flexible: Tanto las funciones y procedimientos en las que se dividen los programas, como las estructuras en las que se organizan los datos (como tablas o pilas), tienen tamaños diversos.
Por lo tanto, podemos decir que un programa es un conjunto de elementos lógicos de tamaños variables.
Es como si el zumo del ejemplo anterior fuese en realidad una mezcla (por ejemplo, naranja, kiwi y fresa) y nos interesara mantenerlos separados. Entonces, podríamos utilizar varios envases más pequeños. Todos juntos representarían al mismo proceso:
Para dar cobertura a este planteamiento, la segmentación plantea que en el momento de compilar un programa, éste se convierta en un conjunto de segmentos a los que se asignará un identificador, un punto de inicio y un tamaño. Las direcciones se expresarán mediante un número de segmento y un desplazamiento dentro de él, y el tamaño asegura que no se realizan referencias a direcciones ilegales dentro del segmento.
Además, como cada componente lógico del proceso se encuentra en un segmento diferente, podemos mejorar la protección haciendo que los segmentos que contienen código sean de solo lectura. También podemos asegurar que un fragmento de código no acceda al código de un fragmento diferente.
Por otra parte, al encontrarse cada bloque lógico del programa en un segmento distinto, podría compartirse código entre diferentes programas de un modo sencillo.
De forma parecida a como ocurría en la paginación, la conversión de una dirección virtual a su correspondiente dirección física se realiza utilizando una tabla de segmentos.
Como en el caso de la paginación, la segmentación puede extender el espacio físico de almacenamiento utilizando técnicas de intercambio.