Originariamente pubblicato in data 16/05/1999
A
C
C
O
M
A
Z
Z
I
Il memory manager
Il memory manager
Natura e funzionamento del memory manager, quel componente di Mac OS che assegna e gestisce la memoria del computer
Vi siete mai chiesti cosa accade davvero quando lanciate una applicazione? Cosa succede tra il momento in cui chiedete al Finder di usare un programma e il momento in cui quel programma si presenta, pronto all'uso? Stiamo per scoprirlo insieme: allacciate le cinture e preparate una torcia elettrica, perchè dovremo scendere nei bassifondi dei nostri computer.3Prima di cominciare, chiariamo in modo pignolo, una volta per tutte, alcuni termini. Si fa spesso molta confusione nel distinguere tra sistema operativo, sistema operativo del disco, file system, toolbox e altri concetti ancora.
Il Sistema operativo è quell'insieme di procedure che vengono utilizzati dalle applicazioni per svolgere alcuni compiti basilari, come leggere dei dati dal disco o riservare dello spazio in memoria.
Una Applicazione è un programma che governa il computer. Per esempio, Paint o Write. Nel computer coesistono più programmi insieme: anche gli accessori di scrivania (come la Calcolatrice o il Pannello di controllo) sono programmi, ma non sono applicazioni.
Il Sistema operativo del disco è quella parte del sistema operativo che si occupa di leggere e scrivere dei documenti (file) sui dischetti. Al sistema operativo non importa nulla del contenuto di un file, sia una applicazione o un testo: è il programma che lo usa che deve saper distinguere i file, interpretando i dati che il sistema operativo del disco fornisce.
Il File system è il formato con cui i dati sono salvati sul disco: non si tratta di un programma, ma di una convenzione, una serie di regole, fissata dal sistema operativo del disco. Su Macintosh esistono due differenti file system: il primo e più vecchio si chiama Mfs (Macintosh file system) e veniva usato con i dischetti singola faccia, mentre il più recente Hfs (Hierarchical file system) è stato introdotto con i dischetti doppia faccia.
Il Loader e il Memory manager sono due dei tool del Toolbox, cioé sono parti del sistema operativo.
Il Finder è un'applicazione che viene usata per manipolare i dischetti.
Finder riceve il doppio click, e comprende che è vostro desiderio usare l'applicazione selezionata; da bravo segretario, ripulisce la scrivania e si prepara a cedere il controllo. Finder è un programma altolocato, e non si sporca le mani con operazioni banali come il caricamento di un programma: esso richiama dunque uno dei tool del toolbox, il Relocating loader (per gli anglofobi, il nome significa Caricatore rilocante).
Finder dice a Loader, più o meno: "Carica in memoria il tal programma ed eseguilo. Stai bene attento, però, che io resto in controllo: quando il programma avrà finito tu dovrai risvegliarmi". Il Loader, dal canto suo, fa affidamento sul sistema operativo del disco per compiere le operazioni di lettura dal dischetto: chiama allora il sistema operativo e gli dice: "Esiste su un tuo disco un programma chiamato così e cosà. Aprilo. Ci deve essere dentro un segmento fatto di codice; caricalo in memoria."
Il sistema operativo si serve di uno dei suoi scagnozzi, i cosiddetti Device driver (Guidatori di dispositivi) per fare il lavoro vero e proprio. Il sistema operativo dispone di un driver per ciascun tipo di disco collegato al computer: tipicamente uno per i dischetti da tre pollici, uno per i dischi da cinque pollici e uno per il disco rigido. Sono la bassa manovalanza del computer, e devono fare il lavoro sporco: non c'è nessun'altro sotto di loro per fare il lavoro, e dunque il driver prescelto si carica in spalla il badile e scende in cantina a spalare carbone... o, per meglio dire, accede allo hardware del disco e carica, un blocco per volta, il codice che costituisce il programma.
Tabella 1: la catena di comando che provvede a caricare le applicazioni in memoria.
Finder
Relocating Loader
Sistema operativo del disco
Device driver
Hardware del disco Le macchine più semplici (per esempio un Pc Ibm DOS o un buon vecchio Apple IIe) non hanno bisogno di un Loader, perchè il programma caricato dal disco è immediatamente eseguibile. Nel caso di Mac, però, le cose sono un po' complicate dalla presenza degli accessori di scrivania, come abbiamo visto nella scorsa puntata - per non parlare dello Switcher o del Multifinder che complicano ulteriormente la vicenda. Dato che nella memoria convivono molti programmi contemporaneamente (perlomeno il Finder addormentato, l'applicazione e gli accessori), nessuno di essi può pretendere per se una specifica locazione in memoria, perchè qualche locazione potrebbe venire pretesa da due programmi. Per questo motivo, i programmi sono conservati su disco in una forma non eseguibile chiamata la forma rilocabile: il nome indica che il programma in quella forma può venire spostato in qualunque punto della memoria. Compito del Loader è trovare un punto libero nella memoria, mettervi il programma e modificarlo: il Loader lo trasformerà dalla forma rilocabile in una forma non rilocabile, vincolata a quella particolare locazione dove è stato messo, ed eseguibile dal computer. Dopo l'intervento del Loader il programma può venire eseguito.
Il Loader interviene solo quando un programma deve caricare del codice in memoria: quando invece si rende necessario caricare dei dati, per esempio un font o l'immagine di una icona, non c'è bisogno di lui; in quel caso l'applicazione fa le sue richieste direttamente al sistema operativo del disco. Per Macintosh un qualunque file è composto di due parti distinte, chiamate sezione risorse e sezione dati (in inglese resource fork e data fork): questa è una delle regole rispettate da entrambi i file system del Mac.
Nella sezione risorse vengono memorizzate le strutture dati necessarie, come per esempio l'icona che il Finder mostra sulla scrivania. Ciascuna risorsa è identificata da un codice di quattro caratteri alfanumerici. Per esempio, una icona è identificata dalla sigla ICON5, il codice rilocabile è identificato dalla sigla CODE.
Tabella 2.
I tipi di risorsa più diffusi che appaiono su Macintosh. Notate che è importante distinguere tra maiuscole e minuscole.
KCAP Disposizione dei tasti sulla tastiera
CURS Cursore
DRVR Accessorio di scrivania o device driver
FONT Font6 di caratteri
NFNT, FOND Font di caratteri più recente
PACK Tool aggiuntivo del toolbox
PTCH Correzione ad alcuni bug del codice in Rom
ALRT Design di un dialogo di allerta7
DLOG Design di una finestra di dialogo
WIND Design di una finestra standard
CODE Codice macchina rilocabile
ICN# Lista di icone per il Finder
ICON Una o più icone per l'uso del programma
INTL Risorsa per la creazione di versioni nazionalizzate
MENU Definizione della sbarra dei menu per un'applicazione
PAT Pattern (retino)8
ppat Retino colorato per Macintosh II
PICT Disegno
STR, STR# Frasi, sequenze di caratteri, stringhe e simili.9
La sezione dati di un file contiene qualunque cosa si voglia infilarci; per esempio un documento MacWrite conserva il testo nella sua sezione dati. Notate che una delle due sezioni può benissimo essere vuota: un file di lunghezza zero ha sia la sezione dati che la sezione risorse vuote.
Se avete a disposizione l'applicazione ResEdit10 potete divertirvi un po' usandolo per curiosare dentro qualche applicazione, osservando le risorse di cui è composta.
Può darsi che non vi sia chiaro che differenza c'è tra un dato conservato in una risorsa e un dato conservato nella sezione dati. La regola è intuitivamente semplice: sono risorse i dati che vengono usati dalle applicazioni, come le icone, mentre nella sezione dati vengono stipati i dati creati e usati dall'utente umano, come i disegni che create con MacPaint.
Anche se bisogna pensarci un po' prima di rendersene completamente conto, le risorse sono una caratteristica tra le più preziose di Mac. Niente mezzi termini: un'idea rivoluzionaria dalle implicazioni sconvolgenti.
Grazie alle risorse, è estremamente facile nazionalizzare un programma. Se conoscete qualcuno che possiede un'Amiga11, chiedetegli la sua opinione sulla facilità d'uso della tastiera italiana di quel computer: ma prima procuratevi un taccuino per segnarvi le imprecazioni più colorite.
Dove sta il problema? La tastiera italiana (qualsiasi tastiera, quella di un computer o di una macchina da scrivere) ha i tasti disposti in modo diverso dalla tastiera americana. Se guardate la tastiera di una macchina da scrivere e leggete i tasti della prima fila trovate nell'ordine: Q, Z, E, R, T, Y... Ma se fate la stessa cosa con una macchina da scrivere francese leggerete A, Z, E, R, T, Y...
Normalmente, all'utente italiano di un personal computer americano accade una disgrazia a scelta tra le due seguenti. Primo caso: egli viene obbligato ad usare una tastiera americana, la cosiddetta Qwerty (come gli succede col Pc Ibm). In questo caso, continuerà per mesi a scrivere frasi sul tipo di "Egregio signore, senwa dubbio lei si chiederà...", dato che è abituato a trovare la zeta subito dopo la q, e non in terza fila; inoltre il poveraccio dovrà rinunciare alle vocali accentate, al simbolo di lira e agli altri caratteri che appaiono sulla tastiera italiana ma non su quella americana.
Secondo caso (tipico di Amiga): il nostro eroe ha la tastiera italiana Qzerty, ma quando batte il tasto Z mentre usa un programma americano il computer gli risponde visualizzando comunque una W, perchè il programma è convinto che il secondo tasto della prima fila corrisponda a quella lettera. Se il programma è furbo, può riuscire in qualche modo a superare questo problema (per esempio si può chiedere tutte le volte: "Che tastiera stai usando?") Il poveraccio che possiede una tastiera italiana, però, non può quasi mai usare un videogioco. I videogiochi tipicamente usano alcuni tasti della tastiera per ricevere istruzioni: per esempio, è tipico il caso in cui si deve usare il tasto I (nella prima fila) per salire, J (a sinistra nella seconda fila) per andare a sinistra, K per la destra e M per scendere. Però nella tastiera italiana la M si trova in seconda, e non in terza, fila: pertanto risulta impossibile usare il gioco con quella tastiera.
Con Mac, la tastiera è una risorsa nazionalizzabile: ogni programma riconosce automaticamente la tastiera americana (Qwerty), italiana (Qzerty), francese (Azerty), o anche giapponese Kanji, araba o hindu. Non accadrà mai che premendo il tasto 'z' vediate apparire sullo schermo la lettera 'w': il programma utilizza (senza accorgersene, perchè ci pensa lo Event manager per lui) la risorsa tastiera, che riconosce le versioni nazionalizzate e si adegua automaticamente.
Se vi ritrovate di fronte ad un giochino potete usare il gioco anche con una tastiera italiana. In quel caso il programma utilizzerà non i codici delle lettere (il famigerato codice Ascii, secondo il quale A vale 65, B vale 66 e così via) ma il codice dei tasti. In questo modo il primo tasto alfabetico della tastiera è il tasto numero 1, anche se in Italia corrisponde alla lettera Q e in Francia alla A.
Anche il Gs riesce a risolvere entrambi i problemi, usando una tecnica differente che trovate spiegata nel "Manuale dell'Apple IIgs" che l'autore di questo articolo ha scritto per Jackson.12
Le risorse di Mac risolvono inoltre l'annoso problema dei formati nazionali: se un programma in America scrive una data e una cifra come:
2/20/1988 0,000,000.00
in Italia quello stesso programma si ritrova a scrivere, senza dover cambiare un solo byte di codice:
20/2/1988 £200.000.000
Questo accade perchè il programma Mac usa una risorsa per stabilire qual è il formato usato per rappresentare data, ora, valuta, punto decimale e via dicendo: anzi, può anche gestire la scrittura da destra a sinistra e dal basso in alto!
Tutto questo è già ottimo; aggiungete poi la facilità nella traduzione dei programmi. Tutte le scritte che appaiono in un programma, compresi i titoli dei menu, sono memorizzati nelle apposite risorse: in questo modo, quando Microsoft italiana riceve da Microsoft Usa, poniamo, l'ultima versione di Word 3 può mettere al lavoro qualcuno con ResEdit e preparare la versione italiana in 24 ore, senza dover neppure toccare il programma. E il computer può gestire quelli che per altri modelli sono problemi insolubili, come ad esempio il cambio della parola Edit con la ben più lunga Composizione: lo spazio riservato al menu viene allargato automaticamente, senza che sorga nessun problema.
Osservando la figura possiamo studiare la composizione di un ipotetica applicazione Macintosh. Le risorse sono gestite dal Resource manager, cui il codice dell'applicazione inoltra le richieste man mano che ha bisogno di una risorsa.
A questo punto siamo in grado di comprendere il funzionamento del diabolico dialogo che ci costringe in molte circostanze a inserire un dischetto nella macchina14. Quando il programma ha bisogno di una risorsa qualunque (per esempio la definizione del dialogo che vi avvisa che la memoria è quasi esaurita, oppure un nuovo cursore a forma di farfalla) fa una richiesta al Resource manager, che a sua volta usa il sistema operativo per leggere da disco la risorsa. Se il sistema operativo non è in grado di esaudire la richiesta, per esempio perchè voi avete tolto dal drive il dischetto contenente il programma con le sue risorse, se ne esce con il dialogo "Introduci il disco Tizio".
Notate che le risorse che un programma usa non debbono necessariamente essere incluse nel programma stesso: il file System non è altro che una raccolta di risorse che tutti i programmi usano, come i font di caratteri, gli accessori di scrivania, il disegno del cursore freccia ed altro ancora. Molte risorse sono direttamente incluse nelle memorie Rom dei Macintosh più nuovi, Mac Se e Mac II.
Il Resource manager si incarica di trovare una risorsa, senza che l'applicazione debba preoccuparsi di segnalargli il luogo dove cercarla: la ricerca è intelligente, dato che si comincia dalla memoria Rom, che è in grado di rispondere immediatamente, poi la Ram (perchè può darsi che il programma debba usare una risorsa che è già servita in passato e dunque è già stata caricata in memoria), poi l'applicazione stessa e infine il System. Qualche volta, se abbiamo a disposizione un solo drive, finiamo intrappolati in una serie lunghissima di cambi di dischetto: questo accade quando il programma deve utilizzare una serie di risorse che si trovano divise tra il System che si trova sul dischetto A e l'applicazione sul dischetto B. Con i programmi più recenti e meglio fatti questo inconveniente non accade, perchè tutte le risorse vengono caricate in blocco, memoria permettendo (è il cosiddetto preload).
Il Memory manager è il supremo responsabile della memoria del computer. Si incarica di assegnarla ai programmi (applicazioni, accessori eccetera) che ne fanno richesta e la ottiene in restituzione quando il programma non ne ha più bisogno. E' buona regola per un programma chiedere la memoria il più tardi possibile e restituirla il più presto possibile, in modo da non esaurirla con troppa facilità.
Vi sono numerosi problemi che Memory manager deve trattare, problemi classici e ben studiati dalla teoria infirmatica, e pertanto trattati con metodi moderni. Il più classico è il problema della frammentazione della memoria.
Immaginate di possedere un computer con un megabyte di memoria, che viene assegnata in parti uguali a quattro programmi. Dopo un poco di tempo il primo e il terzo programma terminano l'esecuzione, e la memoria loro assegnata ritorna disponibile: un totale di mezzo megabyte, diviso però in due parti uguali e divise dal corpo del secondo programma. Se a questo punto arriva un nuovo programma che richiede per se quattrocento kilobyte, c'è memoria sufficiente per soddisfare la richiesta ma ciononostante la richiesta non può essere soddisfatta perchè la memoria disponibile è frammentata in due pezzi, mentre sarebbe necessario un unico spazio contiguo.
E' a causa di questo problema che esistono gli attributi dei segmenti: mentre un segmento di codice, una volta caricato in memoria, non può più venire spostato, un segmento di dati può venire spostato per ricompattare la memoria, a patto di informare dello spostamento il programma che lo possiede.
Questa operazione viene dunque effettuata a cura del Memory manager.
Non entreremo nei dettagli del funzionamento del Memory manager, perchè si tratta comunque di tecniche comunemente accettate dalla scienza informatica e che non hanno nulla di caratteristico nell'implementazione Apple. Qualunque buon libro di teoria informatica che tratti della gestione della memoria (un libro sui sistemi operativi, dunque) fornirà agli eventuali curiosi tutti i dettagli.