Ядро часто выделяет память, которая нужна лишь на протяжении одного системного вызова. В процессе пользователя такая кратковременная память была бы выделена в стеке времени выполнения. Поскольку у ядра ограниченный стек времени выполнения, нереально выделять в нем блоки памяти даже умеренного размера. Соответственно такая память должна выделяться посредством более динамического механизма. Например, когда система должна преобразовать имя пути, она должна выделить для хранения имени буфер в 1 Кб. Другие блоки памяти должны быть более постоянными, чем один системный вызов, и таким образом, не могут выделяться в стеке, даже если бы там было место. Примером являются управляющие блоки протокола, которые сохраняются на протяжении сетевого соединения.
Требования к динамическому выделению памяти в ядре возросли по мере добавления новых служб. Обобщенный распределитель памяти снижает сложность написания кода внутри ядра. Таким образом, в ядре FreeBSD есть общий распределитель памяти, который может использоваться любой частью системы. У него есть интерфейс, сходный с библиотечными процедурами С malloc() и free(), которые обеспечивают выделение памяти прикладным программам [McKusick & Karels, 1988]. Подобно интерфейсу библиотеки С, процедура выделения принимает параметр, указывающий необходимый размер памяти. Диапазон размеров запрашиваемой памяти не ограничен; однако физическая память выделяется и не подкачивается. Процедура освобождения принимает указатель на освобождаемое хранилище, но не требует размера освобождаемого участка памяти.
Некоторые большие постоянные выделения, такие как, структуры, содержащие сведения о процессе в течении времени его жизни, не очень хорошо обрабатываются общим распределителем памяти. Для таких типов выделений памяти ядро предоставляет распределитель областей. Каждому типу памяти дается своя собственная область, из которой осуществляются все выделения. Память, выделенная в одной области, не может использоваться в другой области или общим распределителем. Семантика интерфейса сходна с распределителем общей памяти; память выделяется из области с помощью процедуры zalloc(), а освобождается с помощью процедуры zfree().
- 12/05/2010 18:13 - Устройства
- 12/05/2010 12:32 - Управление дескрипторами
- 12/05/2010 04:44 - Каналы 4.2BSD
- 11/05/2010 21:23 - Дескрипторы и ввод/вывод
- 11/05/2010 10:33 - Система ввода/вывода
- 10/05/2010 20:06 - Отдельные отображения файла
- 10/05/2010 11:56 - Проектные решения по управлению памятью BSD
- 10/05/2010 05:46 - Управление памятью
- 09/05/2010 22:28 - Группы процессов и сеансы
- 09/05/2010 13:03 - Сигналы