На головну

Сегментний спосіб організації віртуальної пам'яті

  1. Half-Duplex - Пристрій або канал, здатний в кожен момент тільки передавати або приймати інформацію. Прийом і передача, таким чином, повинні виконуватися по черзі.
  2. II. Рішення логічних задач табличним способом
  3. III. Основні конституційні засади організації Російської держави.
  4. Opганизации праці в виробничо-господарській системі підприємства, її роль і забезпеченні конкурентоспроможності підприємств в умовах ринкової економіки
  5. Passive Capacity. (Правоздатність)
  6. Puc.2. Індивідуальна оцінка проблемного поля організації учасником № 1
  7. SNW-аналіз сильних і слабких сторін організації

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

Перетворення імені сегмента в його порядковий номер здійснить система програмування, а операційна система буде розміщувати сегменти в пам'ять і для кожного сегмента отримає інформацію про його початку. Таким чином, віртуальний адреса для цього способу буде складатися з двох полів - номер сегмента і зміщення відносно початку сегмента. Відповідна ілюстрація приведена на рис. 2.7. На цьому малюнку зображено випадок звернення до осередку, віртуальний адреса якої дорівнює сегменту з номером 11 і зміщенням від початку цього сегмента, рівним 612. Як ми бачимо, операційна система розмістила даний сегмент в пам'яті, починаючи з комірки з номером 19 700.

Кожен сегмент, що розміщується в пам'яті, має відповідну інформаційну структуру, часто звану дескриптором сегмента. Саме операційна система будує для кожного виконуваного процесу відповідну таблицю дескрипторів сегментів і при розміщенні кожного з сегментів в оперативній або зовнішньої пам'яті в дескрипторі відзначає його поточне місце розташування. Якщо сегмент завдання в даний момент знаходиться в оперативній пам'яті, то про це робиться відмітка в дескрипторі. Як правило, для цього використовується «Біт присутності» (Present). У цьому випадку в поле «адреса» диспетчер пам'яті записує адресу фізичної пам'яті, з якого сегмент починається, а в полі «довжина сегмента» (limit) вказується кількість адресованих комірок пам'яті. Це поле використовується не тільки для того, щоб розміщувати сегменти без накладення один на інший, а й для того, щоб проконтролювати, чи не звертається код що виконується завдання за межі поточного сегмента. У разі перевищення довжини сегмента внаслідок помилок програмування ми можемо говорити про порушення адресації і за допомогою введення спеціальних апаратних засобів генерувати сигнали переривання, які дозволять фіксувати (виявляти) такого роду помилки.



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

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

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


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

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

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

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

Для вирішення проблеми заміщення (визначення того сегмента, який повинен бути або переміщений в зовнішню пам'ять, або просто заміщений новим) використовуються наступні дисципліни1:

Про правило FIFO (First in - first out, що означає: «перший прийшов першим і вибуває»);

Про правило LRU (Least recently used, що означає «останній з недавно використаних» або, інакше кажучи, «найдовше невикористаний»);

0 правило LFU (Least frequently used, що означає: «використовуваний рідше всіх ос
 тальних »);

D випадковий (random) вибір сегмента.

1 Їх називають «дисциплінами заміщення».


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

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

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

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

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


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

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

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

Тому наступним способом розривного розміщення завдань в пам'яті став спосіб, при якому всі фрагменти завдання однакового розміру і довжини, кратної ступеня двійки, щоб операції додавання можна було замінити операціями конкатенації (злиття). Це - сторінковий спосіб організації віртуальної пам'яті.

Прикладом використання сегментного способу організації віртуальної пам'яті є операційна система для ПК OS / 2 першого покоління1, Яка була створена для процесора i80286. У цій ОС в повній мірі використані апаратні засоби мікропроцесора, який спеціально проектувався для підтримки сегментного способу розподілу пам'яті.

OS / 2 v.l підтримувала розподіл пам'яті, при якому виділялися сегменти програми і сегменти даних. Система дозволяла працювати як з іменованими, так і неіменованого сегментами. Імена поділюваних сегментів даних мали ту ж форму, що й імена файлів. Процеси отримували доступ до іменованих розділяються сегментам, використовуючи їх імена в спеціальних системних викликах. OS / 2 v.l допускала розділення програмних сегментів додатків і підсистем, а також глобальних сегментів даних підсистем. Взагалі, вся концепція системи OS / 2 була побудована на понятті поділу пам'яті: процеси майже завжди розділяють сегменти з іншими процесами. У цьому полягала суттєва відмінність від систем типу UNIX, які зазвичай поділяють тільки реєнтерабельним програмні модулі між процесами.

1 OS / 2 v.l почала створюватися в 1984 р і вийшла в продаж в 1987 р


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

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

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

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



Розділи з рухомими межами | Сторінковий спосіб організації віртуальної пам'яті

Завданнями і пам'яттю в операційних системах | дисципліни диспетчеризації | Витісняють і не витісняють алгоритми диспетчеризації | Якість диспетчеризації і гарантії обслуговування | Диспетчеризація задач з використанням динамічних пріоритетів | Пам'ять і відображення, віртуальний адресний простір | Розділи з фіксованими межами | Сегментно-сторінковий спосіб організації віртуальної пам'яті | Розподіл оперативної пам'яті в сучасних ОС для ПК | Розподіл оперативної пам'яті в MS-DOS |

© um.co.ua - учбові матеріали та реферати