Sto correndo Fedora 26
.
Questo è per un compito molto strano dato dal mio professore di algoritmi. Il compito dice:
Frammentazione della memoria in C:
progettare, implementare ed eseguire un programma C che procede come segue: alloca memoria per una sequenza di3m
matrici di 800.000 elementi ciascuna; quindi dealloca esplicitamente tutti gli array con numero pari e alloca una sequenza dim
array di dimensioni di 900.000 elementi ciascuno. Misura il tempo necessario al tuo programma per l'allocazione della prima sequenza e per la seconda sequenza. Sceglim
di esaurire quasi tutta la memoria principale disponibile per il tuo programma. "
L'obiettivo generale di questo è frammentare la memoria, quindi richiedere un po 'più di quello disponibile come blocco contiguo, costringendo il sistema operativo a compattare o deframmentare la memoria.
In classe ho chiesto come dovremmo procedere dal momento che la memoria è visualizzata e in realtà non contigua, alla quale ha risposto: "Beh, dovrai disattivare [memoria virtuale]". Alcuni altri studenti hanno chiesto in classe come dovremmo sapere quando abbiamo raggiunto questa "raccolta dei rifiuti", e ha detto che: "I tempi per la seconda assegnazione dovrebbero essere maggiori del primo a causa del tempo impiegato dalla raccolta dei rifiuti"
Dopo aver cercato un po 'in giro, la cosa più vicina che ho trovato a disabilitare la memoria virtuale è stata disabilitare la memoria di scambio swapoff -a
. Ho disabilitato il mio ambiente desktop e compilato ed eseguito il mio programma dal terminale nativo (per evitare possibili interferenze da altri processi, in particolare uno pesante come l'ambiente desktop). Ho fatto questo e ho eseguito il mio programma con un aumento m
fino a quando non ho raggiunto un punto in cui i tempi per la seconda assegnazione erano maggiori del primo.
Ho eseguito il programma con crescente m
e alla fine ho trovato un punto in cui il tempo per la seconda assegnazione era più del tempo per la prima assegnazione. Lungo la strada, tuttavia, ho raggiunto un punto in cui il processo è stato interrotto prima della seconda assegnazione. Ho controllato dmesg
e ho visto che è stato ucciso daoom
-killer. Ho trovato e letto diversi articoli su oom
-killer e ho scoperto che era possibile disabilitare l'allocazione di memoria da parte del kernel.
Ho fatto questo ed eseguito di nuovo il mio programma, solo che questa volta non sono stato in grado di trovare un m
tale che il tempo del secondo fosse superiore al primo. Alla fine con m sempre più grandi (anche se molto più piccoli di quando era abilitata la sovrallocazione) malloc fallirebbe e il mio programma sarebbe terminato.
Ho tre domande, la prima delle quali non è poi così importante:
Garbage Collection è il termine corretto per questo? Il mio professore è molto irremovibile nel dire che si tratta della raccolta dei rifiuti, ma io supponevo che la raccolta dei rifiuti fosse fatta dai linguaggi di programmazione e che questo sarebbe stato considerato più deframmentante.
La compattazione è come vuole su un sistema Linux?
Perché sono riuscito a raggiungere un punto in cui il tempo per la seconda allocazione era maggiore del primo quando disabilitavo lo scambio ma avevo ancora abilitato l'allocazione eccessiva di memoria? La compattazione ha effettivamente avuto luogo? In caso affermativo, perché non sono riuscito a raggiungere un punto in cui è avvenuta la compattazione dopo aver disabilitato la sovrallocazione della memoria?