Поддержка сегментного способа организации виртуальной памяти кратко

Обновлено: 04.07.2024

Сегментная организация памяти – это один из способов организации виртуальной памяти. Транслятор подготавливает задачу в виде совокупности сегментов, в общем случае разного размера. Эти сегменты хранятся во внешней памяти. Адресация внутри сегментов носит непрерывный характер. Виртуальные адреса, после трансляции, имеют вид – (s,d), где s – виртуальный номер сегмента, а d – смещение относительно начала сегмента. Предполагается, что в общем случае, при первоначальной загрузке сегментов задачи в оперативную память, не все из них могут попасть в неё, и часть сегментов задачи может остаться во внешней памяти. Отображение виртуальных адресов в физические происходит на этапе выполнения задачи и имеет вид (см. рис.):

Рг. начального адреса

При загрузке задачи в оперативную память, ОС, совместно с аппаратурой, создаёт в памяти таблицу дескрипторов сегментов задачи. Первоначально дескрипторы сегментов задачи создаются на этапе её трансляции. Каждый дескриптор имеет поля, содержимое которых может изменяться во время выполнения задачи. На рис. показаны некоторые из них:

- Pr – битовый признак присутствия/отсутствия сегментов в оперативной памяти (0 – сегмент отсутствует в памяти, 1 – сегмент присутствует в памяти);

- A – начальный адрес сегмента;

- R – размер сегмента.

В специальном регистре процессора хранится значение начального адреса таблицы дескрипторов сегментов выполняемой задачи. При переключении на выполнение новой задачи ОС меняет содержимое этого регистра. Отображение виртуальных адресов в физические адреса производится в два этапа. На первом этапе определяется адрес конкретного дескриптора в таблице путем сложения начального адреса таблицы, хранящегося в регистре, и значения S. Если сегмент отсутствует в памяти (pr=0), то генерируется соответствующее прерывание и вызывается программа подкачки сегмента (своппинг). На втором этапе определяется значение физического адреса путём сложения значений A и I. Перед выполнением этой операции выполняется проверка условия I

Алгоритм работы семафорных примитивов P и V для двоичных семаров может выглядеть следующим образом:

P(S): if S=1 then S:=0

V(S): if (S=0) and (L>0) then

Здесь L – длина очереди заблокированных процессов.

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

P1: while true do begin

P2: while true do begin

Предположим, что первым начнёт выполняться процесс Р1. Прежде чем войти в свой критический интервал (CS1), он вызовет операцию P(s). После её выполнения значение числового поля семафора станет равным нулю, но Р1 войдёт в свой критический интервал. Если в этот момент процесс Р2 получит управление и захочет войти в свой критический интервал (CS2), он сначала вызовет выполнение операции P(s) и заблокируется по семафору s. Если через некоторое время процесс Р1 опять получит управление и выполнит свой критический интервал до конца, а также вызовет операцию V(s), процесс Р2 деблокируется и сможет войти в свой критический интервал. Задача взаимного исключения будет решена, так как только один из двух процессов будет находиться в своём критическом интервале.

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

19. Почтовые ящики.

При реализации почтовых ящиков используются низкоуровневые средства, например - семафорные примитивы и т. п.

Рассмотрим интерфейс операций с двунаправленным почтовым ящиком, которые могут использовать процессы при своём взаимодействии:

4. Wait_answer (result, answer, buffer) – блокирует процесс, выдавший данную операцию до тех пор, пока в почтовом ящике не появится ответ и не перепишется в собственную память процесса (answer). Значение переменной result определяет, каков ответ: от процесса получателя или пустой от ОС.

20. Мониторы Хоара.

Монитор – это пассивный набор разделяемых переменных и повторно входимых процедур доступа к ним, которым процессы пользуются в режиме разделения, причём в каждый момент времени им может пользоваться только один процесс. Монитор можно представить как комнату, от которой есть только один ключ. Если какой-то процесс намеревается воспользоваться этой комнатой и ключ находится снаружи, то этот процесс может отпереть комнату, войти в неё и воспользоваться одной из процедур монитора. Если ключа снаружи нет, то процессу придется ждать, пока тот, кто пользуется комнатой в данный момент, не выйдет из неё и не отдаст ключ. Кроме того, никому не разрешается в комнате оставаться навсегда.

Рассмотрим, например, некоторый ресурс, который выделяет соответствующий планировщик. Каждый раз, когда процесс желает получить этот ресурс, он должен обратиться к планировщику. Процедуру планировщик разделяют все процессы, и каждый из них может обратиться к планировщику в любой момент. Но планировщик не в состоянии обслуживать более одного процесса одновременно. Такая процедура планировщик представляет собой пример монитора.

Внутренние переменные монитора могут быть либо глобальными (используемыми всеми процедурами монитора), либо локальными (используемыми только в своих процедурах). Обращение к этим переменным возможно только изнутри монитора. При первом обращении к монитору инициализируются начальные значения переменных. При последующих обращениях используются те значения переменных, которые остались от предыдущего обращения.

Если процесс обращается к некоторой процедуре монитора и обнаруживается, что соответствующий ресурс уже занят, эта процедура монитора выдаёт команду WAIT с указанием условия ожидания. В этом случае, процесс, переводящийся в режим ожидания, будет ждать момента, когда необходимый ресурс освободится. Со временем процесс, который занимал данный ресурс, обратится к монитору, чтобы возвратить ресурс системе. В этом случае монитор выдаёт команду извещения (сигнализации) SIGNAL, чтобы один из ожидающих процессов мог получить данный ресурс и войти в монитор. Если монитор сигнализирует о возвращении ресурса, и в это время нет процессов, ожидающих такого ресурса, то он вносится в список свободных ресурсов.

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

Рассмотрим пример монитора для выделения одного ресурса.

Monitor resourse;

Condition free; (* условие - свободный *)

Var busy: Boolean;

Procedure Request; (* запрос *)

Begin

If busy then WAIT (free);

Busy := true;

Выдать ресурс ;

End;

Procedure Release; (* освобождение *)

Begin

Взять ресурс ;

Busy := false;

SIGNAL (free);

End;

Begin

Busy := false;

End.

Единственный ресурс динамически запрашивается и освобождается процессами, которые обращаются к процедурам Request и Release. Если процесс обращается к процедуре Request в тот момент, когда ресурс используется, значение переменной busy будет true и Request выполни

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Аппаратное управление памятью

Большинство компьютеров используют большое количество различных запоминающих устройств, таких как: ПЗУ, ОЗУ, жесткие диски, магнитные носители и т.д. Все они представляют собой виды памяти, которые доступны через разные интерфейсы. Два основных интерфейса — это прямая адресация процессором и файловые системы. Прямая адресация подразумевает, что адрес ячейки с данными может быть аргументом инструкций процессора.

Режимы работы процессора x86:

  • реальный — прямой доступ к памяти по физическому адресу
  • защищенный — использование виртуальной памяти и колец процессора для разграничения доступа к ней

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

  • поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса
  • поддержка изоляции области ядра от кода пользовательского режима
  • поддержка памяти только для чтения и с запретом на исполненение
  • поддержка выгрузки не используемых участков памяти в область подкачки на диске (свопинг)
  • поддержка отображённых в память файлов, в том числе загрузочных модулей
  • поддержка разделяемой между процессами памяти, в том числе с копированием-при-записи для экономии физических страниц

Абстрактное представление виртуальной памяти

Виды адресов памяти:

  • физический - адрес аппаратной ячейки памяти
  • логический - виртуальный адрес, которым оперирует приложение

Трансляция логического адреса в физический

Кроме того, этот дополнительный уровень позволяет через тот же самый интерфейс обращения к данным по адресу в памяти реализовать другие функции, такие как обращение к данным в файле (через механизм mmap ) и т.д. Наконец, он позволяет обеспечить более гибкое, эффективное и безопасное управление памятью компьютера, чем при использовании физической памяти напрямую.

На аппаратном уровне виртуальная память, как правило, поддерживается специальным устройством — Модулем управления памятью.

Страничная организация памяти

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

Трансляция адреса в страничной модели

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

Память процесса в страничной модели

Запись в таблице страниц

Размер страницы и количество страниц зависит от того, какая часть адреса выделяется на номер страницы, а какая на смещение. К примеру, если в 32-разрядной системе разбить адрес на две равные половины, то количество страниц будет составлять 2^16, т.е. 65536, и размер страницы в байтах будет таким же, т.е. 64 КБ. Если уменьшить количество страниц до 2^12, то в системе будет 4096 страницы по 1МБ, а если увеличить до 2^20, то 1 миллион страниц по 4КБ. Чем больше в системе страниц, тем больше занимает в памяти таблица страниц, соответственно работа процессора с ней замедляется. А поскольку каждое обращение к памяти требует обращения к таблице страниц для трансляции виртуального адреса, такое замедление очень нежелательно. С другой стороны, чем меньше страниц и, соотвественно, чем они больше по объему — тем больше потери памяти, вызванные внутренней фрагментацией страниц, поскольку страница является единицей выделения памяти. В этом заключается диллема оптимизации страничной памяти. Она особенно актуальна при переходе к 64-разрядным архитектурам.

Для оптимизации страничной памяти используются следующие подходы:

  • специальный кеш — TLB (translation lookaside buffer) — в котором хранится очень небольшое число (порядка 64) наиболее часто используемых адресов страниц (основные страницы, к которым постоянно обращается ОС)
  • многоуровневая (2, 3 уровня) таблица страниц — в этом случае виртуальный адрес разбивается не на 2, а на 3 (4. ) части. Последняя часть остается смещением внутри страницы, а каждая из остальных задает номер страницы в таблице страниц 1-го, 2-го и т.д. уровней. В этой схеме для трансляции адресов нужно выполнить не 1 обращение к таблице страниц, а 2 и более. С другой стороны, это позволяет свопить таблицы страниц 2-го и т.д. уровней, и подгружать в память только те таблицы, которые нужны текущему процессу в текущий момент времени или же даже кешировать их. А каждая из таблиц отдельного уровня имеет существенно меньший размер, чем имела бы одна таблица, если бы уровень был один

Многоуровневная система страниц

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

Сегментная организация памяти

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

Представление сегментной модели виртуальной памяти

Историческая модель сегментации в архитектуре х86

В архитектуре х86 сегментная модель памяти была впервые реализована на 16-разрядных процессорах 8086. Используя только 16 разрядов для адреса давало возможность адресовать только 2^16 байт, т.е. 64КБ памяти. В то же время стандартный размер физической памяти для этих процессоров был 1МБ. Для того, чтобы иметь возможность работать со всем доступным объемом памяти и была использована сегментная модель. В ней у процессора было выделено 4 специализированных регистра CS (сегмент кода), SS (сегмент стека), DS (сегмент данных), ES (расширенный сегмент) для хранения базы текущего сегмента (для кода, стека и данных программы).

Физический адрес в такой системе расчитывался по формуле:

Это приводило к возможности адресовать большие адреса, чем 1МБ — т.н. Gate A20.

Плоская модель сегментации

32-разрядный процессор 80386 мог адресовать 2^32 байт памяти, т.е. 4ГБ, что более чем перекрывало доступные на тот момент размеры физической памяти, поэтому изначальная причина для использования сегментной организации памяти отпала.

Однако, помимо особого способа адресации сегментная модель также предоставляет механизм защиты памяти через кольца безопасности процессора: для каждого сегмента в таблице сегментов задается значение допустимого уровня привилегий (DPL), а при обращении к сегменту передается уровень привилегий текущей программы (запрошенный уровень привилегий, RPL) и, если RPL > DPL доступ к памяти запрещен. Таким образом обеспечивается защита сегментов памяти ядра ОС, которые имеют DPL = 0 . Также в таблице сегментов задаються другие атрибуты сегментов, такие как возможность записи в память, возможность исполнения кода из нее и т.д.

Таблица сегментов каждого процесса находится в памяти, а ее начальный адрес загружается в регистр LDTR процессора. В регистре GDTR процессора хранится указатель на глобальную таблицу сегментов.

В современных процессорах x86 используется "Плоская модель сегментации", в которой база всех сегментов выставлена в нулевой адрес.

Плоская модель сегментации

Виртуальная память в архитектуре x86

Трансляция адреса в архитектуре x86

Системные вызовы для взаимодействия с подсистемой виртуальной памяти:

  • brk , sbrk - для увеличения сегмента памяти, выделенного для данных программы
  • mmap , mremap , munmap - для отображения файла или устройства в память
  • mprotect - изменение прав доступа к областям памяти процесса

Пример выделение памяти процессу:

Ленивое выделение памяти при вызове brk

Алгоритмы выделения памяти

Эффективное выделение памяти предполагает быстрое (за 1 или несколько операций) нахождение свободного участка памяти нужного размера.

Способы учета свободных участков:

  • битовая карта (bitmap) — каждому блоку памяти (например, странице) ставится в соответствие 1 бит, который имеет значение занят/свободен
  • связный список — каждому непрерывному набору блоков памяти одного типа (занят/свободен) ставится в соответствеи 1 запись в связном списке блоков, в которой указывается начало и размер участка
  • использование нескольких связных списков для участков разных размеров — см. алгоритм Buddy allocation

Кеш — это компонент компьютерной системы, который прозрачно хранит данные так, чтобы последующие запросы к ним могли быть удовлетворены быстрее. Наличие кеша подразумевает также наличие запоминающего устройства (гораздо) большего размера, в которых данные хранятся изначально. Запросы на получение данных из этого устройства прозрачно проходят через кеш в том смысле, что если этих данных нет в кеше, то они запрашиваются из основного устройства и параллельно записываются в кеш. Соответственно, при последующем обращении данные могут быть извлечены уже из кеша. За счет намного меньшего размера кеш может быть сделан намного быстрее и в этом основная цель его существования.

По принципу записи данных в кеш выделяют:

  • сквозной (write-through) — данные записываются синхронно и в кеш, и непосредственно в запоминающее устрйоство
  • с обратной записью (write-back, write-behind) — данные записываются в кещ и иногда синхронизируются с запоминающим устройством

По принципу хранения данных выделяют:

  • полностью ассоциативные
  • множественно-ассоциативные
  • прямого соответствия

Пример множественно-ассоциативного кеша в архитектуре х86

Поиск в множественно-ассоциативном кеше

Алгоритмы замещения записей в кеше

Поскольку любой кеш всегда меньше запоминающего устройства, всегда возникает необходимость для записи новых данных в кеш удалять из него ранее записанные. Эффективное удаление данных из кеша подразумевает удаление наименее востребованных данных. В общем случае нельзя сказать, какие данные являются наименее востребованными, поэтому для этого используются эвристики. Например, можно удалять данные, к которым происходило наименьшее число обращений с момента их загрузки в кеш (least frequently used, LFU) или же данные, к которым обращались наименее недавно (least recently used, LRU), или же комбинация этих двух подходов (LRFU).

Кроме того, аппаратные ограничения по реализации кеша часто требуют минимальных расходов на учет служебной информации о ячейках, которой является также и использование данных в них. Наиболее простым способом учета обращений является установка 1 бита: было обращение или не было. В таком случае для удаления из кеша может использоваться алгоритм часы (или второго шанса), который по кругу проходит по всем ячейками, и выгружает ячейку, если у нее бит равен 0, а если 1 — сбрасывает его в 0.

Более сложным вариантом является использование аппаратного счетчика для каждой ячейки. Если этот счетчик фиксирует число обращений к ячейке, то это простой вариант алгоритма LFU. Он обладает следующими недостатками:

  • может произойти переполнение счетчика (а он, как правило, имеет очень небольшую разрядность) — в результате будет утрачена вся информация об обращениях к ячейке
  • данные, к которым производилось множество обращений в прошлом, будут иметь высокое значение счетчика даже если за последнее время к ним не было обращений

Для решения этих проблем используется механизм старения, который предполагает периодический сдвиг вправо одновременно счетчиков для всех ячеек. В этом случае их значения будут уменьшаться (в 2 раза), сохраняя пропорцию между собой. Это можно считать вариантом алгоритм LRFU.

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

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

Содержание

История появления

В 1940-ых и 50-ых все крупные программы должны были реализовывать логику управления памятью - оверлеи. Виртуальная предназначалась не только, чтобы расширить реальную оперативную память, но и облегчить использование памяти программистам. [Источник 1] .Чтобы использовать мультипрограммирование и многозадачность многие ранние системы разделяли память между множеством программ без использования виртуальной памяти (например ранние модели PDP-10 через регистры).

Концепция виртуальной памяти впервые была разработана немецким физиком Fritz-Rudolf Güntsch в Берлинском техническом университете в его докторской диссертации "Логическое построение цифровых компьютеров несколькими асинхронными вращающимеся барабанами и автоматическими высокоскоростными операциями с памятью" (англ. Logical Design of a Digital Computer with Multiple Asynchronous Rotating Drums and Automatic High Speed Memory Operation ). В диссертации описывалась машина с 6 блоками по 100 машинным слов основной памяти и адресное пространство из 1000 блоков по 100 машинных слов, с специальными аппаратными средствами автоматические перемещающие блоки между основной и вторичной памятью. Подкачка страниц впервые была реализована в Манчестерском университете как способ расширить реальную оперативную память компьютера Atlas совместив 16 тысяч слов основной памяти с дополнительными 96 тысячами слов вторичной памяти. Первый Atlas был введён в эксплуатацию в 1962-ом году, но рабочие прототипы подкачки страниц были реализованы к 1959-му году. [Источник 2] [Источник 3] В 1961-ом году, Burroughs Corporation самостоятельно выпустила первый коммерческий компьютер с виртуальной памятью - B5000, с сегментной адресацией памяти, но без подкачки страниц.

Перед тем как виртуальная память могла быть реализована в основным популярных операционных системах, много проблем должны были быть решены. Динамическая трансляция адресов требовала дорогого и трудно реализуемого специализированного оборудования (первые реализации несколько замедляли доступ к памяти). Так же существовало беспокойство, что новые общесистемные алгоритмы будут не так эффективно использовать вторичную память, как ранее используемые специальные алгоритмы реализуемые каждым приложением в отдельности. В 1969-ом году дебаты касающиеся использования виртуальной памяти в коммерческих компьютерах закончились, исследовательская команда IBM, возглавляемая David Sayre показала, что их система виртуальной памяти работает лучше, чем любая управляемая вручную система. Первый миникомпьютер использующий виртуальную память был Норвежский NORD-1, в течении 1970-ых годов, появились другие компьютеры реализующие виртуальную память (например компьютер VAX с системой VMS).

Виртуальная память была реализована в архитектуре x86 вместе с |защищённым режимом в процессоре Intel 80286, но его способ подкачки сегментов плохо масштабировался для сегментов большего размера. В процессор Intel 80386 была реализована подкачка страниц под существующем слоем сегментации, позволяя исключение подкачки страниц связывать с другими исключениями не вызывая двойного сбоя. Однако, загрузка дескриптора сегмента была дорогостоящей операции, в результате чего, разработчики операционных систем полагались только на подкачку страниц, а не на комбинацию сегментации и подкачки страниц. [Источник 4]

Преимущества виртуальной памяти

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

Способы организации памяти

Страничный способ

Страничная память — способ организации памяти, при котором единицей отображения виртуальных адресов на физические является регион постоянного размера (т. н. страница). Типичный размер страницы — 4096 байт, для некоторых архитектур — до 128 КБ.
Основным достоинством страничного способа распределения памяти является минимально возможная фрагментация. Поскольку на каждую задачу может приходиться по одной незаполненной странице, то становится очевидно, что память можно использовать достаточно эффективно; этот метод организации виртуальной памяти был бы одним из самых лучших, если бы не два обстоятельства:

  1. Страничная трансляция виртуальной памяти требует существенных накладных расходов. В самом деле, таблицы страниц нужно тоже размещать в памяти. Кроме этого, эти таблицы нужно обрабатывать; именно с ними работает диспетчер памяти.
  2. Программы разбиваются на страницы случайно, без учета логических взаимосвязей, имеющихся в коде. Это приводит к тому, что межстраничные переходы, как правило, осуществляются чаще, нежели межсегментные, и к тому, что становится трудно организовать разделение программных модулей между выполняющимися процессами.

Решаемые задачи

Сегментный способ

Сегментная адресация памяти — схема логической адресации памяти компьютера в архитектуре x86. Линейный адрес конкретной ячейки памяти, который в некоторых режимах работы процессора будет совпадать с физическим адресом, делится на две части: сегмент и смещение. Сегментом называется условно выделенная область адресного пространства определённого размера, а смещением — адрес ячейки памяти относительно начала сегмента. Базой сегмента называется линейный адрес (адрес относительно всего объёма памяти), который указывает на начало сегмента в адресном пространстве. В результате получается сегментный (логический) адрес, который соответствует линейному адресу база сегмента+смещение и который выставляется процессором на шину адреса.

Достоинства сегментного способа

Недостатки сегментного способа

  1. Для получения доступа к искомой ячейке памяти необходимо потратить намного больше времени. Необходимо сначала найти и прочитать дескриптор сегмента, а уже потом, используя данные из него о местонахождении нужного сегмента, можем вычислить и конечный физический адрес. Для того чтобы уменьшить эти потери, используется кэширование — то есть те дескрипторы, с которыми мы имеем дело в данный момент, могут быть размеще­ны в сверхоперативной памяти.
  2. Имеются большие потери памяти и про­цессорного времени на размещение и обработку дескрипторных таблиц. Ведь на каждую задачу необходимо иметь свою таблицу дескрипторов сегментов, а при определении физических адресов необходимо выполнять операции сложения.

Подкачка страниц

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

Таблица страниц

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

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

Супервизор страниц

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

Когда вся реальная оперативная память уже использована, супервизор страниц должен выгрузить какую-либо страницу во вторичную память, чтобы загрузить нужную. Супервизор использует алгоритм замещения страниц (например LRU), чтобы определить какую именно страницу можно выгрузить.

Закреплённые страницы

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

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

  • Код супервизора страниц и драйвера доступа к вторичной памяти (на котором находятся страницы), должен быть постоянно закреплён, иначе подкачка страниц не может не работать, так как необходимый код будет недоступен.
  • Компоненты сильно зависимые от времени, должны быть закреплены, чтобы избежать задержек.
  • Буферы данных, напрямую обращающиеся к периферийным устройствам, которые используют прямой доступ к памяти или каналы ввода/вывода должны находится в закреплённых страницах, во время операций с вводом/выводом, потому что устройства ожидают, что буферы расположены в реальной оперативной памяти. Передача информации с устройства не может быть остановлена в случае исключения ошибки страниц, и перезапущена позже.

V=R режим

В OS/VS1 и похожих операционных системах, некоторые части системной памяти работают в режиме "Virtual-Real", часто сокращаемый до "V=R". В этом режиме каждый виртуальный адрес соответствует такому же реальному адресу. Этот режим используется для механизма прерываний, для супервизора страниц и таблицы страниц в старых операционных системах, и для приложений использующих не стандартное управление вводом/выводом.

Пробуксовка

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

Представляю, Вам, перевод статьи одного из разработчиков PHP, в том числе версии 7 и выше, сертифицированного инженера ZendFramework. В данный момент работает в SensioLabs и большую часть занимается низкоуровневыми вещами, в том числе программированием в С под Unix. Оригинал статьи здесь.

Ошибка Сегментации: (Компьютерная верстка памяти)

Несколько слов, о чем эта запись в блоге

То, что вы будете читать здесь, краткое изложение основ дизайна компьютерной архитектуры. Я не буду заходить слишком далеко, если это не нужно, и буду использовать хорошо известные формулировки, так что, кто работает с компьютером каждый день может понять такие важные понятия о том, как работает ПК. Существует много книг о компьютерной архитектуре. Если вы хотите углубиться дальше в этой теме, я предлагаю вам достать некоторые из них и начать читать. Кроме того, откройте исходный код ядра ОС и изучите его, будь то ядро Linux, или любое другое.

Немного истории computer science

Еще в то время, когда компьютерами были огромные машины, тяжелее тонны, внутри вы могли бы найти один процессор с чем-то вроде 16Kb оперативной памяти (RAM). Не будем углубляться дальше =) В этот период компьютер стоил примерно $ 150 000 и мог выполнить ровно одну задачу в момент времени. Если бы мы в то время нарисовали схему его памяти, то архитектура выглядела следующим образом:

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