Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsiya_10.docx
Скачиваний:
5
Добавлен:
05.09.2019
Размер:
2 Mб
Скачать

10.2.3. Переміщувані розділи

Одним з методів боротьби з фрагментацією є переміщення всіх зайнятих ділянок у бік старших або у бік молодших адрес, так, щоб вся вільна пам'ять утворювала єдину вільну область (рис. 10.5). На додаток до функцій, які виконує ОС при розподілі пам'яті змінними розділами, в даному випадку вона повинна ще час від часу копіювати вміст розділів з одного місця пам'яті в інше, коректуючи таблиці вільних і зайнятих областей. Ця процедура називається "стисненням".

Рис. 10.5. Розподіл пам'яті переміщуваними розділами

Стиснення може виконуватися або при кожному завершенні задачі, або тільки тоді, коли для знову надійшла задачі немає вільного розділу достатнього розміру. У першому випадку потрібно менше обчислювальної роботи при коректуванні таблиць, а в другому - рідше виконується процедура стискування. Так як програми переміщуються з оперативної пам'яті в ході свого виконання, то перетворення адрес з віртуальної форми у фізичну повинно виконуватися динамічним способом.

Хоча процедура стиску і приводить до більш ефективного використання пам'яті, вона може вимагати значного часу, що часто переважує переваги даного методу.

10.2.4. Система двійників

Як фіксоване, так і динамічний розподіл пам'яті мають переваги і недоліки. Компромісним в цьому плані є система двійників, в якій пам'ять розподіляється блоками розміром 2К, L <= K <= U, де: - 2L - мінімальний розмір виділяється блоку пам'яті;

- 2U - найбільший розподіляється блок (спочатку вся доступна пам'ять).

При запиті розміром S, таким, що 2U-1 <S <= 2U, виділяється весь блок. В іншому випадку блок поділяється на два рівних двійника з розмірами 2U-1. Якщо 2U-2 <S <= 2U-1, то за запитом виділяється один із двох двійників; в іншому випадку один із двійників знову ділиться навпіл. Цей процес продовжується до тих пір, поки не буде згенеровано найменший блок, розмір якого не менше S.

Система двійників постійно веде список "дірок" (доступних блоків) для кожного розміру 2i. Діра може бути вилучена зі списку (i +1) поділом її навпіл і внесенням двох нових дір розміру 2i в список i. Коли пара двійників у списку i виявляється звільненої, вони видаляються зі списку і об'єднуються в єдиний блок у списку i +1.

Нижче наведено приклад (рис. 10.6) використання блоку з початковим розмі ¬ ром 1 Мбайт. Перший запит А - на 100 Кбайт (для нього потрібно блок розміром 128 Кбайт). Для цього початковий блок ділиться на два двійника по 512 Кбайт. Перший з них ділиться на двійники розміром 256 Кбайт, і, в свою чергу, перший з вийшов при цьому поділі двійників також ділиться навпіл. Один з вийшов двійників розміром 128 Кбайт виділяється запитом А. Наступний запит В вимагає 256 Кбайт. Такий блок є в наявності і виділяється. Процес продовжується з разде ¬ ленням і злиттям двійників при необхідності. Зверніть увагу, що після звільнення блоку Е відбувається злиття двійників по 128 Кбайт в один блок розміром 256 Кбайт, який, у свою чергу, тут же зливається зі своїм двійником.

С истема двійників є розумний компроміс для подолання недоліків схем фіксованого і динамічного розподілу, але в сучасних ¬ них операційних системах її перевершує віртуальна пам'ять, заснована на сторінкової організації і сегментації. Однак система двійників знайшла застосування в паралельних системах як ефективний засіб розподілу і звільнен ¬ ня паралельних програм. Модифікована версія системи двійників використовується для розподілу пам'яті ядром UNIX.

Рис. 10.6. Приклад системи двійників

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]