Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SRS_11.docx
Скачиваний:
0
Добавлен:
20.11.2019
Размер:
151.87 Кб
Скачать

Срс 11: Модель віртуальних комунікаційних портів. Програмні канали. Черги повідомлень Загальні області пам'яті

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

У разі іменованих областей пам'яті один процес створює загальну область пам'яті:

vAddr = createNamedMemorySegment(segmentName, segmentSize);

а другий її "відкриває":

vAddr = openNamedMemorySegment(segmentName);

У цих викликах segmentName - ім'я області, segmentSize - її розмір. Обидва виклики повертають віртуальну адресу загальної області пам'яті у віртуальному адресному просторі процесу - vAddr.

Для неіменованої області пам'яті створення області здійснюється викликом:

vAddr = createMemorySegment(segmentSize);

а "відкриття":

vAddr = openMemorySegment(hostAddr, hostPid);

де hostAddr - віртуальна адреса області пам'яті у процесу-творця області, hostPid - ідентифікатор процесу-творця області. Цей виклик повертає віртуальна адреса області в адресному просторі процесу, що відкрив область. Зрозуміло, у складі API є системні виклики "закриття"/знищення загальної області пам'яті.

Області пам'яті, що розділяються, проте, породжують ряд проблем як для програмістів, так і для ОС. Програмісти можуть диференціювати права доступу для процесів або організувати взаємне виключення, використовуючи семафори (див. нижчий). Проблеми ОС - організація свопінгу. Очевидно, що ймовірність витіснення сегменту, що розділяється, або сторінки повинна бути тим менше, чим більше процесів розділяють цей сегмент/сторінку. Якщо кожен процес має власний дескриптор сегменту, що розділяється, або сторінки, то облік використання сегменту або сторінки (поля used і dirty) вестимуться по кожному процесу окремо. ОС повинна обробляти, наприклад, такий випадок: два процеси - A і B - розділяють сегмент; процес A провів запис в сегмент і в його дескрипторі сегмент помічений, як "брудний". В той час, коли активний процес B, ухвалюється рішення про витіснення цього сегменту з пам'яті. Але в дескрипторі процесу B цей сегмент має ознаку "чистий", тому сегмент може бути звільнений у фізичній пам'яті без збереження на зовнішній пам'яті і зміни в сегменті, зроблені процесом A, будуть загублені. ОС доводиться вести окрему таблицю сегментів, що розділяються, в якій відображати дійсний їх стан.

З погляду ідентифікації області пам'яті, що розділяються, можуть розглядатися як віртуальні комунікаційні порти. Для загальної області може бути за угодою між розробниками взаємодіючих процесів встановлено зовнішнє ім'я, яке буде використано для отриання доступу. (У Windows 95, наприклад, такі області називаються "Файлами пам'яті, що відображається," - memory mapped file - і для встановлення доступу до них використовуються системні виклики типу create і open). Для неіменованих областей пам'яті можлива передача селектора (номери в таблиці дескрипторів) від одного процесу до іншого.

У системах, які орієнтовані на процесор Intel-Pentium, може використовуватися та обставина, що адресація можлива через дві таблиці дескрипторів - LDT і GDT. За рахунок цього загальний адресний простір процесу може досягати 4 Гбайт. З них молодші 2 Гбайт адресуються через LDT а старші - через GDT. Глобальна таблиця дескрипторів - загальна для всіх процесів, і саме вона може використовуватися для доступу до спільно використовуваної пам'яті. Розміщення в загальних віртуальних адресах зручно для системних програм і динамічних бібліотек, до яких відбуваються часті звернення із додатків: якщо ці компоненти ОС знаходяться в адресному просторі процесу, то звернення до них не вимагають перемикання контексту. Але з іншого боку, це знижує надійність: якщо системні компоненти доступні для додатка, то вони можуть бути ним зіпсовані. Тому така "розкіш" може бути допущена тільки в однокористувацьких системах.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]