что происходит в ядре во время malloc? - PullRequest
42 голосов
/ 19 апреля 2011

Мне задали этот вопрос во время интервью.Они хотели знать, когда пользователь вызывает malloc (4) для выделения 4 байтов памяти, как реагирует операционная система (Linux)?Какая подсистема отвечает на этот системный вызов?

Я сказал ему, что malloc () будет обслуживаться подсистемой управления памятью.Реализация malloc () просматривает список свободной памяти (физической памяти), мы назовем его списком свободной памяти и найдем соответствующий фрагмент, который больше или равен 4 байта.Как только он найдет такой чанк, он будет удален из свободного списка и добавлен в используемый список.Затем эта физическая память будет отображена в структуре кучи процесса vma struct.Похоже, он не был полностью удовлетворен этим ответом. Как система приятелей вписывается в это?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

60 голосов
/ 19 апреля 2011

Когда приложения пользовательского пространства вызывают malloc(), этот вызов не реализован в ядре. Вместо этого это вызов библиотеки (реализован glibc или аналогичный).

Короткая версия заключается в том, что реализация malloc в glibc получает память из системного вызова brk() / sbrk() или анонимную память через mmap(). Это дает glibc большой непрерывный (в отношении адресов виртуальной памяти) участок памяти, который реализация malloc дополнительно нарезает и нарезает на кусочки меньшими порциями и раздает вашему приложению.

Здесь - небольшая реализация malloc, которая даст вам идею, а также множество ссылок.

Обратите внимание, что физическая память еще ничего не беспокоит - это обрабатывается системой виртуальной памяти ядра, когда сегмент данных процесса изменяется с помощью brk() / sbrk() или mmap(), и когда на память ссылается (посредством читать или писать в память).

Подведем итог:

  1. malloc() выполнит поиск в своих управляемых фрагментах памяти, чтобы определить, есть ли фрагмент неиспользуемой памяти, удовлетворяющий требованиям выделения.
  2. В противном случае malloc() попытается расширить сегмент данных процесса (через sbrk() / brk() или в некоторых случаях mmap()). sbrk() попадает в ядро.
  3. Вызовы brk() / sbrk() в ядре корректируют некоторые смещения в struct mm_struct процесса, поэтому сегмент данных процесса будет больше. Сначала не будет физической памяти, сопоставленной с дополнительными виртуальными адресами, которые дает расширение сегмента данных.
  4. При первом прикосновении к этой неотображенной памяти (вероятно, для чтения / записи реализацией malloc) обработчик сбоев включается и перехватывает ядро, где ядро ​​назначает физическую память неподписанной памяти.
10 голосов
/ 19 апреля 2011

В вашем ответе есть ошибка - malloc не напрямую имеет дело с физической памятью. Он имеет дело с страничной виртуальной памятью - хотя я не уверен, верно ли это для каждой существующей архитектуры.

Когда ваша программа пытается выделить память и свободный список не содержит порцию равного или большего размера, чем запрошенный размер, выделяется вся новая страница. Размер страницы зависит от архитектуры (4096 байт на x86). Распределение страниц - это то, что может выполнять только ядро, поэтому malloc вызов может вызвать системный вызов. Затем новый адрес добавляется в свободный список, и malloc управляет свободным списком в соответствии с его реализацией (например, проверьте glibc).

...