Estoy funcionando Fedora 26
.
Esto es para una tarea muy extraña dada por mi profesor de algoritmos. La tarea dice:
Fragmentación de memoria en C:
diseñe, implemente y ejecute un programa en C que haga lo siguiente: asigna memoria para una secuencia de3m
matrices de 800,000 elementos cada una; luego desasigna explícitamente todas las matrices pares y asigna una secuencia dem
matrices de 900,000 elementos de tamaño cada una. Mida la cantidad de tiempo que su programa requiere para la asignación de la primera secuencia y para la segunda secuencia. Elijam
agotar casi toda la memoria principal disponible para su programa ".
El objetivo general de esto es fragmentar la memoria y luego solicitar un poco más de lo que está disponible como un fragmento contiguo, lo que obliga al sistema operativo a compactar o desfragmentar la memoria.
En clase, pregunté cómo deberíamos hacer esto, ya que la memoria se visualiza y no es realmente contigua, a lo que él respondió: "Bueno, tendrás que apagar [la memoria virtual]". Otros estudiantes preguntaron en clase cómo deberíamos saber cuándo llegamos a esta "recolección de basura", y él dijo que: "El tiempo para la segunda asignación debe ser mayor que el primero debido al tiempo que lleva la recolección de basura".
Después de buscar un poco, lo más cercano que pude encontrar a deshabilitar la memoria virtual fue deshabilitar la memoria de intercambio swapoff -a
. Inhabilité mi entorno de escritorio y compilé y ejecuté mi programa desde el terminal nativo (para evitar posibles interferencias de otros procesos, especialmente uno pesado como el entorno de escritorio). Hice esto y ejecuté mi programa aumentando m
hasta llegar a un punto en el que el tiempo para la segunda asignación fue mayor que el primero.
Ejecuté el programa cada vez más m
y finalmente encontré un punto donde el tiempo para la segunda asignación era más que el tiempo para la primera asignación. En el camino, sin embargo, llegué a un punto en el que el proceso finalizó antes de la segunda asignación. Lo comprobé dmesg
y vi que fue asesinado por oom
-killer. Encontré y leí varios artículos sobre oom
-killer y descubrí que podía deshabilitar la asignación excesiva de memoria por parte del núcleo.
Hice esto y ejecuté mi programa nuevamente, solo que esta vez no pude encontrar un m
tal que el momento del segundo fuera más alto que el primero. Eventualmente, con m cada vez más grande (aunque mucho más pequeño que cuando se habilitó la sobreasignación), malloc fallaría y mi programa terminaría.
Tengo tres preguntas, la primera de las cuales no es realmente tan importante:
¿Es la recolección de basura el término correcto para esto? Mi profesor es muy firme al decir que se trata de recolección de basura, pero yo asumía que la recolección de basura era algo que se hacía mediante lenguajes de programación y que esto se consideraría más desfragmentado.
¿Es posible la compactación como él quiere en un sistema Linux?
¿Por qué pude llegar a un punto en el que el tiempo para la segunda asignación fue mayor que el primero cuando desactivé el intercambio pero todavía tenía habilitada la sobreasignación de memoria? ¿Realmente tuvo lugar la compactación? Si es así, ¿por qué no pude alcanzar un punto en el que ocurrió la compactación después de deshabilitar la sobreasignación de memoria?