Я бегу Fedora 26
.
Это очень странное задание, данное моим профессором по алгоритмам. Назначение говорит:
Фрагментация памяти в C:
проектирование, внедрение и выполнение C-программы, которая выполняет следующие функции: выделяет память для последовательности3m
массивов размером 800 000 элементов каждая; затем он явно освобождает все четные массивы и выделяет последовательностьm
массивов размером 900 000 элементов каждый. Измерьте количество времени, которое ваша программа требует для выделения первой последовательности и для второй последовательности. Выберите,m
чтобы исчерпать почти всю основную память, доступную для вашей программы. "
Общая цель этого состоит в том, чтобы фрагментировать память, а затем запрашивать немного больше, чем то, что доступно в виде непрерывного фрагмента, вынуждая операционную систему сжимать или дефрагментировать память.
В классе я спросил, как нам следует поступить так, поскольку память визуализируется и не является смежной, на что он ответил: «Ну, тебе придется отключить [виртуальную память]». Некоторые другие ученики спросили в классе, как мы должны знать, когда мы добрались до этой «сборки мусора», и он сказал, что: «Время для второго распределения должно быть больше, чем первое из-за времени, затрачиваемого на сборку мусора»
После небольшого поиска, самое близкое, что я мог найти для отключения виртуальной памяти, было отключить подкачку памяти swapoff -a
. Я отключил свою рабочую среду, скомпилировал и запустил программу из собственного терминала (чтобы избежать возможного вмешательства со стороны других процессов, особенно тяжелых, таких как среда рабочего стола). Я делал это и запускал свою программу с увеличением, m
пока не достиг точки, где время для второго распределения было больше, чем первое.
Я запускал программу с увеличением m
и в конечном итоге нашел точку, где время для второго распределения было больше, чем время для первого распределения. Однако по пути я попал в точку, где процесс был остановлен перед вторым распределением. Я проверил dmesg
и увидел, что он был убит oom
-killer. Я нашел и прочитал несколько статей о oom
-killer и обнаружил, что вы можете отключить перераспределение памяти ядром.
Я сделал это и снова запустил свою программу, только на этот раз я не смог найти m
такую, чтобы время второго было выше, чем первого. В конце концов, с большим и большим m (хотя и намного меньшим, чем при включенном перераспределении), malloc завершится ошибкой, и моя программа завершится.
У меня есть три вопроса, первый из которых не так уж важен:
Правильный ли для этого сбор мусора? Мой профессор очень непреклонен, говоря, что это сборка мусора, но я полагал, что сборка мусора была сделана языками программирования и что это будет считаться более дефрагментирующим.
Возможно ли уплотнение, как он хочет, в системе Linux?
Почему я смог достичь точки, где время для второго выделения было больше, чем первое, когда я отключил подкачку, но по-прежнему включал перераспределение памяти? Действительно ли произошло уплотнение? Если так, то почему я не смог достичь точки, в которой произошло сжатие после того, как я отключил перераспределение памяти?