Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Примерные ответы.docx
Скачиваний:
9
Добавлен:
24.09.2019
Размер:
358.54 Кб
Скачать

6. Открытая память

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

В подобных системах программы загружаются с фиксированного адреса PROG_START. В адресах от 0 до начала программы находятся вектора прерываний, иногда — еще и стек программы. Сама система размещается в старших адресах памяти. Адрес SYS_START, с которого она начинается, зависит от количества памяти у машины и от конфигурации самой ОС.

В этом случае управление памятью со стороны системы состоит в том, что загрузчик проверяет, поместится ли загружаемый модуль в пространство от PROG_START до SYS_START. Если объем памяти, который использует программа, не будет меняться во время ее исполнения, то на этом всё управление и заканчивается.

Однако программа может использовать динамическое управление памятью, например функцию malloc() или что-то в этом роде. В этом случае уже код malloc() должен следить за тем, чтобы не залезть в системные адреса. Как правило, динамическая память начинает размещаться с адреса PROG_END = PROG_START + PROG_SIZE. PROG_SIZE в данном случае обозначает полный размер программы, то есть размер ее кода, статических данных и области, выделенной под стек.

***

Функция malloc() следит за тем, какие блоки памяти из уже выделенных были освобождены. При каждом новом запросе она сначала ищет блок подходящего размера в своей структуре данных и, только когда этот поиск завершится неудачей, откусывает новый блок памяти у системы. Для этого используется переменная, которая в библиотеке языка C называется brklevel. Изначально эта переменная равна PROG_END, ее значение увеличивается при выделении новых блоков, но в некоторых случаях может и уменьшаться. Это происходит, когда программа освобождает блок, который заканчивается на текущем значении brklevel.

7. Алгоритмы динамического управления памятью

1) Подкачка (свопинг)

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

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

Если процесс занимает фиксированный объем памяти на протяжении всей своей работы, то ему просто выделяется участок, наиболее этому объему соответствующий.

***

В случае роста процесса (при динамической работе с памятью) память выделяется с запасом по следующим стратегиям:

1. с запасом для области данных

В этом случае после процесса в памяти остается место, доступное для области данных.

2. с запасом для области данных и стека

В этом случае стек располагается на определенном расстоянии от областей кода и данных. Таким образом, в полученном промежутке возможен одновременный рост: стека — «вниз», данных — «вверх».

***

Управление памятью с помощью битовых массивов

Память разделяется на участки длиной от нескольких слов до нескольких килобайт. В битовой карте каждому сопоставляется: 1 (занят) или 0 (свободен).

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

Управление памятью с помощью связанных списков

Память представляется в виде списка, содержащего структуры вида {status, adress, length}, status — состояние участка памяти (P — занят процессом, H — «дырка»), adress — адрес начала участка памяти, length — длина участка.

Поиск области для процесса определяется по одному из следующих алгоритмов:

1.первый подходящий;

2.следующий подходящий

При нахождении первого подходящего участка запоминается его адрес. Последующие поиски осуществляются именно с него;

3.самый подходящий

Осуществляется поиск наименьшей области, куда помещается процесс;

4.самый неподходящий

Выбирается наибольший участок, при отделении от него в результате будут получаться крупные области;

5.быстрый подходящий

Хранение отдельных списков для областей «наиболее употребляемых» размеров;

Возможно хранение раздельных списков для занятых и свободных областей — тогда ускоряется работа первых алгоритмов 1 и 3, алгоритм 2 теряет смысл, а 4 и 5 работают медленнее.

2) Виртуальная память

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

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

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

Пространство виртуальных адресов разделено на единицы – страницы. Им соответствуют страничные блоки в физической памяти. Страницы и их блоки имеют одинаковый размер. Если нужная страница не отображена (бит присутствия = 0), диспетчер памяти вызывает страничное прерывание процессора, неиспользуемая страница загружается на диск, и в физическое пространство отображается нужная. Виртуальный адрес делится на номер страницы (старшие биты) и сдвиг (младшие биты).

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

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

1) Может быть слишком большой

2) Отображение должно быть быстрым

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