Теорія операційної системи

:: Меню ::

Головна
Представлення даних в обчислювальних системах
Машинні мови
Завантаження програм
Управління оперативною пам'яттю
Сегментна і сторінкова віртуальна пам'ять
Комп'ютер і зовнішні події
Паралелізм з точки зору програміста
Реалізація багатозадачності на однопроцесорних комп'ютерах  
Зовнішні пристрої
Драйвери зовнішніх пристроїв
Файлові системи
Безпека
Огляд архітектури сучасних ОС

:: Друзі ::

Карта сайту
 

:: Статистика ::

 

 

 

 

 

Программа для оптимизации и раскрутки сайта | срочный автовыкуп | Серверы и Системы хранения данных, hdd

Сегментна і сторінкова віртуальна пам'ять

У системах з сегментною і сторінковою адресацією віртуальна адреса має складну структуру. Він розбитий на два бітові поля: селектор сторінки (сегменту) і зсув у нім. Відповідно, адресний простір виявляється таким, що складається з дискретних блоків. Якщо всі ці блоки мають фіксовану довжину і утворюють разом безперервний простір, вони називаються сторінками (мал. 5.1).

Мал. 5.1. Сторінкова віртуальна пам'ять, а невживаним частинам блоковиии

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

Мал. 5.2. Сегментна віртуальна пам'ять

Така адресація реалізується апаратний. Процесор має спеціальний пристрій, званий диспетчером пам'яті або, як його називали в старій російськомовній літературі УУП (Пристрій Управління Пам'яттю ср. MMU — Memory Management Unit). У деяких процесорах, наприклад в Mc68020 або Mc68030 або в деяких RISC-системах, цей пристрій реалізований на окремому кристалі; у інших, таких як х86 або сучасні RISC-процессоры, диспетчер пам'яті інтегрований в процесор.
У Pdp-11 сегментів всього вісім, тому дескриптори кожного з них розміщуються в окремому регістрі (насправді, регістрів не вісім, а шістнадцять — вісім для призначеного для користувача адресного простору і вісім для системного). На 32-розрядних машинах кількість сегментів вимірюється тисячами, а сторінок — інколи і мільйонами, тому доводиться удаватися до складнішої схеми.
Диспетчер пам'яті містить регістр — покажчик на таблицю трансляції. Ця таблиця розміщується десь в ОЗУ. Її елементами є дескриптори кожної страніци/сегмента. Такий дескриптор містить права доступу до сторінки, ознака присутності цієї сторінки в пам'яті і фізична адреса страніци/сегмента. Для сегментів в дескрипторі також зберігається його довжина.
Більшість реальних програм використовують далеко не весь адресний простір процесора, відповідно таблиця трансляції не обов'язково тримає всі допустимі дескриптори. Тому практично всі диспетчери пам'яті мають ще один регістр — обмежувач довжини таблиці трансляїії. Сторінки або сегменти, селектор яких перевершує обмежувач, не входять у віртуальний адресний простір процесу. Як правило, диспетчер пам'яті має також кеш (cache) дескрипторів — швидку пам'ять з асоціативним доступом. У цій пам'яті зберігаються дескриптори часто використовуваних сторінок. Алгоритм доступу до пам'яті за віртуальною адресою page: off set складається з наступних кроків (мал. 5.3).

Мал. 5.3. Блок-схема алгоритму диспетчера пам'яті

  • Перевірити, чи існує сторінка page взагалі. Якщо сторінки не існує, виникає особлива ситуація помилки сегментації (segmentation violation) (поняття особливої ситуації (виключення) детальніше знається на Разд.6).
  • Спробувати знайти дескриптор сторінки в кеші.
  • Якщо його немає в кеші, завантажити дескриптор з таблиці в пам'яті.
  • Перевірити, чи має процес відповідне право доступу до страпіце Інакше також виникає помилка сегментації.
  • Перевірити, чи знаходиться сторінка в оперативній пам'яті. Якщо її там пет, виникає особлива ситуація відсутності сторінки або сторінкові відмова (page fault). Як правило, реакція на неї полягає в тому, що викликається спеціальна програма-обробник (trap — пастка), яка завантажує необхідну сторінку з диска. У багатопотокових системах під час такого завантаження може виконуватися інший процес.
  • Якщо сторінка є в пам'яті, узяти з її дескриптора фізичну адресу phys_addr.
  • Якщо ми маємо справу з сегментною адресацією, порівняти зсув в сегменті з довжиною цього сегменту. Якщо зсув оказаюсь більший, також виникає помилка сегментації.
  • Провести доступ до пам'яті за адресою phys_addr[offset].

Видно, що така схема адресації досить складна. Проте в сучасних процесорах все це реалізовано апаратний і, завдяки кешу дескрипторів і іншим хитруванням, швидкість доступу до пам'яті виходить майже такій же, як і при прямій адресації. Крім того, ця схема має неоцінимі переваги при реалізації багатозадачних ОС.
По-перше, ми можемо пов'язати з кожним завданням свою таблицю трансляції, а значить і своє віртуальний адресний простір. Завдяки цьому навіть в багатозадачних ОС ми можемо користуватися абсолютним завантажувачем. Крім того, програми виявляються ізольованими один від одного, і ми можемо забезпечити їх безпеку.
По-друге, ми можемо скидати на диск рідко використовувані області віртуальної пам'яті програм — не всю програму цілком, а лише її частина. На відміну від оверлейних завантажувачів, програма при цьому взагалі не зобов'язана знати, яка її частина буде скинута.
Інша справа, що в системах реального часу програмі може бути потрібно, щоб певні її частини ніколи не скидалися на диск. Система реального часу зобов'язана гарантувати час реакції, і це гарантований час звичайний набагато менше часу доступу до диска. Код, оброблювальний подію, і використовувані при цьому дані мають бути завжди в пам'яті.
По-третє, програма не зобов'язана займати безперервну область фізичної пам'яті. При цьому вона цілком може бачити безперервний віртуальний адресний простір. Це різко спрощує боротьбу з фрагментацією пам'яті, а в системах із сторінковою адресацією проблема зовнішньої фрагментації фізичної пам'яті взагалі знімається.
У більшості систем із сторінковим диспетчером вільна пам'ять відстежується за допомогою бітової маски фізичних сторінок. У цій масці вободной сторінці відповідає 1, а зайнятий — 0. Якщо комусь потрібний кордон, система просто шукає в цій масці встановлений біт. В результаті віртуальний простір програми може опинитися відображує на Фізичні адреси дуже химерним чином, але це нікого не хвилює — швидкість доступу до всіх сторінок однакова (мал. 5.4).

Мал. 5.4. Розподіл адресного простору по фізичній пам'яті

По-четверте, система може забезпечувати не лише захист програм один від одного, але до певної міри і захист програми від самої себе — наприклад, від помилкового запису даних на місце коди або спроби виконати дані.
По-п'яте, різні завдання можуть використовувати спільні області пам'яті для взаємодії або, скажімо, просто для того, щоб працювати з однією копією бібліотеки підпрограм.
Перераховані переваги настільки серйозні, що вважається за неможливе реалізувати багатозадачну систему спільного призначення, таку як UNIX або System/390 на машинах без диспетчера пам'яті.
Для систем реального часу, втім, віртуальна пам'ять виявляється швидшою шкідлива, чим даремна: наявність диспетчера пам'яті збільшує об'єм контексту процесу (це поняття детальніше обговорюється в разд. Витісняюча багатозадачність), скористатися ж головною перевагою — можливістю сторінкового обміну — завдання реального часу повною мірою не можуть. Тому такі системи, що навіть працюють на процесорах з вбудованим диспетчером пам'яті, часто цей диспетчер не використовують. Навіть якщо віртуальна пам'ять доступна, система РВ (реального часу) зобов'язана надавати засоби блокування коди і даних (не обов'язково всіх) призначеного для користувача процес са у фізичній пам'яті.
Окремою проблемою при розробці системи із сторінковою або сегментною адресацією є вибір розміру сторінки або максимального розміру сегменту. Цей розмір визначається шириною відповідного бітового поля адреси і тому має бути мірою двійки.
З одного боку, сторінки не мають бути дуже великими, оскільки це може привести до внутрішньої фрагментації і перекачування дуже великих об'ємів даних при скиданні сторінок на диск. З іншого боку, сторінки не мають бути дуже маленькими, оскільки це приведе до надмірного збільшення таблиць трансляції, необхідного об'єму кеша дескрипторів і так далі
У реальних системах розмір сторінки міняється від 512 байт в машин сімейства VAX до декількох кілобайт. Наприклад, х86 має сторінку розміром 4 Кбайт. Деякі диспетчери пам'яті, наприклад в Мс6801/2/30, мають змінний розмір сторінки — система при запуску програмує диспетчер і встановлює, окрім іншого, цей розмір, і далі працює із сторінками вибраного розміру. В процесора i860 розмір сторінки перемикається між 4 Кбайтамі і 4 Мбайтамі.
З сегментними диспетчерами пам'яті ситуація складніша. З одного боку, хочеться, щоб один програмний модуль збожеволів в сегмент, тому сегменти зазвичай роблять великими, від 32 Кбайт і більш. З іншого боку, хочеться, щоб в адресному просторі можна було зробити багато сегментів. Крім того, може виникнути проблема: як бути з великими нероздільними об'єктами, наприклад хэш-таблицами компіляторів, під які часто виділяються сотні кілобайт.
В результаті ряд машин надає двоступінчату віртуальну пам'ять — сегментну адресацію, в якій кожен сегмент, у свою чергу, розбитий на сторінки. Це дає ряд дрібних переваг, наприклад, дозволяє давати права доступу сегментам, а підкочування з диска здійснювати посторінковий. Таким чином, організована віртуальна пам'ять в IBM System 370 і ряду інших великих комп'ютерів, а також в х86. Правда, в останньому віртуальна пам'ять використовується декілька дивним чином.

Адресний простір х86
х86 може працювати з двома типами адрес:
32-розрядною адресою, в якій 16 біт задають зсув в сегменті, 14 біт— номер сегменту і 2 біта використовуються для різних загадкових цілей. При цьому розмір сегменту не більше 64 Кбайт, а спільний об'єм віртуальної пам'яті не перевищує 1 Гбайта.
48-розрядною адресою, в якій зсув в сегменті займає 32 біта. В цьому випадку розмір сегменту може бути до 4 Гбайт, а спільний об'єм віртуальної пам'яті до 244 байт. У обох випадках сегмент може бути розбитий на сторінки по 4 Кбайт.
При цьому сегментна частина адреси і його зсув лежать в різних регістрах, і з ними можна працювати окремо. У реальному режимі можливість такої роботи породжує весь "зоопарк моделей пам'яті", з якими знайомі ті, КТО писав на З для MS DOS. У захищеному режимі х86 більшість систем програмування виділяють програмі один сегмент з 32-розрядним зсувом, і програма живе там так, ніби це звичайна машина з 32-розрядним лінійним адресним простором. Так поступають всі відомі авторам реалізації Unix для х86, ряд так званих розширювачів ДОС (DOS extenders), Oberon/386, Novell Netware, реалізації Win32 і так далі

 

:: Реклама ::

 

:: Посилання ::


 

 

 


Copyright © Kivik, 2017