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

Страничная организация памяти, таблица страниц и TLB, алгоритмы замещения страниц, пробуксовка, устройство файловых систем FAT, NTFS, ext4, журналирование.

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

Виртуальные и физические адреса

Каждый процесс видит собственное непрерывное адресное пространство.
Преобразование адреса выполняет блок управления памятью (MMU):

  Виртуальный адрес = [номер страницы | смещение]
  Физический адрес  = [номер кадра   | смещение]

При размере страницы 4 КБ смещение занимает 12 бит (2¹² = 4096).
Для 32-разрядного адреса на номер страницы остаётся 20 бит → 1 048 576 страниц.

Таблица страниц хранит соответствие «номер виртуальной страницы → номер физического кадра» плюс биты состояния: присутствия, изменения (dirty), обращения, прав доступа.

Буфер трансляции TLB

Обращение к таблице страниц в памяти удвоило бы время каждого доступа. Поэтому последние преобразования кэшируются в TLB — небольшой ассоциативной памяти внутри процессора.

Среднее время доступа:

  t = h·(t_TLB + t_память) + (1 − h)·(t_TLB + 2·t_память)

h — доля попаданий в TLB, на практике 0,98…0,99

Пример: t_TLB = 1 нс, t_память = 100 нс, h = 0,98
  t = 0,98·101 + 0,02·201 = 99 + 4 = 103 нс
  Накладные расходы всего 3 % вместо двукратного замедления.
Переключение контекста сбрасывает TLB: новый процесс имеет другое отображение адресов. Именно это делает переключение процессов дороже переключения потоков — потоки одного процесса делят адресное пространство и TLB остаётся действительным.

Отказ страницы и подкачка

  1. Процесс обращается к адресу, страница которого не загружена в память.
  2. MMU обнаруживает сброшенный бит присутствия и вызывает прерывание — page fault.
  3. Операционная система находит свободный кадр; если свободных нет, выбирает жертву алгоритмом замещения.
  4. Если страница-жертва изменялась (бит dirty), её записывают в файл подкачки.
  5. Нужная страница читается с диска в освободившийся кадр, таблица обновляется.
  6. Команда, вызвавшая отказ, выполняется повторно.
Алгоритм замещенияПринципСвойства
FIFOВытесняет загруженную раньше всехПрост, но возможна аномалия Билэди
Optimal (OPT)Вытесняет ту, что понадобится позже всехНедостижим, служит эталоном сравнения
LRUДавно не использовавшаясяХорош, но дорог в точной реализации
Clock (второй шанс)FIFO с проверкой бита обращенияПрактический компромисс, применяется в реальных ОС
NFU / LFUРеже всего использовавшаясяПлохо реагирует на смену фазы работы программы
Аномалия Билэди: у FIFO увеличение числа кадров памяти может увеличить количество отказов страниц. Это контринтуитивно и потому любимый вопрос на экзамене; у LRU и OPT такого не бывает.

Пробуксовка

Если процессам суммарно не хватает памяти, система начинает тратить почти всё время на подкачку: страница вытесняется и тут же требуется снова. Загрузка процессора падает, диск работает непрерывно — это состояние называют пробуксовкой (thrashing).

Файловые системы

ФСУчёт размещенияМаксимум файлаЖурналГде применяется
FAT32Таблица связных списков кластеров4 ГБНетФлешки, совместимость
exFATУлучшенная FAT16 ЭБНетКарты памяти большого объёма
NTFSB-дерево, главная таблица MFT16 ТБДаWindows
ext4Экстенты, B-деревья16 ТБДаLinux
APFSКопирование при записи8 ЭБДаmacOS
ZFS / BtrfsКопирование при записи, контроль целостностиОгромныйДаСерверы, хранилища

Как хранится файл

Внутренняя фрагментация:

Файл 5 КБ при размере кластера 4 КБ занимает 2 кластера = 8 КБ
Потеряно 3 КБ, то есть 37 %

10 000 мелких файлов по 1 КБ при кластере 4 КБ
→ занято 40 МБ вместо 10 МБ

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

Журналирование

Запись файла состоит из нескольких операций: обновить данные, изменить размер, поправить время. Сбой питания между ними оставит файловую систему в противоречивом состоянии. Журнал решает проблему: сначала намерение записывается в журнал, затем выполняется, затем запись из журнала удаляется. После сбоя система по журналу либо докатывает, либо откатывает незавершённую операцию.

Режим ext4Что журналируетсяСкоростьНадёжность
journalМетаданные и данныеНижеМаксимальная
orderedМетаданные, данные пишутся раньшеСредняяПо умолчанию, разумный компромисс
writebackТолько метаданныеВышеВозможен мусор в файле после сбоя

Права доступа и связи

ls -l
# -rw-r--r--  1 user group  1024 Aug 17 10:00 report.txt
#  ↑↑↑ ↑↑↑ ↑↑↑
#  владелец / группа / остальные

chmod 644 report.txt      # rw- r-- r--
chmod 755 script.sh       # rwx r-x r-x
chmod u+x script.sh       # добавить право выполнения владельцу

ln    original.txt hard.txt    # жёсткая ссылка: тот же inode
ln -s original.txt soft.txt    # символическая: отдельный файл с путём

stat report.txt           # inode, размер, время доступа и изменения
df -h                     # свободное место
du -sh /var/log           # размер каталога

Жёсткая ссылка — второе имя того же inode: удаление одного имени не удаляет данные, пока есть другие ссылки. Символическая ссылка хранит путь и превращается в «битую», если цель удалить. Это различие часто спрашивают на лабораторных по операционным системам.

Частые вопросы

Зачем нужен файл подкачки, если памяти достаточно?

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

Почему копирование множества мелких файлов идёт медленнее одного большого?

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

Нужна ли дефрагментация в ext4 и NTFS?

В ext4 практически нет: экстенты и отложенное выделение блоков сами противодействуют фрагментации. NTFS фрагментируется заметнее, но на SSD дефрагментация вредна — она изнашивает ячейки без выигрыша в скорости.

Читайте также

Сделаем работу по этой теме

Опишите задачу — ответим в течение 15 минут в личных сообщениях ВКонтакте, назовём срок и цену. Предоплаты за оценку нет.

  • Оценка заявки бесплатно
  • Правки по замечаниям преподавателя
  • Работы по всем техническим и IT-дисциплинам

Нажимая кнопку, вы соглашаетесь на обработку указанных данных для ответа на заявку.