[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Распределение памяти в JFS

Способ выделения памяти для файлов - это способ, применяемый операционной системой для размещения данных в физической памяти. Ядро выделяет дисковую память для файлов и каталогов в виде логических блоков. Логический блок - это блок данных файла или каталога размером 4096 байт. В действительности логические блоки не создаются на диске, однако для относящихся к ним данных выделяется дисковая память. Любой файл или каталог состоит из логических блоков. В журнализированной файловой системе (JFS) основной единицей физической памяти являются не логические блоки, а фрагменты.

Полные и неполные логические блоки

Файл или каталог может занимать весь логический блок или только его часть. Полный логический блок содержит 4096 байт данных. Неполный логический блок образуется тогда, когда размер файла или каталога не кратен 4096 байтам.

Например, файл размером 8192 байт займет два логических блока. В каждом из них будет содержаться 4096 байт данных. В то же время файл размером 4608 тоже будет состоять из двух логических блоков. При этом второй логический блок будет содержать лишь 512 байт данных файла. Неполным может быть только последний логический блок файла.

Выделение памяти во фрагментированной файловой системе

По умолчанию размер фрагмента равен 4096 байт. Однако во время создания файловой системы с помощью команды mkfs вы можете указать меньший размер фрагмента. Допустимы фрагменты размером 512, 1024, 2048 и 4096 байт. Во всей файловой системе применяется единый размер фрагмента. Дополнительная информация о структуре файловых систем приведена в разделе Структура файловой системы JFS.

Для более эффективной работы с файлами и каталогами, размером более 32 Кб в JFS выделяются фрагменты размером по 4096 байт. Такой фрагмент содержит полный логический блок. При добавлении данных в файл или каталог ядро выделяет для размещения логических блоков дополнительные фрагменты дискового пространства. Таким образом, если в файловой системе размер фрагмента равен 512 байтам, то для размещения полного логического блока потребуется 8 фрагментов.

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

Перемещение фрагментов осуществляется также при добавлении данных в логический блок, соответствующий пустому пространству в файле. Пустое пространство в файле - это "пустой" логический блок, расположенный перед последним логическим блоком с данными. (В каталогах пустых пространств не бывает.) Пустые блоки не записываются на диск. Фрагменты для такого блока выделяются только при заполнении пустого пространства данными. Для логического блока, который ранее не был записан на диск, выделяется фрагмент размером 4096 байт.

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

Для размещения логических блоков файла или каталога JFS всегда пытается выделить непрерывную область дисковой памяти. Это позволяет сократить время поиска, так как данные файла или каталога размещаются в одной области памяти и их можно считывать последовательно. Однако для разных логических блоков не всегда выделяются смежные фрагменты диска. Это связано с тем, что область диска, смежная с одним из фрагментов, может быть уже занята другим файлом или каталогом. Однако фрагменты одного логического блока всегда образуют непрерывную область памяти.

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

Выделение памяти в файловой системе со сжатием данных

В файловой системе со сжатием данных дисковое пространство выделяется для каталогов. Сжатие данных выполняется только для обычных файлов и символьных связей, размер которых превосходит значение, указанное в i-узле.

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

Во фрагментированной файловой системе только последний логический блок файла, размер которого меньше 32 Кб, размещается во фрагменте размером меньше 4096 байт. Такой логический блок называется неполным. В файловой системе со сжатием данных неполными могут быть все логические блоки.

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

Выделение памяти в файловых системах с поддержкой больших файлов

Начиная с AIX версии 4.2, в файловой системе с поддержкой больших файлов для обычных файлов JFS выделяет фрагменты двух типов. "Большие" фрагменты (32 х 4096) выделяются для логических блоков, размер которых превышает 4 Мб. Для всех остальных логических блоков выделяются фрагменты размером 4096 байт. Особые файлы размещаются во фрагментах размером 4096 байт. В такой файловой системе максимальный размер файла составляет около 64 Гб (68 589 453 312).

Большой фрагмент представляет собой 32 смежных фрагмента по 4096 байт. В связи с этим рекомендуется, чтобы в файловых системах с поддержкой больших файлов в основном хранились именно большие файлы. Хранение большого числа маленьких файлов (размер которых меньше 4 Мб) может привести к высокому уровню фрагментации дискового пространства. В результате ENOSPC будет отклонять большое число запросов на выделение памяти, так как в файловой системе невозможно будет выделить 32 свободных смежных фрагмента.

Формат адреса дисковой памяти

Для работы с фрагментами JFS необходима адресация на уровне фрагментов. Адреса дисковой памяти задаются в специальном формате, позволяющем определять расположение фрагментов логического блока на диске. Во фрагментированных файловых системах и в файловых системах со сжатием данных применяется одинаковый формат адресов дисковой памяти. Эти адреса хранятся в поле i_rdaddr i-узлов и в косвенных блоках. Каждый адрес указывает на непрерывную последовательность фрагментов на диске.

Адрес дисковой памяти содержит два поля: nfrags и addr. Эти поля описываются область диска, на которую указывает адрес.

адрес Задает начальный фрагмент последовательности.
nfrags Задает общее число смежных фрагментов, не используемых данным адресом.

Например, если в файловой системе размер фрагмента равен 512 байт, и логический блок занимает 8 фрагментов, то значение nfrags, равное 3, указывает, что адрес идентифицирует 5 фрагментов.

Ниже приведены примеры значений addr и nfrags для различных адресов дисковой памяти. В этих примерах предполагается, что размер фрагмента равен 512 байт, и логический блок занимает 8 фрагментов.

Адрес одного фрагмента:

addr:   143

nfrags: 7

Этот адрес указывает, что данные располагаются на диске, начиная со 143 фрагмента. Значение nfrags указывает, что адрес ссылается только на один фрагмент. В файловой системе с другим размером фрагментов значение nfrags было бы другим. Для правильной интерпретации значения nfrags система или пользователь, вычисляющий адрес, должны знать размер фрагмента в файловой системе.

Адрес пяти фрагментов:

addr:   1117

nfrags: 3

В данном случае адрес задает последовательность фрагментов, которая начинается со 1117 фрагмента на диске и содержит 5 фрагментов (с учетом начального). Значение nfrags указывает, что адрес не ссылается на три фрагмента логического блока.

Размер адреса дисковой памяти представляет собой 32-разрядное число. Биты нумеруются от 0 до 31. Нулевой бит всегда зарезервирован. Биты 1 - 3 содержат значение nfrags. Биты 4 - 31 содержат значение addr.

Косвенные блоки

Косвенные блоки JFS позволяют идентифицировать участки дискового пространства, выделенные для размещения больших файлов. Применение косвенной адресации обеспечивает поддержку файлов различных размеров и повышает эффективность работы с файлами. Косвенный блок указывается в поле i_rindirect i-узла. Существует три способа адресации фрагментов диска, в которых значение этого поля интерпретируется по-разному:

Во всех указанных способах используется тот же формат адреса дисковой памяти, что и во фрагментированной файловой системе. Поскольку для файлов размером больше 32 Кб выделяются фрагменты размером 4096 байт, то поле nfrags в адресах, задаваемых в формате одноуровневой или двухуровневой ссылки, равно 0.

Метод прямой адресации

В этом методе адресации поле i_rdaddr i-узла содержит до 8 адресов фрагментов файла. Максимальный размер файла, размещение которого может быть описано способом прямой адресации, составляет 32 768 байт (32 Кб), т.е. 8 x 4096 байт. Если размер файла превышает 32 Кб, то для описания его размещения на диске применяется косвенная адресация.

Метод одноуровневых ссылок

В этом методе поле i_rindirect содержит адрес косвенного блока первого уровня. Косвенный блок, адрес которого указан в поле i_rindirect, содержит 1024 адреса. Каждый из этих адресов идентифицирует фрагмент файла. Максимальный размер файла, размещение которого может быть описано таким способом, составляет 4 194 304 байт (4 Мб), или 1024 x 4096 байт.

Метод двухуровневых ссылок

В этом методе в поле i_rindirect указывается адрес косвенного блока второго уровня. Этот блок содержит 512 адресов, указывающих на косвенные блоки первого уровня, в которых хранятся адреса фрагментов файла. Максимальный размер файла, размещение которого может быть описано с помощью такого метода в файловой системе без поддержки больших файлов, составляет 2 147 483 648 байт (2 Гб), или 512 х (1024 x 4096) байт.

Примечание: максимальный размер файла (Работа с большими файлами), который поддерживается системными вызовами read и write, составляет 2 Гб - 1 (231-1). При размещении файла в памяти можно обращаться к файлам размером 2 Гб.

Начиная с AIX версии 4.2, в файловых системах с поддержкой больших файлов допускается хранение файлов, размер которых почти достигает 64 Гб (68 589 453 312). В этом случае первый косвенный блок первого уровня содержит адреса фрагментов размером 4096 байт, а все остальные косвенные блоки первого уровня - адреса фрагментов размером 32 X 4096 байт. Максимальный размер файла в файловой системе с поддержкой больших файлов вычисляется по следующей формуле:

(1 * (1024 * 4096)) + (511 * (1024 * 131072))

Для каталогов выделяются фрагменты размером 512 байт. При добавлении данных в каталог для него выделяются дополнительные фрагменты того же размера.

Квоты на дисковую память

Квоты на дисковую память задают объем пространства файловой системы, который может быть предоставлен конкретному пользователю или группе.

quotactl Эта функция устанавливает ограничения на число файлов и блоков диска, которые могут быть выделены в файловой системе одному пользователю или группе. Существуют ограничения двух типов:

жесткие
Задает максимальное значение. Если объем дисковой памяти, выделенной процессу, достиг жесткого ограничения, то запрос на выделение дополнительной памяти будет отклонен.

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

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

Связанная информация

Работа с i-узлами JFS

Создание и удаление файлов

Работа с дескрипторами файлов

Структура файловой системы JFS


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]