В операционных системах управление памятью — это функция, отвечающая за управление основной памятью компьютера . [1] : 105–208
Функция управления памятью отслеживает статус каждой ячейки памяти, выделенной или свободной . Она определяет, как память распределяется между конкурирующими процессами, решая, какие получают память, когда они ее получают и сколько им разрешено. Когда память выделяется, она определяет, какие ячейки памяти будут назначены. Она отслеживает, когда память освобождается или не выделяется , и обновляет статус.
Это отличается от управления памятью приложений , при котором процесс управляет памятью, выделенной ему операционной системой.
Одиночное выделение — простейший метод управления памятью. Вся память компьютера, обычно за исключением небольшой части, зарезервированной для операционной системы, доступна одному приложению. MS-DOS — пример системы, которая выделяет память таким образом. Встроенная система, работающая с одним приложением, также может использовать этот метод.
Система, использующая единое непрерывное распределение, может по-прежнему выполнять многозадачность , обмениваясь содержимым памяти для переключения между пользователями. Ранние версии операционной системы MUSIC использовали эту технику.
Разделенное распределение разделяет первичную память на несколько разделов памяти , обычно смежных областей памяти. Каждый раздел может содержать всю информацию для определенного задания или задачи . Управление памятью заключается в выделении раздела заданию при его запуске и его отмене при завершении задания.
Разделенное распределение обычно требует некоторой аппаратной поддержки, чтобы задания не мешали друг другу или операционной системе. IBM System/360 использует технику «замок и ключ» . UNIVAC 1108 , PDP-6 и PDP-10 , а также серии GE-600 используют базовые и граничные регистры для указания диапазонов доступной памяти.
Разделы могут быть либо статическими , которые определяются при начальной загрузке программы (IPL) или во время загрузки , либо оператором компьютера , либо динамическими , которые автоматически создаются для определенной работы. Мультипрограммирование операционной системы IBM System/360 с фиксированным числом задач (MFT) является примером статического разбиения на разделы, а мультипрограммирование с переменным числом задач (MVT) — примером динамического. MVT и его последователи используют термин «регион», чтобы отличать динамические разделы от статических в других системах. [2]
Разделы могут быть перемещаемыми с базовыми регистрами, как в UNIVAC 1108, PDP-6 и PDP-10, а также в серии GE-600. Перемещаемые разделы могут быть сжаты для предоставления больших фрагментов непрерывной физической памяти. Сжатие перемещает «используемые» области памяти для устранения «дыр» или неиспользуемых областей памяти, вызванных завершением процесса, для создания больших непрерывных свободных областей. [3]
Некоторые системы позволяют выгружать разделы на вторичное хранилище для освобождения дополнительной памяти. Ранние версии IBM Time Sharing Option (TSO) выгружали пользователей из разделов с разделением времени и обратно . [4] [a]
Страничное распределение делит основную память компьютера на блоки фиксированного размера, называемые страничными фреймами , а виртуальное адресное пространство программы — на страницы того же размера. Аппаратный блок управления памятью сопоставляет страницы с фреймами. Физическая память может быть выделена на основе страниц, в то время как адресное пространство выглядит непрерывным.
Обычно, при управлении страничной памятью, каждое задание выполняется в своем собственном адресном пространстве. Однако существуют некоторые операционные системы с одним адресным пространством , которые выполняют все процессы в одном адресном пространстве, например, IBM i , которая выполняет все процессы в большом адресном пространстве, и IBM OS/VS1 и OS/VS2 (SVS) , которые выполняют все задания в одном виртуальном адресном пространстве размером 16 МБ.
Страничная память может быть подкачана по требованию , когда система может перемещать страницы по мере необходимости между первичной и вторичной памятью.
Сегментированная память — единственный метод управления памятью, который не предоставляет программе пользователя «линейное и непрерывное адресное пространство». [1] : 165 Сегменты — это области памяти, которые обычно соответствуют логической группировке информации, такой как процедура кода или массив данных. Сегменты требуют аппаратной поддержки в виде таблицы сегментов , которая обычно содержит физический адрес сегмента в памяти, его размер и другие данные, такие как биты защиты доступа и статус (выгружен, выгружен и т. д.)
Сегментация обеспечивает лучшую защиту доступа, чем другие схемы, поскольку ссылки на память относятся к определенному сегменту, и оборудование не позволит приложению ссылаться на память, не определенную для этого сегмента.
Можно реализовать сегментацию с подкачкой страниц или без нее. Без поддержки подкачки сегмент — это физическая единица, которая при необходимости выгружается из памяти и в нее. С поддержкой подкачки страницы обычно являются единицей подкачки, а сегментация только добавляет дополнительный уровень безопасности.
Адреса в сегментированной системе обычно состоят из идентификатора сегмента и смещения относительно базового адреса сегмента, определяемого как смещение, равное нулю.
Архитектура Intel IA-32 (x86) позволяет процессу иметь до 16 383 сегментов размером до 4 ГиБ каждый. Сегменты IA-32 являются подразделениями линейного адресного пространства компьютера , виртуального адресного пространства, предоставляемого оборудованием страничного обмена. [5]
Операционная система Multics , вероятно, является самой известной системой, реализующей сегментированную память. Сегменты Multics являются подразделениями физической памяти компьютера размером до 256 страниц, каждая страница имеет размер 1К 36-битных слов, что приводит к максимальному размеру сегмента в 1МиБ (с 9-битными байтами, как в Multics). Процесс может иметь до 4046 сегментов. [6]
Раскатка/раскатка (RO/RI) — это метод управления памятью операционной системы компьютера, при котором весь неразделяемый код и данные работающей программы выгружаются во вспомогательную память (диск или барабан), чтобы освободить основное хранилище для другой задачи. Программы могут быть выкачены «по требованию или... при ожидании какого-то длительного события». [7] Раскатка/раскатка обычно использовалась в системах с разделением времени , [8] где «время раздумий» пользователя было относительно долгим по сравнению со временем, необходимым для выполнения замены.
В отличие от виртуального хранилища — подкачки или сегментации, разворот/разворот не требует специального оборудования для управления памятью; однако, если в системе нет оборудования для перемещения, такого как карта памяти или регистры базы и границ , программа должна быть откачена обратно в исходные ячейки памяти. Разворот/разворот был в значительной степени вытеснен виртуальной памятью.
Развертывание/развертывание было дополнительной функцией мультипрограммирования OS/360 с переменным числом задач (MVT)
Развертывание/развертывание позволяет временное, динамическое расширение определенного задания за пределы его изначально указанного региона. Когда заданию требуется больше места, развертывание/развертывание пытается получить нераспределенное хранилище для использования заданием. Если такого нераспределенного хранилища нет, другое задание разворачивается, т. е. переносится во вспомогательное хранилище, так что его регион может использоваться первым заданием. После освобождения первым заданием это дополнительное хранилище снова становится доступным, либо (1) как нераспределенное хранилище, если оно было его источником, либо (2) для получения задания, которое должно быть передано обратно в основное хранилище (развернуто). [9]
В OS/360 развертывание/свертывание использовалось только для пакетных заданий, а свертывание не происходило до тех пор, пока не завершится этап задания, заимствующий регион.