ShInKurO ha scritto:cdimauro ha scritto:Vero, ma senza MMU è difficile riuscire a "rimettere assieme" i pezzi di memoria disallocata da un'applicazione (in particolare nel caso della sua chiusura) in modo da riformare blocchi più grandi.
Uhm, ma OS4 utilizza la MMU, gli indirizzi sono virtualizzati come nei sistemi moderni...
ehm... la questione è un po' complicata.
OS4, se non vado errato, espone un unico address space per tutti i programmi e per lo stesso kernel. Questo significa che la funzione della memoria virtuale serve soltanto a mappare questo address space sulla memoria fisica.
In particolare, ogni context switch tra processi NON implica un flush del TLB e NON implica una riprogrammazione della MMU.
Questo si traduce in maggiori prestazioni, ma non virtualizza gli address spaces dei singoli programmi.
Se montassi 2GB di ram su un sistema con OS4, in particolare, la memoria virtuale smetterebbe di essere utile, perchè il mapping tra indirizzi virtuali e fisici sarebbe 1:1.
Detto questo, quando i programmi frammentano la memoria nello spazio di indirizzi virtuali, sicuramente posso compattare le pagine "fisiche", ma nello spazio virtuale visto dai programmi questa memoria è, e continuerà ad essere, frammentata.
Ciò che limita la frammentazione di memoria in sistemi come Unix o Windows, è proprio la separazione di ogni "singolo" address space rispetto a quello di tutti gli altri processi.
In questo modo, se un processo frammenta il "proprio" address space virtuale, quello degli altri programmi non subisce "nessuna interferenza" in tal senso. La MMU in questi casi viene riprogrammata ad ogni context switch (o meglio ancora, solo se al rientro dall'ISR è stata effettuata una rischedulazione dei task) e di conseguenza viene flushato il TLB, penalizzando le prestazioni ma assicurando un'enorme vantaggio in termini di stabilità di sistema.