La gestione della memoria è una delle funzioni di base del sistema operativo. I moderni sistemi operativi consentono a ciascun processo di ottenere più memoria virtuale rispetto alla dimensione totale della memoria (fisica) effettiva su un determinato sistema informatico. L'obiettivo principale della gestione della memoria è quello di combinare memoria grande ma lenta con memoria piccola ma ad alta velocità, per ottenere l'effetto di una memoria ad alta velocità più ampia.
La separazione tra partizione fissa e variabile è inefficace in termini di utilizzo della memoria, poiché il partizionamento fisso risulta interno, mentre dinamico nella frammentazione esterna. Una possibile soluzione al problema della frammentazione è consentire al processo di non essere scritto in un blocco di memoria continuo. Il programma può essere disperso arbitrariamente nella memoria. In questo caso, la memoria di lavoro è suddivisa in blocchi più piccoli di dimensioni fisse chiamati frame. Lo spazio di indirizzamento logico del programma è anche diviso in blocchi della stessa dimensione, chiamati pagine. Quando un programma viene inserito nella memoria, le pagine vengono scritte in frame di memoria libera. Per facilitare il trasferimento dei programmi da un disco a una memoria funzionante, il disco è anche diviso in frame della stessa dimensione dei frame di memoria. Pertanto, un frame dal disco viene scritto in un frame della memoria di lavoro. Il sistema di paging funziona nel modo seguente: quando il programma viene accettato per l'esecuzione, viene calcolata la sua dimensione, che viene espressa con il numero di pagine richiesto. Se un numero sufficiente di frame è libero, il processo viene registrato nella pagina di memoria per pagina. Allo stesso tempo, il numero di frame in cui ogni pagina è scritta viene inserito nella tabella frame.
Il programma utente e i dati associati possono essere suddivisi in un numero di segmenti. I segmenti di tutti i programmi non devono avere le stesse dimensioni, sebbene esista una lunghezza massima del segmento. Come per il paging, l'indirizzo logico che utilizza la segmentazione consiste di due parti, in questo caso il numero di segmenti e dislocazioni all'interno di quel segmento. A causa dell'uso di segmenti di dimensioni diverse, la segmentazione è simile al partizionamento dinamico. In assenza di uno schema di sovrapposizione o di uso della memoria virtuale, è necessario che tutti i segmenti del programma vengano caricati nella memoria per l'esecuzione. La differenza rispetto al partizionamento dinamico è che la segmentazione può richiedere più di una partizione e che la partizione non deve essere adiacente. La segmentazione risolve il problema della frammentazione interna, ma oltre al partizionamento dinamico rimane il problema della frammentazione esterna. Tuttavia, poiché il processo è suddiviso in un numero di parti più piccole, la frammentazione esterna è in genere più piccola. A differenza del paging, che è invisibile al programmatore, la segmentazione è solitamente visibile e adatta all'organizzazione di programmi e dati. Ai fini della programmazione modulare, il programma oi dati possono essere ulteriormente suddivisi in diversi segmenti più piccoli. Lo svantaggio di questa tecnica è che il programmatore deve conoscere i limiti della dimensione massima del segmento. La prossima convenienza nell'usare segmenti di dimensioni diverse è che non esiste una connessione prospettica tra indirizzi logici e fisici. Analogamente al paging, la tecnica di segmentazione semplice utilizza la tabella dei segmenti per ogni processo e un elenco di blocchi disponibili nella memoria principale.
Il cercapersone offre uno spazio di indirizzi virtuale e fisico e uno spazio di memoria secondario su blocchi (pagine) di uguale lunghezza. Ciò consente di allocare lo spazio di indirizzamento virtuale continuo al processo di dispersione (non necessariamente continuamente distribuito) nello spazio di indirizzamento reale e nella memoria secondaria. Anche la pagina, come termine, si riferisce alla memoria piuttosto che agli oggetti logici che sono visibili a livello di programma. La segmentazione fornisce uno spazio di indirizzi virtuali su blocchi (segmenti) che corrispondono direttamente agli oggetti a livello di programma. Per questo motivo, il segmento non ha una lunghezza fissa, quindi anche la dimensione del segmento può essere modificata durante l'esecuzione del programma. La protezione e la divisione sono quindi possibili a livello di oggetto e ci sono processi visibili in cui viene eseguita la segmentazione.
Lo sviluppatore dell'applicazione non è a conoscenza del paging. Scrive programmi come se la memoria fosse lineare, e il sistema operativo e il processore sono preoccupati per il suo partizionamento e la conversione in indirizzi virtuali. Il programmatore sui sistemi di segmentazione, tuttavia, elenca due parti dell'indirizzo, segmento e pagina nei loro programmi. Tutte le pagine hanno le stesse dimensioni mentre i segmenti sono diversi. La segmentazione ha più spazi di indirizzi lineari e il paging solo uno. I segmenti consentono il partizionamento logico e la protezione dei componenti dell'applicazione, mentre le pagine no.
Il cercapersone, che è trasparente per il programmatore, elimina la frammentazione esterna e quindi garantisce un uso efficiente della memoria principale. I pezzi che si muovono dentro e fuori la memoria principale sono fissi e hanno le stesse dimensioni, quindi è possibile sviluppare sofisticati algoritmi di gestione della memoria che sfruttano il comportamento del programma. La segmentazione è visibile allo sviluppatore e ha la capacità di gestire la crescita della struttura dei dati, la modularità e il supporto per lo scambio e la protezione.
paging | Segmentazione |
dimensione delle pagine fisse | i segmenti non hanno dimensioni fisse |
invisibile per programmatore | visibile per programmatore |
uno spazio di indirizzamento lineare | più spazi di indirizzi lineari |
non consente il partizionamento logico e la protezione dei componenti dell'applicazione | consente |