Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція№7_Простий безперервний розподіл і розпод...doc
Скачиваний:
1
Добавлен:
15.11.2019
Размер:
129.54 Кб
Скачать

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

Загальні принципи керування пам'яттю в однопрограмних операційних системах

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

  • область, займана операційною системою;

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

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

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

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

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

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

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

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

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

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

Методи нерозривного розподілу пам'яті.

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

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

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

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

Приклад розподілу пам'яті на кілька розділів наведений на рис. 1. У кожному розділі в кожний момент часу може розташовуватися по одній програмі (завданню). У цьому випадку стосовно кожного розділу можна застосувати всі ті методи створення програм, які використаються для однопрограмних систем. Можливе використання оверлейних структур, що дозволяє створювати більші складні програми й у той же час підтримувати коефіцієнт мультипрограмування (Під коефіцієнтом мультипрограмування (t) розуміють кількість паралельно виконуваних програм. Звичайно на практиці для завантаження центрального процесора до рівня 90 % необхідно, щоб коефіцієнт мультипрограмування був не менш 4-5. А для того щоб найбільше повно використати й інші ресурси системи, бажано мати t на рівні 10-15.) на належному рівні. Перші мультипрограмні операційні системи будувалися за цією схемою. Використалася ця схема й через багато років при створенні недорогих обчислювальних систем, оскільки є нескладною й забезпечує можливість паралельного виконання програм. Іноді в деякому розділі розміщалося по декілька невеликих програм, які постійно в ньому й перебували. Такі програми називалися ОЗУ - резидентними (або просто резидентними).

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

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

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

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

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

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

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