Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

spz / lect / lekc6_4_1_virt_memory

.pdf
Скачиваний:
14
Добавлен:
23.02.2016
Размер:
188.66 Кб
Скачать

1

Пам’ять і відображення, віртуальний адресний простір

1.Пам'ять і відображення, віртуальний адресний простір

2.Простий безперервний розподіл і розподіл з перекриттям (оверлейні структури).

3.Розподіл статичними і динамічними розділами.

4.Розділи з фіксованими границями.

5.Розділи з рухливими границями.

6.Виділення пам'яті під новий розділ: перша придатна ділянка; найвідповідніша ділянка; найневідповідніша ділянка.

Загальноприйнята в даний час концепція віртуальної пам'яті з'явилася досить давно. Вона дозволила вирішити цілий ряд актуальних питань організації обчислень. Насамперед до числа таких питань відноситься забезпечення надійного функціонування мультипрограмних систем.

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

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

2

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

Якщо не приймати до уваги програмування на машинному рівні (хоча ця технологія майже не використовується), то можна сказати, що програміст звертається до пам’яті за допомогою деякого набору логічних імен, котрі частіше за все є символьними, а не чисельними, для яких відсутнє відношення порядку. Іншими словами, як правило множина змінних є невпорядкованою, хоча окремі змінні можуть мати часткову впорядкованість (напр. елементи масиву). Імена змінних і вхідних точок програмних модулів становлять простір імен.

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

Фізична пам’ять – це впорядкована множина комірок, що пронумеровані, тобто до кожної з них можна звернутись, вказавши її адресу. При цьому кількість комірок фізичної пам’яті обмежена і фіксована.

Системне програмне забезпечення повинно зв’язувати кожне ім’я, що вказане користувачем, з фізичною коміркою, тобто здійснювати відображення імен на фізичну пам’ять комп’ютера.

Логічне (символьне) ім’я

Простір імен програми

Система

програмування

Віртуальна адреса Операційна система

Фізична пам’ять комп’ютера

Комірка оперативної пам’яті (фізична адреса)

Рис. Пам’ять і відображення

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

3

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

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

Одним з випадків відображення простору імен на фізичну пам’ять є тотожність віртуального адресного простору – фізичній пам’яті. В даному випадку кажуть, що система програмування генерує абсолютну двійкову програму. В цій програмі всі двійкові адреси такі, що програма може виконуватися тільки в тому випадку, коли її віртуальні адреси будуть точно співпадати з фізичними. Частина програмних модулів любої ОС обов’язково повинна бути абсолютними двійковими програмами. Ці програми розміщуються по фіксованим адресам і з їх допомогою можна потім реалізувати розміщення інших програм, підготовлених системою програмування таким чином, що вони можуть працювати на різних фізичних адресах (тобто на тих адресах, на яких їх розмістить операційна система).

Другим випадком цієї загальної схеми трансляції адресного простору є тотожність віртуального адресного простору вихідному (исходному) простору імен. Тут відображення виконується сомою ОС , яка під час виконання використовує таблицю символьних імен. Така схема використовується дуже рідко, так як відображення необхідно виконувати для кожного нового імені і дуже багато часу витрачається на кваліфікацію імен. Дану схему можна зустріти в інтерпретаторах, в яких стадії трансляції і виконання практично нерозрізнені. Це характерно для найпростіших комп’ютерних систем, в яких замість ОС використовувався вбудований інтерпретатор (напр., Basic).

Можливі і проміжні варіанти. В найпростішому випадку транслятор-компілятор генерує відносні адреси, які є віртуальними адресами з наступною настройкою програми на один з неперервних

4

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

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

Існує три ситуації співвідношення віртуального адресного простору програми Vv і фізичної пам’яті Vp:

1)Vv < Vp - Ця ситуація майже не зустрічається вже на практиці, однак це співвідношення є достатньо реальним. (не так давно 16-розрядні міні

ЕОМ). Вся фізична пам’ять розбивалась на розділи об’ємом по 64 Кбайти і на кожний такий розділ здійснювалось відображення свого віртуального адресного простору.

2)Vv = Vp - Також зустрічається дуже рідко. Для неї характерна велика кількість методів розподілу ОП.

3)Vv > Vp - В наш час найбільш розповсюджена ситуація, а методи розподілення пам’яттю відрізняються як складністю так і ефективністю.

Просте неперервне розприділенння і розприділення з перекриттям (оверлейні структури)

Просте неперервне розприділенння - це найпростіша схема, відповідно до якої вся памя’ть умовно може бути розділена на три частини.:

область, яку займає операційна система;

область, у якій розміщується задача, що виконується;

незайнята нічим (вільна) область пам'яті.

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

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

5

ядром. Решта модулі ОС можуть бути звичайними диск-резидентными (чи транзитними), тобто завантажуватися в оперативну пам'ять тільки по необхідності, і після свого виконання знову звільняти пам'ять.

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

Якщо є необхідність створити програму, логічний (і віртуальний) адресний простір якої повиний бути більше, ніж вільна область пам'яті, чи навіть більше, ніж весь можливий обсяг оперативної пам'яті, то використовується розподіл з перекриттям (так звані оверлейні структури). Від overlay - перекриття, розташування поверх чогось.

Цей метод розподілу припускає, що вся програма може бути розбита на частини - сегменти. Кожна оверлейная програма має одну головну частину (main) і кілька сегментів (segment), причому в пам'яті машини одночасно можуть знаходитися тільки її головна частина й одна чи декілька сегментів.

Поки в оперативній пам'яті розташовуються сегменти, що виконуються, решта знаходяться в зовнішній пам'яті. Після того як поточний сегмент завершить своє виконання, можливі два варіанти. Або він сам звертається до ОС із указівкою, який сегмент повинний бути завантажений у пам'ять наступним. Або він повертає керування головному сегменту задачі (у модуль main), і вже той звертається до ОС із указівкою, який сегмент завантажити в оперативну пам'ять, і знову віддає керування одному із сегментів, що розташовуються в пам'яті.

Розподіл статичними і динамічними розділами

Для організації мультипрограмного режиму необхідно забезпечити одночасне розташування в оперативній пам'яті декількох задач ( чи цілком чи їх частинами) Найпростіша схема розподілу пам'яті між декількома задачами припускає, що пам'ять, яка незайнята ядром ОС, може бути розбита на декілька безперервних частин (зон, розділів - partition). Розділи характеризуються ім'ям, типом, границями (як правило, указуються початок розділу і його довжина).

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

Спочатку ми коротко розглянемо статичний розподіл пам'яті на декілька розділів.

6

Розділи з фіксованими границями

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

Приклад розбивки пам'яті на кілька розділів приведений на мал.

Ядро ОС

Розділ №0

Транзисторна область ОС

Задача А

Розділ №1

Область, яка не використовується

Задача В

Розділ №2

 

Область, яка не

використовується

Розділ№3

Задача С

Область, яка не

Рис.. Розподіл пам'яті розділами з фіксованими границями

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

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

7

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

Бажання розроблювачів скоротити ці значні втрати привело їх до двох рішень:

а) - виділяти розділ рівно такого обсягу, що потрібний під поточну задачу;

б) розміщати задачу не в одній безупинній області пам'яті, а в декількох областях.

Друге рішення реалізувалося в декількох способах організації віртуальної пам'яті. Ми їх обговоримо в наступному розділі, а зараз коротко розглянемо перше рішення.

Розділи з рухливими границями

Щоб позбутися від фрагментації, можна спробувати розміщати в оперативній пам'яті задачі щільно, одну за іншою, виділяючи рівно стільки пам'яті, як-то задача вимагає. Однієї з перших ОС, що реалізувала такий спосіб розпреділения пам'яті, була OS MVT. Спеціальний планувальник (диспетчер пам'яті) веде список адрес вільної оперативної пам'яті. З появою нової задачі диспетчер пам'яті переглядає цей список і виділяє для задачі розділ, обсяг якого або дорівнює необхідному, або ледве більше, якщо пам'ять виділяеться не комірками, а деякими дискретними одиницями. При цьому модификується список вільної пам'яті. При звільненні розділів диспетчер пам'яті намагається об'єднати вивільнюваний розділ з одною з вільних ділянок, якщо вони є суміжними. При цьому список вільних ділянок може бути упорядкований або по адресах або по обсязі. Виділення пам'яті під новий розділ може здійснюватися одним із трьох способів:

перша придатна ділянка;

найпридатніша ділянка;

найневідповідніша ділянка.

У першому випадку список вільних областей упорядковується по адресах (наприклад, по зростанню адрес). Диспетчер пам'яті переглядає

8

цей список і виділяє задачі розділ у тій області, що перша підійде по обсягу.

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

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

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

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

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

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

Соседние файлы в папке lect