Внутренняя фрагментация¶
Внутренняя фрагментация — это явление в компьютерных системах, при котором выделенная область памяти оказывается больше, чем запрошенный процессом или файлом объём данных, что приводит к неиспользуемому пространству внутри этой области. В контексте управления памятью операционной системы внутренняя фрагментация возникает при использовании схем распределения фиксированными блоками (разделами), когда программа не может полностью заполнить выделенный ей блок, и часть памяти остаётся пустой. В файловых системах внутренняя фрагментация связана с неполным заполнением последнего кластера файла. Явление противопоставляется внешней фрагментации, при которой свободная память разбита на мелкие несмежные участки, не позволяющие выделить большой блок.
¶Причины возникновения
¶Управление памятью
В операционных системах, использующих сегментацию или страничную организацию памяти, внутренняя фрагментация возникает из-за того, что память выделяется блоками фиксированного размера (страницами или сегментами). Если процесс запрашивает объём, не кратный размеру блока, последний блок оказывается частично заполненным. Например, при размере страницы 4 КБ и запросе процесса на 10 КБ будет выделено 3 страницы (12 КБ), из которых 2 КБ останутся неиспользованными внутри третьей страницы. Это пространство недоступно для других процессов, пока текущий процесс не освободит всю выделенную область.
¶Файловые системы
В файловых системах внутренняя фрагментация связана с кластеризацией. Файловая система разбивает дисковое пространство на кластеры фиксированного размера (например, 4 КБ, 8 КБ или 16 КБ). Если файл имеет размер, не кратный размеру кластера, последний кластер заполняется не полностью. Например, файл размером 5 КБ при кластере 4 КБ займёт 2 кластера (8 КБ), из которых 3 КБ будут пустовать. Эта потеря называется «остатком» или «слэком» (slack space).
¶Сравнение с внешней фрагментацией
Внутренняя фрагментация отличается от внешней тем, что неиспользуемая память находится внутри выделенных блоков, а не между ними. Внешняя фрагментация характерна для динамического распределения памяти переменными блоками, когда после многократных выделений и освобождений образуются мелкие свободные участки, которые невозможно объединить для удовлетворения крупного запроса. Внутренняя фрагментация, напротив, возникает при статическом или фиксированном выделении, когда размер блока задан заранее.
¶Классификация по типам систем
¶В операционных системах
- Страничная память: внутренняя фрагментация возникает в последней странице процесса. Размер страницы варьируется от 512 байт до 64 КБ в разных архитектурах; чем больше страница, тем выше потенциальные потери.
- Сегментная память: при сегментации сегменты имеют переменную длину, поэтому внутренняя фрагментация минимальна, но может возникать, если сегмент выравнивается по границе блока.
- Схемы с фиксированными разделами: в ранних ОС (например, IBM OS/360) память делилась на разделы фиксированного размера, и процесс занимал целый раздел, даже если требовал меньше. Это приводило к значительной внутренней фрагментации.
¶В файловых системах
- FAT (File Allocation Table): использует кластеры фиксированного размера; внутренняя фрагментация зависит от размера кластера. Для дисков большого объёма размер кластера может достигать 64 КБ, что увеличивает потери.
- NTFS (New Technology File System): размер кластера по умолчанию — 4 КБ для дисков до 16 ТБ, но может быть изменён. Внутренняя фрагментация в NTFS незначительна для большинства файлов, но проявляется для большого числа мелких файлов.
- ext4 (Fourth Extended File System): в Linux используется аналогичный принцип; внутренняя фрагментация минимизируется за счёт поддержки экстентов и субблоков.
¶Влияние на производительность
Внутренняя фрагментация приводит к неэффективному использованию памяти и дискового пространства. В оперативной памяти это может снизить количество одновременно выполняемых процессов, так как часть памяти остаётся недоступной. В файловых системах внутренняя фрагментация уменьшает полезную ёмкость диска: например, при кластере 4 КБ и миллионе файлов среднего размера 1 КБ потери составят около 3 ГБ.
Однако внутренняя фрагментация может улучшить производительность за счёт упрощения управления памятью. Фиксированные блоки позволяют быстрее выделять и освобождать память, чем динамические схемы, требующие дефрагментации. В файловых системах большие кластеры уменьшают количество операций ввода-вывода, так как данные читаются блоками.
¶Методы уменьшения
¶В операционных системах
- Уменьшение размера страницы: снижает потери в последней странице, но увеличивает количество страниц и накладные расходы на таблицы страниц.
- Использование сегментации с подкачкой: комбинирует сегменты и страницы, позволяя выделять память более гибко.
- Динамическое выделение блоков переменного размера: применяется в современных ОС (например, в куче (heap) в пользовательском пространстве), где внутренняя фрагментация минимизируется за счёт точного соответствия запросу.
¶В файловых системах
- Выбор оптимального размера кластера: для дисков с большим количеством мелких файлов рекомендуется кластер 512 байт или 1 КБ, для крупных файлов — 4 КБ или 8 КБ.
- Использование субблоков (sub-block allocation): в ext4 и Btrfs мелкие файлы могут занимать часть кластера, а остаток используется другими файлами.
- Сжатие на уровне файловой системы: в NTFS и ZFS сжатие уменьшает объём данных, сокращая количество неиспользуемого пространства в кластерах.
- Дефрагментация: в некоторых файловых системах (например, FAT) дефрагментация может уменьшить внутреннюю фрагментацию за счёт переупаковки файлов, но не устраняет её полностью.
¶Примеры
- Операционная система Linux: при размере страницы 4 КБ процесс, запрашивающий 1 байт, получает целую страницу, что даёт 4095 байт внутренней фрагментации. Для множества мелких процессов (например, сотен фоновых задач) потери могут быть значительными.
- Файловая система FAT32: на диске объёмом 32 ГБ размер кластера по умолчанию — 16 КБ. Файл размером 1 байт занимает 16 КБ, создавая 16383 байта внутренней фрагментации.
- Виртуальная память: в системах с гипервизорами (например, VMware) внутренняя фрагментация может возникать при выделении гостевой ОС фиксированных блоков памяти, не совпадающих с размером страниц хоста.
¶Критика и ограничения
Концепция внутренней фрагментации критикуется за то, что она не учитывает динамику современных систем. В многозадачных ОС с виртуальной памятью внутренняя фрагментация в страницах часто компенсируется за счёт подкачки и свопинга, а потери в последней странице обычно не превышают 50 % от размера страницы. В файловых системах с развитыми механизмами (например, copy-on-write в Btrfs) внутренняя фрагментация может быть частично устранена за счёт перераспределения данных. Однако в системах реального времени и встраиваемых устройствах, где память ограничена, внутренняя фрагментация остаётся критической проблемой, требующей тщательного выбора размера блоков.
¶Источники
- Таненбаум Э., Бос Х. «Современные операционные системы». 4-е изд. — СПб.: Питер, 2015.
- Сильбершатц А., Гэлвин П., Гэгн Г. «Операционные системы: концепции и проектирование». 9-е изд. — М.: Вильямс, 2013.
- Карп Д. «Файловые системы: структура и алгоритмы». — М.: ДМК Пресс, 2018.
- Документация Linux Kernel: «Memory Management» (kernel.org).
- Microsoft Docs: «NTFS Overview» (learn.microsoft.com).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


