Распределение и отслеживание переменных - PullRequest
0 голосов
/ 01 марта 2019

Я начал искать и читать об ALDS и управлении памятью недавно после того, как у меня возникло сомнение в распределении памяти, и после нескольких дней обучения я узнал много вещей об управлении памятью, но фактические сомнения остаются нерешенными.

Таким образом, сомнение заключается в том, что при выделении памяти для переменной, как именно система узнает, какой блок памяти доступен, а какой свободен, и точно так же, когда мы разрушаем объект или устанавливаем переменную как ноль, или когда GC освобождаетсянекоторая память, что именно он делает с этим блоком памяти, как Я знаю, что фактические данные никогда не стираются при удалении, этот блок просто помечается как свободный где-то в некоторой таблице, но эта таблица отслеживает каждую икаждый бит в памяти, если да, то не станет ли это большим количеством данных для хранения?

Например, если я объявлю связанный список, то блок будет выделен в куче, а следующий блок будет иметь нулевое значение, так как нет другого узла для ссылки, теперь, когда я продолжаю добавлять в него больше узловСистема будет продолжать выделять больше блоков, каждый из которых содержит ссылку на следующий.Теперь эти блоки могут присутствовать в случайных местах в зависимости от доступности памяти во время выделения, и доступ к ним возможен только через их исходящие узлы.

Итак, теперь для любого данного блока памяти, как система будет знатьесли он свободен и содержит только мусорное значение, или это фактически узел какого-либо связанного списка.

1 Ответ

0 голосов
/ 02 марта 2019

В современной операционной системе процесс имеет логическое, линейное адресное пространство.Часть этого адресного пространства зарезервирована для системы и является общей для всех процессов.Некоторая часть адресного пространства может быть зарезервирована, но большая часть оставшейся части доступна для процесса.

Адресное пространство определяется PAGE TABLES.Структура таблицы страниц определяется процессором, но операционная система поддерживает таблицу для каждого процесса.Память выделяется процессу в СТРАНИЦАХ.Наименьшее, что мне известно, составляет 512 байт, но размер может достигать мегабайта или даже больше в некоторых процессорах и некоторых конфигурациях процессора. Размер всегда равен степени 2.

Таблица страниц определяет:

  1. Была ли страница действительно отображена в процессе
  2. Имеет ли страница соответствующее местоположение в физической памяти
  3. Если это так, отображение в это физическое местоположение.

Там операционная система знает только о страницах.

На следующем уровне внизу находятся менеджеры памяти.Они не являются частью операционной системы.Менеджеры памяти управляют кучами, которые состоят из страниц, выделенных операционной системой.Управление памятью должно отслеживать размер кучи и то, какая память была выделена в ней.

Работа менеджеров памяти - это огромное количество разных способов.Существует множество реализаций malloc / free, которые вы можете связать со своим кодом, чтобы получить различное поведение.

...