В ОС за распределение информации между оперативной памятью и вторичными устройствами хранения отвечает подсистема управления памятью ядра.
Основная (оперативная) память всегда была критическим ресурсом. Поэтому первичной функцией всех ОС было обеспечение разделения основной памяти между конкурирующими процессами. ОП представлена в виде последовательности байтов, каждый из которых имеет свой уникальный адрес, называемый физическим адресом. Эти адреса использует процессор. Если бы процесс во время выполнения использовал физические адреса возникли следующие проблемы:
- защиты адресных пространств процессов
- распределения существующего адресного пространства (каждый процесс должен занимать непрерывную и непересекающуюся последовательность адресов)
- ограничивает число процессов, работающих в системе (если исчерпается весь объем ОП, больше процессов запустить будет нельзя)
Многозадачная ОС должна обеспечивать:
1. Выполнение программ, размер которых больше, чем объем физической памяти. В идеале система должна обеспечить выполнять программы любого размера;
2. Выполнение частично загруженных программ. Это уменьшает время их первоначальной загрузки;
3. Размещение в памяти одновременно более чем одной программы. Это увеличивает коэффициент использования процессора;
4. Возможность выполнения перемещаемых в памяти программ, которые могут располагаться в любом месте памяти и перемещаться из одного места в другое в течение выполнения;
5. Поддержку совместного использования ресурсов, например, если два процесса загружают одну и ту же программу, они должны иметь возможность использовать сообща ее код.
Система виртуальной памяти как раз и решает поставленные задачи. Приложению становится доступен большой объем памяти, хотя реально компьютер может иметь совсем мало оперативной памяти. ВП состоит из двух частей – ОП и области подкачки – свопинга – дискового пространства, где могут сохраняться временно не используемые участки процесса.
Рисунок 4.1 – Преобразование страниц
Ядро взаимодействует с блоком управления памятью (memory management unit, MMU), который отвечает за получение данных из оперативной памяти и помещение данных в нее.
Требования к системе виртуальной памяти:
1) управление адресным пространством. Ядро должно выделять адресное пространство процессу на этапе выполнения fork и освобождать его при вызове exit. Если процесс производит системный вызов exec, ядро переписывает его старое адресное пространство кодом новой программы. Другие важные операции в адресном пространстве подразумевают изменение областей данных или стека, а также добавление новых областей (например, разделяемой памяти);
2) преобразование адресов. При выполнении любой инструкции, производящей доступ к памяти, необходимо подставлять вместо виртуальных адресов физические адреса оперативной памяти;
3) управление физической памятью. Память необходима как самой ОС, так и прикладным процессам. Суммарное адресное пространство всех активных процессов системы, как правило, превышает объем физической памяти, в которой может находиться лишь ограниченный набор данных;
4) защита памяти. ОС должна защищать свои коды и данные от прикладных процессов. В противном случае пользовательская программа может случайно (или специально) повредить ОС. Процессы не должны иметь доступ к страницам, относящимся к другим процессам. Часть адресного пространства процесса должна быть защищена даже от него самого. Например, область кода процесса защищена от записи, иначе процесс может повредить сам себя;
5) разделение памяти. Необходимо обеспечить взаимодействие процессов. Например, все процессы одной программы могут разделять между собой единственную копию кода программы. Процессы могут совместно использовать области памяти вместе с другими взаимодействующими процессами. Коды стандартных библиотек можно разделять таким образом. Приведенные примеры относятся к совместному использованию ресурсов на высоком уровне. Но существует и вариант разделения на низком уровне, относящийся к отдельным страницам памяти. Например, после выполнения fork предок и потомок могут разделять между собой единственную копию страниц данных и стека до тех пор, пока процессы не попытаются внести в них изменения.
6) отслеживание загрузки системы. Страничная система должна удовлетворять потребности активных процессов, но это ей удается не всегда. Может получиться так, что процессы не получат достаточного количества памяти для размещения своих активных страниц и в результате этого не смогут выполняться дальше. Загруженность страничной системы зависит от общего числа и размеров адресных пространств активных процессов, а также от конфигурации памяти. ОС должна следить за страничной подсистемой с целью обнаружения таких ситуаций и уметь их разрешать. Например, в случае перегрузки система может запретить выполнения новых процессов или завершить выполнение некоторых выполняющихся процессов.
За поддержку виртуальной памяти приходится расплачиваться:
Во-первых, таблицы трансляции адресов и другие структуры данных, создаваемые для управления памятью, надо тоже хранить в памяти, а из-за этого уменьшаются количество физической памяти, доступное программам;
Во-вторых ко времени выполнения каждой инструкции прибавляются затраты на преобразование адресов. Если процесс пытается получить доступ к странице, не загруженной в основную память, то система поместит эту страницу в оперативную память, а это потребует относительно медленных операций дискового ввода-вывода. Все действия с памятью занимают значительную часть процессорного времени (примерно 10% на загруженных системах).