Esercitazione Sistemi Operativi a.a. 1999/2000
Gestione della memoria
Modificare il gestore della memoria di MINIX in modo che sia eliminata la frammentazione esterna, mediante compattazione; in particolare si richiede
Consegnare il seguente materiale:
Data ultima di scadenza: giovedi' 20 gennaio 2000.
NOTE:
Inserire il materiale in una busta chiusa con sopra scritti numero del gruppo e nome-cognome-login di ogni componente e consegnarla IN BUCA a Dodero o Gianuzzi. Tutto il materiale consegnato (documentazione e dischetti) dovra' essere identificato allo stesso modo (onde evitare disastri se qualcosa cadesse per terra, si rimescolasse il contenuto delle buste ecc).
Per valutare l'esercitazione si terra' conto di tutto il materiale consegnato, in particolare:
1. Files sorgenti
Fornire un listato di tutti i files modificati; per files in cui le modifiche si riducano a una o pochissime righe puo' essere listata solo la parte "intorno" a tale modifica.
Le modifiche apportate ai sorgenti Minix devono essere comunque identificate da commenti "speciali" e se necessario ulteriormente commentate seguendo lo "stile" di Minix stesso.
Esempio di commenti "speciali": /* modifica gruppo xx */ ... /* fine modifica gruppo xx */
2. Documentazione cartacea
La documentazione cartacea puo' essere consegnata manoscritta (purche' chiara e leggibile) oppure scritta con word processors, oppure meta' e meta', ecc. Essa deve essere sintetica, in particolare non devono essere riportate informazioni contenute in questo foglio, sul Tanenbaum ecc.
La documentazione deve contenere una copertina che riporti nome, cognome, login, data e FIRMA dei componenti il gruppo che hanno effettivamente svolto l'esercitazione.
Nel testo della documentazione devono essere presenti in modo chiaro le seguenti informazioni:
informazioni di utente: deve essere possibile a chiunque sia in possesso dei dischetti e della documentazione, ricreare Minix modificato, ripassare i tests ecc.
informazioni di sistema: chi fosse interessato a leggere i sorgenti C modificati, deve trovare informazioni su come e' stata fatta la modifica. Vanno elencati: i files contenuti nei dischetti, e per ciascun file le modifiche, sia inserimenti sia cancellazioni, apportate alle strutture dati e alle funzioni ivi contenute. Delle modifiche va data motivazione e descrizione sintetica. La descrizione va data in italiano o in pseudo-codice (bastano poche righe). Non va descritta l'operazione riga per riga!
(esempio di cosa NON scrivere: la funzione pinco() confronta il primo parametro con zero e se essi sono uguali, azzera anche il secondo parametro. Chiunque leggera' la documentazione sa anche leggere un IF!)
informazioni sui tests: va motivata la scelta dei programmi di tests, e ne vanno riportate le modalita' di esecuzione. In particolare predisporre scripts che ricompilano, lanciano programmi in background ecc. Dei singoli programmi che compongono il test riportare solo le caratteristiche rilevanti (il sorgente dovrebbe essere comprensibile con l'aiuto al piu' di qualche commento).
(esempio: il programma P1 ha due loop annidati il cui scopo e' di ritardare il processo per almeno..., nel test si lanciano quattro copie di P1 e due di P2, e si osserva che ....)
Consigli utili (a chi non ha mai realizzato grossi programmi):
L’esercitazione si compone di tre parti:
Si raccomanda di progettare e realizzare separatamente le tre parti (non fare tutte le modifiche contemporaneamente!)
Si raccomanda quindi di sviluppare versioni bootabili di Minix intermedie: ad es. una in cui e’ definita la system call compact (ma non fa nulla), una in cui e’ realizzato il nuovo algoritmo ecc.
Suggerimenti dettati dall’esperienza (e validi anche dopo la consegna):
Procedure fornite o da completare:
/*=============== move_block ===================*/
/* sposta un blocco di processi contigui e ne cambia i relativi
slot nella tabella dei processi di MM e FS
- La mem_copy sposta materialemnte il blocco
- Il ciclo for cambia gli slot dei processi che hanno indirizzo
iniziale compreso tra dove bisogna cominciare a copiare il blocco
e dove termina il blocco stesso (infatti non vi sono piu`
processi attivi in tale area)
- La sys_newmap trasmette i cambiamenti alla tabella del kernel
- Ritorna l'indirizzo successivo alla fine del blocco spostato
*/
/*=============== clicks_to_K ===================*/
/* converte il parametro da clicks a Kbytes (risultato)
*/
/*=============== write_proc ===================*/
/* stampa informazioni sul processo corrente
*/
/*=============== write_hole ==================*/
/* stampa informazioni sulla tabella degli holes
*/
/*=============== aux_do_comp ===================*/
/* compatta la memoria per ottenere il numero di clicks passati
come parametro
- scorre la lista dei buchi finche` la somma delle loro lunghezze
e` maggiore o uguale al numero di clicks richiesti e salva
l'indirizzo dell'ultimo buco necessario
- a partire dal primo buco compatta attraverso chiamate alla
move_block tutti i blocchi compresi tra due buchi successivi
della corrispondente lista fino ad arrivare all'ultimo buco
necessario
- cancella dalla lista dei buchi quelli cosi' utilizzati
- libera la memoria inutilizzata
- ritorna l'indirizzo iniziale della memoria richiesta
*/
/*=============== do_compact ===================*/
/* implementa la system call compact
*/
/*=============== max_hole ===================*/
/* Questa funzione si sostituisce a quella di Minix originale e
calcola la somma dei
buchi liberi, anziche' la dimensione del max buco libero
*/