Особливості міжпроцесової взаємодії 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Особливості міжпроцесової взаємодії



Тепер можна порівняти характеристики міжпроцесової взаємодії із характерис­тиками взаємодії потоків одного процесу.

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

§ Проблема синхронізації доступу до спільно використовуваних даних є акту­альною для взаємодії потоків і для міжпроцесової взаємодії із використанням розподілюваної пам'яті. Використання механізму передавання повідомлень не ґрунтується на спільно використовуваних даних і не потребує синхронізації

 

 

3.

Для вирішення проблеми міжпроцесової синхронізації необхідно:

§ по-перше, організувати спільну пам'ять між процесами (це може бути розпо­ділювана пам'ять або файл, відображений у пам'ять);

§ по-друге, розмістити в цій пам'яті стандартні синхронізаційні об'єкти (семафо­ри, м'ютекси, умовні змінні);

§ по-третє, використовуючи ці об'єкти, працювати зі спільно використовувани­ми даними, як це робилося у разі використання потоків.

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

 

Лекція №2.

 

Тема: механізм передачі повідомлень.

 

План:

 

 

1.Основи передавання повідомлень (Л1. ст. 151-152).

2.Примітиви передавання повідомлень (Л1. ст. 152).

3.Синхронне й асинхронне предавання повідомлень (Л1. ст. 152-153).

1.

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

Як було вже згадано, засоби передавання повідомлень ґрунтуються на обміні повідомленнями - фрагментами даних змінної довжини. Основою такого обмі­ну є не спільна пам'ять, а канал зв'язку (communication channel). Він забезпечує взаємодію між процесами (для того, щоб спілкуватися, вони повинні створи­ти канал зв'язку) і є абстрактним відображенням мережі зв'язку. Абстрактність каналу дає змогу реалізувати його не тільки на основі мережної взаємодії, але й спільної пам'яті (коли процеси перебувають на одному комп'ютері). При цьому такі зміни в реалізації будуть сховані від процесів, що взаємодіють.

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

В однобічному зв'язку для конкретного процесу допускають передавання да­них тільки в один бік.

 

2.

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

Є два примітиви передавання повідомлень: send (для відсилання повідомлен­ня каналом) і гесеі ve (для отримання повідомлення з каналу).

Розглянемо, як особливості реалізації send і гесеі ve дають змогу виділити різ­ні класи методів передавання повідомлень.

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

 

3.

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

1. Чи може потік бути призупинений під час виконання операції send, якщо пові­домлення не було отримане?

2.Чи може потік бути призупинений під час виконання операції receive, якщо повідомлення не було відіслане?

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

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

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

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

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

§ Якщо пропускна здатність необмежена, очікування можливе тільки для одер­жувача за порожньої черги.

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

Лекція №3.

 

Тема: технології передавання повідомлень.

 

План:

 

 

1.Методи передавання повідомлень за допомогою каналів і черг (Л1 ст.154-155).

2.Методи обміну повідомленнями за допомогою сокетів (Л1. ст. 155-157).

3.Віддалений виклик процедур (Л1 ст. 157).

 

1.

Канали

Канал — це найпростіший засіб передавання повідомлень. Він є циклічним буфе­ром, записування у який виконують за допомогою одного процесу, а читання — за допомогою іншого. У конкретний момент часу до каналу має доступ тільки один процес. Операційна система забезпечує синхронізацію згідно правилу: якщо про­цес намагається записувати в канал, у якому немає місця, або намагається зчита­ти більше даних, ніж поміщено в канал, він переходить у стан очікування.

Розрізняють безіменні та поіменовані канали.

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

До поіменованих каналів (named pipes) є доступ за іменем. Такому каналу мо­же відповідати, наприклад, файл у файловій системі, при цьому будь-який про­цес, який має доступ до цього файла, може обмінюватися даними через відповід­ний канал. Поіменовані канали реалізують непрямий обмін даними.

Обмін даними через канал може бути однобічним і двобічним.

Черги повідомлень

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

 

 

2.

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

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

Особливості протоколу передавання даних і формування адреси сокету ви­значає комунікаційний домен; його потрібно зазначати під час створення кожного сокету. Прикладами доменів можуть бути домен Інтернету (який задає протокол зв'язку на базі TCP/IP) і локальний домен або домен UNIX, що реалізує зв'язок із використанням імені файла (подібно до поіменованого каналу). Сокет можна ви­користовувати у поєднанні тільки з одним комунікаційним доменом. Адреса со­кету залежить від домену (наприклад, для сокетів домену UNIX такою адресою буде ім'я файла).

Способи передавання даних через сокет визначаються його типом. У конкрет­ному домені можуть підтримуватися або не підтримуватися різні типи сокетів.

Наприклад, і для домену Інтернет, і для домену UNIX підтримуються сокети та­ких типів:

потокові (stream sockets) — задають надійний двобічний обмін даними суціль­ним потоком без виділення меж (операція читання даних повертає стільки да­них, скільки запитано або скільки було на цей момент передано);

дейтаграмні (datagram sockets) - задають ненадійний двобічний обмін пові­домленнями із виділенням меж (операція читання даних повертає розмір того повідомлення, яке було відіслано).

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

Перед тим як почати працювати з сокетами, будь-який процес (і клієнт, і сер­вер) має створити сокет за допомогою системного виклику socket(). Параметрами цього виклику задають комунікаційний домен і тип сокету. Цей виклик повертає дескриптор сокету - унікальне значення, за яким можна буде звертатися до цьо­го сокету.

Подальші дії відрізняються для сервера і клієнта. Для сервера виконуються такі дії:

1. Сокет пов'язують з адресою за допомогою системного виклику bind(). Для со­кетів домену UNIX як адресу задають ім'я файла, для сокетів домену Інтернету - необхідні характеристики мережного з'єднання. Далі клієнт для встанов­лення з'єднання й обміну повідомленнями має буде вказати цю адресу.

2.Сервер дає змогу клієнтам встановлювати з'єднання, виконавши системний виклик listen() для дескриптора сокету, створеного раніше.

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

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

Після встановлення з'єднання (і на клієнті, і на сервері) з'явиться можливість передавати і приймати дані з використанням цього з'єднання. Для передавання даних застосовують системний виклик send(), а для приймання - recv().

Зазначену послідовність кроків використовують для встановлення надійного з'єднання. Якщо все, що нам потрібно, - це відіслати і прийняти конкретне пові­домлення фіксованої довжини, то з'єднання можна й не створювати зовсім. Для цього як відправник, так і одержувач повідомлення мають попередньо зв'язати сокети з адресами через виклик bind(). Потім можна скористатися викликами прямого передавання даних: sendto() - для відправника і recvfrom() - для одер­жувача. Параметрами цих викликів задають адреси одержувача і відправника, а також адреси буферів для даних.

 

3.

Технологія віддаленого виклику процедур (Remote Procedure Call, RPC) є прикладом синхронного обміну повідомленнями із підтвердженням отримання. Розглянемо послідовність кроків, необхідних для обміну даними в цьому разі.

1. Операцію send оформляють як виклик процедури із параметрами.

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

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

4. Обчислений результат повертають відправникові як окреме повідомлення.

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

 

Розділ 5. Керування оперативною пам’яттю.

(аудиторних-10/8г., самостійних- 14/8г.)

 

Лекція №1.

 

Тема: Основні поняття та вимоги до керування оперативною пам`яттю.

 

План:

1.Загальні положення керування оперативною пам’яттю (Л1 ст. 183)

2.Спільне використання фізичної пам’яті процесами та передумови введення віртуальної

пам’яті (Л1 ст.184-185).

3.Поняття віртуальної пам’яті (Л1 ст.185-186).

4.Проблема фрагментації пам’яті (Л1 ст.186).

5.Логічна і фізична адресація пам’яті (Л1 ст.187).

6.Спільне використання пам’яті за допомогою базового та межового регістрів

(Л1 ст.187-188).

 

 

1.

 

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

Різні види пам'яті організовані в ієрархію. На нижніх рівнях такої ієрархії пере­буває дешевша і повільніша пам'ять більшого обсягу, а в міру просування ієрархією нагору пам'ять стає дорожчою і швидшою (а її обсяг стає меншим). Найдешев­шим і найповільнішим запам'ятовувальним пристроєм є жорсткий диск комп'юте­ра. Його називають також допоміжним запам'ятовувальним пристроєм (secondary storage). Швидшою й дорожчою є оперативна пам'ять, що зберігається в мікро­схемах пам'яті, встановлених на комп'ютері, - таку пам'ять називають основ­ною пам'яттю (main memory). Ще швидшими засобами зберігання даних є різні кеші процесора, а обсяг цих кешів ще обмеженіший.

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

2.

 

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

 

 

 

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

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

♦ Як виконувати процеси, котрим потрібно більше фізичної пам'яті, ніж вста­новлено на комп'ютері?

♦ Що відбудеться, коли процес виконає операцію записування за невірною ад­ресою (наприклад, процес Р2 - за адресою 0x7500)?

♦ Що робити, коли процесу (наприклад, процесу Р1) буде потрібна додаткова пам'ять під час його виконання?

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

♦ Що робити, коли процесу не потрібна вся пам'ять, виділена для нього?

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

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

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

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

До адрес, використовуваних у програмах, ставляться такі вимоги.

♦ Захист пам'яті. Помилки в адресації, що трапляються в коді процесу, повинні впливати тільки на виконання цього процесу. Коли процес Р2 зробить опера­цію записування за адресою 0x7500, то він і має бути перерваний за помил­кою. Стратегія захисту пам'яті зводиться до того, що для кожного процесу виділяється діапазон коректних адрес, і кожна операція доступу до пам'яті перевіряється на приналежність адреси цьому діапазону.

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

 

 

3.

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

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

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

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

 

4.

 

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

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

 

 

Зовнішня зводиться до того, що внаслідок виділення і наступного звільнення пам'яті в ній утворюються вільні блоки малого розміру - діри (holes). Через це може виникнути ситуація, за якої неможливо виділити неперервний блок пам'яті розміру N, оскільки немає жодного неперервного вільного блоку, розмір якого S > N, хоча загалом обсяг вільного простору пам'яті перевищує N. Так, на рис. 8.2 для виконання процесу Р5 місця через зовнішню фрагментацію не вистачає.

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

 

 

5.

 

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

Логічна або віртуальна адреса - адреса, яку генерує програма, запущена на деякому процесорі. Адреси, що використовують інструкції конкретного процесора, є логічними адресами. Сукупність логічних адрес становить логічний адресний простір. Фізична адреса - адреса, якою оперує мікросхема пам'яті. Прикладна програ­ма в сучасних комп'ютерах ніколи не має справи з фізичними адресами. Спеці­альний апаратний пристрій MMU (memory management unit - пристрій керуван­ня пам'яттю) відповідає за перетворення логічних адрес у фізичні. Сукупність усіх доступних фізичних адрес становить фізичний адресний простір. Отже, як­що в комп'ютері є мікросхеми на 128 Мбайт пам'яті, то саме такий обсяг пам'яті адресують фізично. Логічно зазвичай адресують значно більше пам'яті.

Найпростіша схема перетворення адрес зображена на рис. 8.3.

 

 

 

Алгоритм перетворення логічних адрес у фізичні визначає принцип організації та керування пам`яттю.

6.

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

Одним із найпростіших способів задовольнити ці вимоги є підхід базового і межового регістрів. Для кожного процесу в двох регістрах процесора зберігають два значення - базової адреси (base) і межі (bounds). Кожний доступ до логічної адреси апаратно перетворюється у фізичну адресу шляхом додавання логічної ад­реси до базової. Якщо отримувана фізична адреса не потрапляє в діапазон (base, base+bounds), вважають, що адреса невірна, і генерують помилку (рис. 8.4).

 

 

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

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

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

За такого підходу для процесу виділяють тільки одну пару значень «базова адре­са-межа». Природним розвитком цієї ідеї стало відображення адресного простору процесу за допомогою кількох діапазонів фізичної пам'яті, кожен з яких задають власною парою значень базової адреси і межі. Так виникла концепція сегмента­ції пам'яті.

 

Лекція №2.

 

Тема: Сегментна та сторінкова організація пам`яті.

 

План:

1. Особливості сегментації пам’яті (Л1 ст.188-190).

2. Реалізація сегментації в архітектурі ІА-32 (Л1 ст.190-191).

3. Базові принципи сторінкової організації пам’яті (Л1 ст.191-193).

4. Порівняльний аналіз сторінкової організації пам’яті та сегментації (Л1 ст.193).

 

1.

 

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

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

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

 

 

 

 

Переваги сегментації пам'яті.

· З'явилася можливість організувати кілька незалежних сегментів пам'яті для процесу і використати їх для зберігання даних різної природи. При цьому права доступу до кожного такого сегмента можуть бути задані по-різному.

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

· Фізична пам'ять, що відповідає адресному простору процесу, тепер не обо­в'язково має бути неперервною. Справді, сегментація дає змогу окремим части­нам адресного простору процесу відображатися не в основну пам'ять, а на диск, і довантажуватися з нього за потребою, забезпечуючи виконання проце­сів будь-якого розміру.

· Цей підхід не позбавлений і недоліків.

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

· Керування блоками пам'яті змінної довжини з урахуванням необхідності їх­нього збереженні* на диску може бути досить складним.

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

Сьогодні сегментацію застосовують доволі обмежено передусім через фраг­ментацію і складність реалізації ефективного звільнення пам'яті та обміну із дис­ком. Ширше використання отримав розподіл пам'яті на блоки фіксованої довжи­ни - сторінкова організація пам'яті.

 

 

2.

 

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

Селектор містите індекс дескриптора в таблиці, біт індикатора локальної або глобальної таблиці та необхідний рівень привілеїв.

Для системи задають спільну глобальну таблицю дескрипторів (Global Descr­iptor Table, GDT), а для кожної задачі - локальну таблицю дескрипторів (Local Descriptor Table, LDT).

Дескриптори в ІА-32 мають довжину 64 біти. Вони визначають властивості програмних об'єктів (наприклад, сегментів пам'яті або таблиць дескрипторів).

Дескриптор містить значення бази (base), яке відповідає адресі об'єкта (на­приклад, початок сегмента); значення межі (limit); тип об'єкта (сегмент, таблиця дескрипторів тощо); характеристики захисту.

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

Проте жодного разу не було згадано, що в дескрипторі зберігають фізичну ад­ресу. Річ у тому, що для архітектури ІА-32 внаслідок перетворення логічної адре­си отримують не фізичну адресу, а ще один вид адреси, який називають лінійною адресою.

 

 

3.

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

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

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

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

Сторінкова організація пам'яті повинна мати апаратну підтримку. Кожна ад­реса, яку генерує процесор, ділиться на дві частини: номер сторінки і зсув сторін­ки. Номер сторінки використовують як індекс у таблиці сторінок.

Таблиця сторінок - це структура даних, що містить набір елементів (page-table entries, PTE), кожен із яких містить інформацію про номер сторінки, номер від­повідного їй фрейму фізичної пам'яті (або беспосередньо його базову адресу) та права доступу. Номер сторінки використовують для пошуку елемента в таблиці. Після його знаходження до базової адреси відповідного фрейму додають зсув сторінки, чим і визначають фізичну адресу (рис. 8.7).

 

 

 

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

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



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 265; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.181.209 (0.142 с.)