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

5.4. Сегментна організація пам'яті

Перейдемо тепер до розгляду способів організації пам'яті, які базуються на використанні віртуальних адрес, апаратно перетворюваних в фізичні при виконанні команд. Два основних види організації віртуальної пам'яті - сегментна і сторінкова організація.

При сегментної організації вся віртуальна пам'ять, використовувана програмою, розбивається на частини, звані сегментами. Це розбиття виконується або самим програмістом (якщо він програмує на мові асемблера), або компілятором використовуваної мови програмування. Розміри сегментів можуть бути різними, але в межах максимального розміру, використовуваного в даній архітектурі. Розбиття зазвичай проводиться на логічно осмислені частини, такі, як сегмент даних, сегмент коду, сегмент стека і т.п. Велика програма може містити кілька сегментів одного типу, наприклад, кілька сегментів коду або даних.

Таким чином, при сегментної організації у програми немає єдиного лінійного адресного простору. Віртуальний адреса складається з двох частин: селектора сегмента і зміщення від початку сегменту.

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

У кодах програми селектор сегмента може або явно присутній як частина адреси, або матися на увазі в залежності від сенсу конкретної адреси. Наприклад, для адрес виконуваних команд використовується селектор поточного сегмента команд, а для адрес операндів - селектор поточного сегмента даних.

При кожному зверненні до віртуального адресою апаратними засобами виконується перетворення пари «сегмент: зсув» у фізичну адресу. Спрощена схема такого перетворення показана на рис. 5-2.

Рис. 5‑21

Селектор сегмента використовується для доступу до відповідного запису таблиці сегментів. Якщо даний сегмент присутній в пам'яті, то його базову адресу, прочитаний в таблиці, складається зі зміщенням з віртуального адреси. Результат складання являє собою фізичну адресу, по якому і відбувається звернення до пам'яті.

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

Але звідки візьметься вільне місце в пам'яті? По всій імовірності, системі доведеться для цього прибрати з пам'яті якийсь інший сегмент, що належить або до цього ж, або до іншого процесу. Копія витісняється сегмента повинна залишитися у файлі підкачки. Щоб уникнути зайвої роботи, в кожному записі таблиці зберігається прапор, який відзначає, чи є сегмент в пам'яті «чистим» або «брудним», тобто чи збігається його вміст з дисковою копією або ж воно було змінено у пам'яті після останнього завантаження з диска. «Брудний» сегмент повинен бути збережений на диску, для «чистого» збереження не потрібно. Якщо сегмент визначений як доступний лише для читання, то він свідомо «чистий».

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

Для боротьби з фрагментацією можна час від часу проводити дефрагментацію, тобто переміщення всіх сегментів, що знаходяться в пам'яті, на нові місця, без «дірок» в пам'яті між сегментами. При цьому, однак, потрібно, щоб система відкоригувала таблиці сегментів всіх тих процесів, сегменти яких перемістилися у фізичній пам'яті. Крім того, переміщення сегментів займає відчутний час, тому воно недопустимо для сегментів, що містять, наприклад, обробники переривань, які повинні спрацьовувати дуже швидко. Щоб уникнути цих проблем, в деяких системах сегменти можуть знаходитися в одному з двох станів:

· Фіксований сегмент не повинен переміщатися в пам'яті;

· Переміщуваний сегмент може переміщатися системою, проте програма не може звертатися до адрес в такому сегменті, оскільки його місце розташування не визначено.

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

При перемиканні поточного процесу все, що повинна зробити система у відношенні пам'яті, полягає в заміні таблиці сегментів. Для цього або в спеціальний системний регістр записується адреса таблиці сегментів поточного процесу, або, якщо апаратура допускає тільки одну таблицю сегментів, її вміст має бути перезаписані так, щоб відповідати новому працюючому процесу.

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