All’interno dell’articolo dedicato alla Memoria Virtuale ne abbiamo presentato un modello accurato ma tuttavia incompleto. La memoria virtuale presentata finora era infatti monodimensionale, rappresentata da un unico spazio degli indirizzi; questo non è del tutto vero. Lo spazio degli indirizzi di un programma può infatti essere suddiviso in sezioni più piccole, chiamate segmenti. Ogni segmento è costituito da un certo numero di indirizzi indipendenti, numerati da zero fino a un certo massimo. I segmenti non possiedono tutti la stessa dimensione, essi possono crescere in modo indipendente, fino ad occupare l’intero spazio a disposizione, vale a dire l’intero spazio degli indirizzi. La dimensione dei segmenti può variare durante l’esecuzione del programma: la lunghezza di un segmento di stack dovrebbe ad esempio aumentare ogni volta che viene inserito un nuovo elemento nello stack e diminuire ogni volta che un elemento viene rimosso.

I segmenti nascono per contenere una specifica tipologia di dati, un programma può disporre di un segmento destinato allo stack, uno destinato alle variabili, uno alle costanti, uno al sorgente, ecc. Tuttavia non esisterà mai un segmento contenente sia le costanti che il sorgente. I segmenti sono entità logiche di cui, a differenza delle pagine, il programmatore è a conoscenza; essi sono creati dal compilatore ma vengono però gestiti dal sistema.

Esempi di segmenti contenuti all'interno del medesimo sistema
Esempi di segmenti contenuti all’interno del medesimo sistema

Vantaggi offerti dai Segmenti

I segmenti offrono numerosi vantaggi al programmatore e al sistema. I diversi segmenti possono ad esempio essere compilati in modo indipendente permettendo un risparmio di tempo durante le fasi di editing del codice. La segmentazione facilita inoltre la condivisione e la protezione del codice, grazie ai segmenti è infatti possibile creare segmenti condivisi tra più programmi e specificare le forme di protezione dei singoli segmenti.

La possibilità di condividere un segmento tra più programmi permette di risparmiare memoria all’interno dei singoli spazi degli indirizzi. Una libreria condivisa può ad esempio essere resa disponibile dal sistema sotto forma di segmento condiviso, in questo modo la singola libreria non dovrà essere presente nello spazio degli indirizzi dei programmi che la necessitano.

Infine, il programmatore può specificare i diversi livelli di protezione per i vari segmenti. Il segmento contenente il sorgente sarà ad esempio impostato in sola lettura/esecuzione, mentre il segmento contenente lo stack sarà settato come in sola lettura/scrittura ma non esecuzione.