Parte
Prima
scritto
da Franco Torrini per il GIDA frtorrin@tin.it
Definizione di DLL:
DLL è un acronimo che sta per
dynamic-link library, ovvero libreria a link dinamico, nel corso del
tutorial capiremo meglio cosa si intende per libreria e per link
dinamico.
Cos’è una DLL:
Una DLL è una file eseguibile,
si un file eseguibile contenente sia dati che funzioni, utilizzabili da
moduli esterni. Queste due semplici affermazioni, sono in grado di
scatenare già una serie di domande impressionanti, come ad
esempio: se è vero che posso
utilizzare i dati di una DLL, ed ho due applicazioni che lo fanno sulla
stessa, posso allora asserire che entrambe usano gli stessi dati.
Se questo poteva essere vero su
Windows 3.1, non lo è più da Windows 95 in poi, perché come vedremo
tra poco, la gestione della memoria da parte del sistema in relazione
alle DLL evita quello che potrebbe sembrare un grande vantaggio, ma che
in realtà non è, anzi posso affermare per esperienza di vita vissuta,
che non c’era difetto peggiore di questo nelle DLL in ambiente
Windows.
DLL e gestione della
memoria:
Quando lanciamo in esecuzione
un’applicazione, le DLL utilizzate dalla stessa, vengono caricate in
memoria pronte all’uso. Ora, dire che vengono caricate in memoria è
troppo generico, come è generico dire che vengono caricate quando
l’applicazione viene eseguita, più avanti vedremo quando in realtà
le DLL vengono caricate in memoria, per il momento occupiamoci del dove
queste vengono effettivamente allocate e da chi. Da chi e’ presto
detto, è il sistema a farlo per noi, come lo fa per le applicazioni in
genere, ma quello che è più interessante è dove lo fa ed esattamente
nello spazio di indirizzamento virtuale del processo chiamante.
Perché proprio nello stesso
spazio di indirizzamento? In un ambiente a 32 bit come Windows 95 e
successivi, le applicazioni a 32
bit, perché non dimentichiamo che
su questi sistemi si possono ancora far girare applicazioni a 16 bit,
girano in spazi di indirizzamento separati, questo significa che una
variabile il cui indirizzo di memoria è 0x001914e2, indica una zona di
memoria diversa per ogni applicazione. Esistono naturalmente metodi noti
per scambiare dati tra processi, ma le difficoltà non sono poche, ed
essendo una DLL preposta proprio ad un continuo scambio di dati tra se
stessa e le applicazioni che la invocano, il metodo più semplice è
proprio quello di inserirle nello stesso spazio di indirizzamento. Ma
allora se più applicazioni usano la stessa DLL, tutte quante girano
nello stesso spazio di indirizzamento? Oppure ognuna ha la sua copia di
DLL caricata in memoria?
La risposta è: nessuna delle due.
La prima ci riporterebbe indietro
nel tempo ai tempi di Windows 3.1, dove tutte le applicazioni giravano
nello stesso spazio di indirizzamento, con la possibilità di scrivere
nella memoria di altri processi con conseguenze catastrofiche per le
applicazioni e per il sistema stesso, mentre la seconda sarebbe troppo
inefficiente, basta pensare alle DLL di sistema, caricate all ’avvio
di Windows e utilizzate da decine di applicazioni, non avremmo mai
abbastanza memoria per far partire neanche il sistema. Se una
applicazione usa una DLL che nessun altro ha ancora usato, il sistema si
preoccupa di caricarla in memoria e mapparla nello spazio di
indirizzamento virtuale del processo chiamante, ma se questa è già
stata caricata da un altro processo, il sistema, si preoccupa di fornire
una copia dei dati messi a disposizione dalla DLL, condividendo il
codice con le altre applicazioni, risparmiando in questo modo memoria e
diminuendo la possibilità di generare swapping con relativi
rallentamenti di tutte le applicazioni in esecuzione.
In conclusione possiamo dire
che nessuna preoccupazione ci sfiora per quanto riguarda il caricamento
in memoria di DLL tantomeno la condivisione ed il passaggio dei dati con
le stesse.
Parte
Seconda
|