Je cours Fedora 26
.
Ceci est pour une tâche très étrange donnée par mon professeur d'algorithmes. La mission dit:
Fragmentation de la mémoire en C:
Concevez, implémentez et exécutez un programme C qui fait ce qui suit: Il alloue de la mémoire pour une séquence de3m
tableaux de 800 000 éléments chacun; puis il désalloue explicitement tous les tableaux pairs et alloue une séquence dem
tableaux de taille 900 000 éléments chacun. Mesurez le temps nécessaire à votre programme pour l'allocation de la première séquence et de la deuxième séquence. Choisissezm
d'épuiser la quasi-totalité de la mémoire principale disponible pour votre programme. "
L'objectif global de ceci est de fragmenter la mémoire puis de demander un peu plus que ce qui est disponible en tant que bloc contigu, forçant le système d'exploitation à compacter ou défragmenter la mémoire.
En classe, j'ai demandé comment procéder, car la mémoire est visualisée et non contiguë, ce à quoi il a répondu: "Eh bien, vous devrez désactiver [la mémoire virtuelle]." Certains autres étudiants ont demandé en classe comment nous devrions savoir quand nous avons atteint ce "ramassage des ordures", et il a dit que: "Le moment de la deuxième allocation devrait être supérieur au premier en raison du temps pris par le ramassage des ordures"
Après avoir cherché un peu, la chose la plus proche que j'ai pu trouver pour désactiver la mémoire virtuelle était de désactiver la mémoire d'échange avec swapoff -a
. J'ai désactivé mon environnement de bureau et compilé et exécuté mon programme à partir du terminal natif (pour éviter toute interférence possible avec d'autres processus, en particulier un environnement lourd comme l'environnement de bureau). J'ai fait cela et j'ai exécuté mon programme en augmentant m
jusqu'à ce que j'arrive à un point où le moment de la deuxième allocation était plus grand que le premier.
J'ai dirigé le programme avec une augmentation m
et finalement trouvé un point où le temps pour la deuxième allocation était plus long que le temps pour la première allocation. En cours de route, j'ai toutefois atteint un point où le processus a été tué avant la deuxième attribution. J'ai vérifié dmesg
et j'ai vu qu'il avait été tué par un oom
tueur. J'ai trouvé et lu plusieurs articles sur oom
-killer et découvert que vous pouviez désactiver la surallocation de mémoire par le noyau.
Je l'ai fait et j'ai relancé mon programme, mais cette fois, je n'ai pas pu trouver un m
tel que le timing de la seconde était plus élevé que le premier. Finalement, avec m de plus en plus grand (bien que beaucoup plus petit que lorsque la surutilisation était activée) malloc échouerait et mon programme se terminerait.
J'ai trois questions, dont la première n'est pas vraiment importante:
La collecte des ordures est-elle le terme correct pour cela? Mon professeur est très catégorique en disant qu'il s'agit de la collecte des ordures, mais je pensais que la collecte des ordures était effectuée par des langages de programmation et que cela serait considéré comme plus défragmentant.
Le compactage comme il le souhaite est-il possible sur un système Linux?
Pourquoi ai-je pu atteindre un point où le temps pour la deuxième allocation était plus élevé que le premier lorsque j'ai désactivé l'échange mais que la surallocation de mémoire était toujours activée? Le compactage a-t-il réellement eu lieu? Si oui, pourquoi n'ai-je pas pu atteindre un point où le compactage s'est produit après avoir désactivé la surutilisation de la mémoire?