Sunday, Feb 05th

Last update12:13:00 PM GMT

Вы находитесь на: FreeBSD Общая информация Управление памятью внутри ядра

Управление памятью внутри ядра

Ядро часто выделяет память, которая нужна лишь на протяжении одного системного вызова. В процессе пользователя такая кратковременная память была бы выделена в стеке времени выполнения. Поскольку у ядра ограниченный стек времени выполнения, нереально выделять в нем блоки памяти даже умеренного размера. Соответственно такая память должна выделяться посредством более динамического механизма. Например, когда система должна преобразовать имя пути, она должна выделить для хранения имени буфер в 1 Кб. Другие блоки памяти должны быть более постоянными, чем один системный вызов, и таким образом, не могут выделяться в стеке, даже если бы там было место. Примером являются управляющие блоки протокола, которые сохраняются на протяжении сетевого соединения.

Требования к динамическому выделению памяти в ядре возросли по мере добавления новых служб. Обобщенный распределитель памяти снижает сложность написания кода внутри ядра. Таким образом, в ядре FreeBSD есть общий распределитель памяти, который может использоваться любой частью системы. У него есть интерфейс, сходный с библиотечными процедурами С malloc() и free(), которые обеспечивают выделение памяти прикладным программам [McKusick & Karels, 1988]. Подобно интерфейсу библиотеки С, процедура выделения принимает параметр, указывающий необходимый размер памяти. Диапазон размеров запрашиваемой памяти не ограничен; однако физическая память выделяется и не подкачивается. Процедура освобождения принимает указатель на освобождаемое хранилище, но не требует размера освобождаемого участка памяти.

Некоторые большие постоянные выделения, такие как, структуры, содержащие сведения о процессе в течении времени его жизни, не очень хорошо обрабатываются общим распределителем памяти. Для таких типов выделений памяти ядро предоставляет распределитель областей. Каждому типу памяти дается своя собственная область, из которой осуществляются все выделения. Память, выделенная в одной области, не может использоваться в другой области или общим распределителем. Семантика интерфейса сходна с распределителем общей памяти; память выделяется из области с помощью процедуры zalloc(), а освобождается с помощью процедуры zfree().


Похожие:
Еще по теме:
Советуем прочитать:

Сейчас 27 гостей онлайн

Реклама на сайте: