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

spz / spz

.pdf
Скачиваний:
33
Добавлен:
23.02.2016
Размер:
5.16 Mб
Скачать

Як другий приклад розглянемо ситуацію, що ще зовсім недавно була досить актуальною для перших персональних комп'ютерів. Нехай на ПК із найпростішою однопрограмною операційною системою (типу МS-DOS) встановлена деяка резидентна програма з умовною назвою Т1МЕ, що по натисканню на якусь комбінацію клавіш відтворює на екрані дисплея час. Допустимо, що значення перемінних, що вказують годину, хвилини і секунди, рівні 18:20:59, причому вивід на дисплей здійснюється з права на ліво (в порядку: секунди, хвилини, години). Нехай відразу ж після передачі програмою Т1МЕ на дисплей інформації «59 секунд» генерується переривання від таймера і значення часу оновлюється: 18:21:00.

Після цього програма Т1МЕ, перервана таймером, продовжить своє виконання, і на дисплей будуть видані значення: хвилини = 21, години = 18. В результаті на екрані ми побачимо: 18:21:59.

Нарешті, як третій приклад приведемо пару процесів, що змінюють різні поля записів службовців якого-небудь підприємства. Нехай процес АДРЕСА змінює домашню адреса що службовця, а процес СТАТУС — його посаду і зарплату. Нехай кожен процес копіює весь запис СЛУЖБОВЕЦЬ у свою робочу область. Припустимо, що кожен процес повинний обробити деякий запис ІВАНОВ. Припустимо також, що після того, як процес АДРЕСА скопіював запис ІВАНОВ у свою робочу область, але до того, як він записав скоректований запис назад, процес СТАТУС скопіював первісний запис ІВАНОВ у свою робочу область. Зміни, виконані тим із процесів, що першим запише скоректований запис назад у файл СЛУЖБОВЦІ, будуть загублені і, можливо, ніхто не буде знать про це.

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

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

Допустимо, що «постачальник» — це процес, що відправляє порції інформації (повідомлення) іншому процесу, ім'я якого «споживач».

Наприклад, процес користувача, що породжує рядки для виведення, може виступати як «постачальник», а процес, що виводить ці рядки на друк,

— як «споживач». Один з методів, застосовуваних при реалізації передачі повідомлень, полягає в тому, що заводиться пул (роо1 — це сукупність

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

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

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

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

1.у будь-який момент часу тілько один процес повинний знаходитися у своїй критичній секції;

2.ні один процес не повинний знаходитися у своїй критичній секції безкінечно довго;

3.ні один процес не повинний чекати нескінченно довго входу у свій критичний інтервал. Зокрема:

a)ніякий процес, що нескінченно довго знаходиться поза своєї критичною секцією, не повинний затримувати виконання інших процесів, що очікують входу у свої критичні секції. Іншими

словами, процес, що працює поза своєю критичною секцією, не повинний блокувати критичну секцію іншого процесу;

b)якщо два процеси хочуть ввійти у свої критичні інтервали, то ухвалення рішення про те, хто першим ввійде в критичну секцію, не повинне відкладатися нескінченно довго;

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

Було запропоновано декілька способів рішення цієї проблеми — програмні й апаратні; частні і глобальні, низькорівневі і високорівневі.

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

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. Спеціальний планувальник (диспетчер пам'яті) веде список адрес вільної оперативної пам'яті. З появою нової задачі диспетчер пам'яті переглядає цей список і виділяє для задачі розділ, обсяг якого або дорівнює необхідному, або ледве більше, якщо пам'ять виділяеться не комірками, а деякими дискретними одиницями. При цьому модификується список вільної пам'яті. При звільненні розділів диспетчер пам'яті намагається об'єднати вивільнюваний розділ з одною з вільних ділянок, якщо вони є суміжними. При цьому список вільних ділянок може бути упорядкований або по адресах або по обсязі. Виділення пам'яті під новий розділ може здійснюватися одним із трьох способів:

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

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

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

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

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