Как работает выделение и освобождения памяти для процесса?

Если смотреть на определенном уровне абстракции то все понятно, мы запрашиваем у ОС память она нам выделяет страницы определенного размера и шлет их адреса.

Вопрос как это работает на более глубоком уровне.

  1. Мы запустили новый процесс (прости бинарник скомпилированный), ему ОС уже выделила адреса, в какой момент она их выделила? можем ли мы получить все эти адреса? Для своего внутреннего использования.
  2. После того как мы получили адреса, правильно ли я понимаю что нам больше нет необходимости обращаться к ОС и мы будем брать эти адреса из внутреннего стека уже внутри самой программы это контролировать?
  3. Если в какой то момент мы запускаем сборщик мусора python\golang освобождает ли он память обратно для ОС или он освобождает только внутри приложения для повторного использования? Т.е. фактически он просто возвращает адреса страниц памяти в внутренний стек процесса в котором хранятся адреса куда можно что-то записать?

Ответы (1 шт):

Автор решения: passant

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

Если вы действительно хотите понять принципы, то начинать надо не с вопросов на форуме, а с чтения основополагающих книг. Ну например, уже много поколений программистов учатся по книге

Таненбаум Э., Бос Х. Современные операционные системы

И хоть книга не новая, но принципы они на то и принципы, что не меняются десятилетиями. В общем - ОЧЕНЬ рекомендую.

Далее, когда разберетесь с фундаментаом, нужно смотреть уже как "оно" работает в конкретной ОС. Так, для систем семейства Windows найти можно по ключевому слову WinAPI. Есть описания работы по выделению памяти в Windows системах у разных авторов. Ну например:

Побегайло А.П. Системное программирование в Windows. 
Щупак Ю. А.  Win32 API. Эффективная разработка приложений.
Безруков В.А. Win32 API. Программирование/учебное пособие
Литвиненко Н. А. Технология программирования на С++. Win32 API-приложения. 
Рихтер Дж., Назарр К. Windows via C/C++. Программирование на языке Visual C++
Харт Д.  Системное программирование в среде Windows.

Много чего можно найти на сайте Microsoft. Но в любом случае подчеркну, ни один из приведенных источников вы не поймете, если предварительно не освоите "фундамент". Это я не занудствую, это просто многолетний опыт, как практической работы системного программирования так и преподавания, в том числе и рассматриваемых вопросов.

Поскольку управление памяти - это один из самых внутренних слоев любой ОС, то во первых, что-бы непосредственно посмотреть "что там и как" придется предварительно освоить хакинг. Начиная, с того, как что-то запускать в режиме "ядра". И приципов работы на уровне системных вызовов. Но по крайней мере, в книгах, приведенных выше вы можете (если сумеете) использовать С++. (Потому как изначально доступ был только на уровне ассемблера, потом API немного "подняли"). В общем смотрите источники, а далее - углубляйтесь по мере наличия (или пропажи) интереса.

Что касается Linux/Android и пр. то также попадались аналогичные источники, только попадались они мне уже тогда, когда для меня вопрос утратил актуальность. Но если надо искать - ключевые слова "системный вызов", "(низкоуровневое) управление памятью", "виртуализация памяти" и т.д.

Удачи.

→ Ссылка