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

Torna alla main page! Torna alla pagina principale