
- •Огляд і характеристика операційних систем
- •1. По призначенню ос діляться на:
- •2. По режиму обробки даних розрізняють:
- •3. За засобом взаємодії з обчислювальною системою ос діляться на:
- •4. За основним архітектурним принципом ос діляться на:
- •1. Принцип модульності
- •2. Принцип функціональної вибірковості
- •3. Принцип генерованості ос
- •4.Принцип функціональної надлишковості
- •5. Принцип віртуалізації
- •Принцип незалежності програм від зовнішніх пристроїв
- •Принцип сумісності
- •Принцип відкритої і нарощуваної ос
- •Принцип мобільності (переносимості)
- •10. Принцип забезпечення безпеки обчислень.
- •Планування процесів
- •Управління пам'яттю
- •Монопольно використовувані ресурси
- •Файлові системи операційних систем класу Unix
- •Системні засоби взаємодії процесів
- •Література
Управління пам'яттю
Віртуальна і реальна пам'ять
Мультипрограмування буде ефективним тільки у тому випадку, коли декілька процесів одночасно знаходяться в оперативній пам'яті, тоді перемикання процесів не вимагає значного переміщення даних між оперативною і зовнішньою пам'яттю. Але тоді на ОС покладається завдання розподілу оперативної пам'яті між процесами і захисту пам'яті, яка виділена процесу, від втручання іншого процесу. Таким чином, пам'ять є одним з найважливіших ресурсів системи, і від ефективності функціонування менеджера цього ресурсу в значній мірі залежать показники ефективності всієї системи в цілому.
Процесор обробляє дані, які знаходяться в оперативній пам'яті, і процеси розміщують свої коди і дані в адресному просторі, який вони розглядають, як простір оперативної пам'яті. У дуже окремих випадках програміст задає при розробці програми реальні адреси в оперативній пам'яті, в більшості ж випадків між програмістом і середовищем виконання його програми коштує той або інший апарат перетворення адрес. У загальному випадку те адресний простір, в якому пишеться програма, називається віртуальною пам'яттю, на відміну від реальної або фізичної пам'яті - в якій відбувається виконання програми (процесу). Роботу з пам'яттю можна представити у вигляді трьох функцій перетворення, які показані на Малюнку 3.1.
Ріс.3.1. Функції управління пам'яттю |
Функція іменування проводить відображення крапки з простору імен програми в простір адрес у віртуальній пам'яті, іншими словами - переводить символьні імена, використовувані програмістом, у віртуальні адреси.
Функція прив'язки проводить відображення крапки з простору віртуальних адрес в простір реальних адрес, тобто, переводить віртуальні адреси в адреси фізичних елементів пам'яті.
Функція вибірки відображає крапку з простору реальних адрес в значення, тобто, вибирає вміст пам'яті за заданою адресою.
Функція іменування реалізується здебільшого обслуговуючими програмами, ми розглядаємо її в наступному розділі. Функція вибірки завжди реалізується апаратний. У даному розділі нас цікавитиме перш за все функція прив'язки адрес. Відносно її конструктором ОС повинне бути вирішений основне питання: на якому етапі підготовки/виконання програми її виконувати?
Програміст може писати програму, відразу прив'язуючи її до свідомо відомих адрес фізичної пам'яті, - це називається програмуванням в абсолютних адресах. Таке програмування виконується в специфічних випадках, наприклад, для програм, записуваних в ПЗП. Навіть у таких випадках програміст часто користується символічними іменами, покладаючи завдання перекладу імен у фізичні адреси на транслятор. Отримана таким чином програма називається абсолютною або непереміщуваною. Вона може виконуватися тільки, будучи завантаженій за певною адресою оперативній пам'яті.
Всі прикладні програми і переважна більшість системних програм є переміщуваними. Це означає, що в програмі, підготовленій до виконання (у тому образі програми, який зберігається на зовнішній пам'яті), звернення до пам'яті налаштовані на віртуальні адреси, не прив'язані поки до адрес реальної пам'яті.
Відзначимо, що іноді віртуальною пам'яттю називають саме ці властивості апаратури обчислювальної системи і витікаючі з них можливості для процесів працювати з віртуальним адресним простором більшого розміру, чим розмір наявної в системі реальної пам'яті. Ми ж слідуємо ширшій інтерпретації [13]: віртуальна пам'ять це те адресний простір, в якому розробляється процес. Таке розуміння відповідає визначенню ОС "з погляду користувача", яке ми дали в розділі 1.4. В даному випадку ОС приховує від процесу організацію низькорівневого ресурсу (реальній пам'яті) і конструює ресурс більш високого рівня, зручніший в обігу. Така інтерпретація не бере до уваги, на якому етапі - завантаження або виконання - проводиться трансляція адрес, і чи є в системі апаратна підтримка цієї трансляції. У окремому випадку розмір віртуальної пам'яті може бути і менше реальною.
У загальному випадку проектування менеджера пам'яті у складі ОС вимагає вибору трьох основних стратегій:
стратегії розміщення: яку область реальної пам'яті виділити процесу? як вести облік свободной/занятой реальної пам'яті?
стратегії підкачки: коли розміщувати процес (або частина його) в реальній пам'яті?
стратегії витіснення: якщо реальної пам'яті не вистачає для задоволення чергового запиту, то у якого процесу відібрати раніше виділений ресурс реальної пам'яті (або частина його)?
Нижче ми розглянемо способи реалізації цих стратегій для різних моделей пам'яті. Порядок розгляду відповідатиме принципу "від простого до складного" і в основному відображати також і історичний розвиток моделей пам'яті:
фіксовані розділи - модель, що не використовує апаратну трансляцію адрес;
односегментная віртуальна пам'ять - розвиток фіксованих розділів для апаратної трансляції адрес.
моделі віртуальної пам'яті, що використовують розвинені засоби апаратної трансляції адрес;
o багатосегментна;
o сторінкова;
o комбінована сегментно-сторінкова.
моделі віртуальної пам'яті, що є поверненням до простих моделей, але на більш високому рівні:
o плоска;
o одноуровневая.
Фіксовані розділи
Ця модель пам'яті застосовується в обчислювальних системах, що не мають апаратних засобів трансляції адрес. Процес завантажується в безперервну ділянку пам'яті (розділ), прив'язка адрес виконується при завантаженні. Розмір розділу рівний розміру віртуального адресного простору процесу, який, отже, не може перевищувати розміру доступної реальної пам'яті. Процес в ході свого виконання може видавати запити на виділення/звільнення пам'яті. Всі ці запити задовольняються тільки в межах віртуального адресного простору процесу, а отже - в межах виділеного йому розділу реальної пам'яті.
Прикладом ОС, що працює в такій моделі, пам'яті може бути OS/360, що нині вже не застосовується, але існувала в двох основних варіантах: MFT (з фіксованим числом завдань) і MVT (із змінним числом завдань). У першому варіанті при завантаженні ОС реальна пам'ять розбивалася на розділи оператором. Кожне завдання (процес) займало один розділ і виконувалося в нім. У другому варіанті число розділів і їх положення в пам'яті не було фіксованим. Розділ створювався у вільній ділянці пам'яті перед початком виконання завдання і мав розмір, рівний об'єму пам'яті, замовленому завданням. Створений розділ фіксувався в пам'яті на час виконання завдання, але знищувався при закінченні її виконання.
У більш загальному випадку для процесу може виділятися і декілька розділів пам'яті, причому їх виділення/звільнення може виконуватися динамічно (приклад - MS DOS). Проте, загальними завжди є наступні правила:
розділ займає безперервну область реальної пам'яті;
виділений розділ фіксується в реальній пам'яті;
після виділення розділу процес працює з реальними адресами в розділі.
Завдання ефективного розподілу пам'яті (у будь-якій її моделі) зводиться перш за все до мінімізації сумарного об'єму "дірок". Нижче ми даємо визначення дірок, загальні для всіх моделей пам'яті.
Діркою називається область реальної пам'яті, яка не може бути використана. Розрізняють дірки зовнішні і внутрішні. Малюнок 3.2 ілюструє зовнішні і внутрішні дірки в системі OS/360.
Ріс.3.2. Розділи в реальній пам'яті OS/360 |
Внутрішньою діркою називається пам'ять, яка розподілена процесу, але їм не використовується. Так, на Рис 3.2.а процесу 1 виділений розділ P1, але віртуальний адресний простір процесу менше розміру розділу, простір розділу, що залишився, складає внутрішню дірку.
Зовнішньою діркою називається область реальної пам'яті, яка не розподілена ніякому процесу, але дуже мала, щоб задовольнити запит на пам'ять. На Рис 3.2.б сумарний розмір вільних областей, можливо, перевищує запит, але кожна з цих областей окремо менше запиту, тому всі ці вільні області є зовнішніми дірками.
Для управління пам'яттю формуються ті або інші структури (заголовки), що управляють, які також займають пам'ять. У деяких системах загальний об'єм заголовної пам'яті може бути дуже великим, і в таких випадках слід враховувати також і заголовні дірки - області пам'яті, які містять не використовувану в даний момент інформацію, що управляє. У системах з реальною пам'яттю заголовні дірки практично відсутні.
Односегментна модель
Нам невідомі ОС, що підтримують односегментную модель "в чистому вигляді", але її розгляд полегшить розуміння складніших моделей.
Зовні (з погляду програміста) ця модель дуже схожа на модель з фіксованими розділами: програма-процес готується в плоскому віртуальному адресному просторі. Процес займає безперервний простір віртуальної пам'яті, і в реальну пам'ять він також завантажується в один безперервний розділ (сегмент). Сегмент може починатися з будь-якої адреси реальної пам'яті і мати будь-який розділ, що не перевищує, проте, розміру реальної пам'яті. Істотна відмінність сегментної моделі полягає в тому, що вона використовує апаратну динамічну трансляцію адрес. Завантажений в реальну пам'ять і процес, що виконується, продовжує звертатися до пам'яті, використовуючи віртуальні адреси, і лише при кожному конкретному зверненні віртуальна адреса апаратний переводиться в реальний. У обчислювальній системі, що підтримує односегментную модель, повинен існувати регістр дескриптора сегменту, вміст якого складається з двох полів: початкової (базового) адреси сегменту в реальній пам'яті і довжини сегменту. Коли процес розміщується в пам'яті, для виділеного йому сегменту формується дескриптор, який записується у вектор полягання в контексті процесу. При перемиканні контексту дескриптор сегменту завантажується в апаратний регістр дескриптора сегменту і служить тією "таблицею трансляції", по якій апаратура переводить віртуальні адреси в реальні. Сама трансляція адрес відбувається по простому алгоритму. Оскільки віртуальний адресний простір процесу є лінійною послідовністю адрес, що починається з 0, віртуальна адреса є простим зсувом відносно початку сегменту. Реальна адреса виходить складанням віртуальної адреси з базовою адресою, вибраною з дескриптора сегменту, як показано на Малюнку 3.4. Єдиний шлях для виходу процесу за межі свого віртуального адресного простору - завдання віртуальної адреси, більшої, ніж розмір сегменту. Цей шлях легко може бути перекритий, якщо апаратура при трансляції адрес порівнюватиме віртуальну адресу з довжиною сегменту і виконуватиме переривання-пастку, якщо віртуальна адреса більша.
Ріс.3.4. Односегментная модель |
Та обставина, що процес працює у віртуальних адресах, робить можливим переміщення сегментів в реальній пам'яті. Перемістивши процес в іншу область реальної пам'яті, ОС просто змінює поле базової адреси в дескрипторі його сегменту. Оскільки, як і в моделі з фіксованими розділами, реальна пам'ять розподіляється безперервними блоками змінної довжини, тут застосовуються ті ж стратегії розміщення. Але можливе тут переміщення сегментів є ефективним способом боротьби із зовнішніми дірками. Сегменти переписуються в реальній пам'яті так, щоб вільних місць між ними не залишалося, весь вільний простір зливається в один великий вільний блок і, таким чином, виявляється доступним для подальшого розподілу.
Багатосегментна модель
Розширимо модель, розглянуту в попередньому розділі на випадок N сегментів.
Віртуальний простір процесу розбивається на сегменти, які нумеруються від 0 до N-1. Віртуальна адреса, таким чином, складається з двох частин: номери сегменту і зсуву в сегменті. Ці частини можуть або представлятися окремо кожна, або упаковуватися в одне адресне слово, в якому певне число старших розрядів інтерпретуватиметься як номер сегменту, а частина, що залишилася, - як зсув. У першому випадку сегменти можуть розміщуватися довільним чином у віртуальному адресному просторі. У другому випадку створюється враження плоского адресного простору з адресами від 0 до максимально можливої при даній розрядності віртуальної адреси, але в цьому просторі можуть бути дірки - віртуальні адреси для процесу недоступні - через відсутність відповідних сегментів або із-за сегментів, довжина яких менше максимально можливою.
Кількість сегментів і максимальний розмір сегменту обмежується апаратурою - розрядністю полів адресного слова. При виділенні процесу реальної пам'яті кожен сегмент розміщується в безперервній області реальної пам'яті, але сегменти, суміжні у віртуальній пам'яті, можуть потрапляти в несуміжні області пам'яті реальної. Тепер для процесу вже недостатньо одного дескриптора сегменту - він повинен мати таблицю таких дескрипторів у складі свого блоку контексту. Апаратний регістр дескриптора сегменту перетворюється на регістр адреси таблиці дескрипторів, він зберігає покажчик на таблицю дескрипторів активного процесу і перезавантажується при зміні активного процесу. Обчислення реальної адреси апаратурою декілька ускладнюється, як показано на Малюнку 3.5:
вибирається сегментна частина віртуальної адреси, вона служить індексом в таблиці дескрипторів; по індексу вибирається запис тієї таблиці, адреса якої знаходиться в регістрі адреси таблиці дескрипторів;
вибраний запис є дескриптором сегменту, частина віртуальної адреси, відповідна зсуву, порівнюється з полем довжини в дескрипторі;
якщо зсув в сегменті не перевищує його довжини, обчислюється реальна адреса як сума базової адреси з дескриптора сегменту і зсуву з віртуальної адреси.
Зразкова структура апаратного підтримуваного дескриптора сегменту приведена на Малюнку 3.6. Підкреслюємо, що дана структура не є обов'язковою, для всієї комп'ютерної архітектури, ми привели лише найбільш поширений її варіант і використовували найбільш імена полів, що часто вживалися.
Ріс.3.5. Трансляція адрес. Багатосегментна модель |
|
Ріс.3.6. Зразкова структура дескриптора сегменту |
|
Допустима кількість сегментів визначається розрядністю відповідного поля віртуальної адреси і може бути вельми великим. Або апаратура повинна мати спеціальний регістр розміру таблиці дескрипторів (такий регістр є в Intel-Pentium), або ОС повинна готувати для процесу таблицю максимально можливого розміру, відзначаючи в ній дескриптори неіснуючих сегментів (наприклад, нульовим значенням поля size). Відзначимо, що для систем, що упаковують номер сегменту і зсув в одне адресне число, розрядність зсуву не є обмеженням на довжину віртуального сегменту. Віртуальний сегмент більшого розміру представляється в таблиці двома і більш обов'язково суміжними дескрипторами. З погляду процесу він звертається до одного сегменту, задаючи в нім великий зсув, на самій же справі переповнювання поля зсуву переноситься в полі номера сегменту. Якщо ж проста двійкова арифметика не забезпечує модифікацію номера сегменту, можливість роботи з великими сегментами може підтримуватися ОС шляхом особливої обробки переривання-пастки "захист пам'яті".
Які переваги багатосегментної моделі пам'яті?
Найперша перевага полягає в тому, що у процесу з'являється можливість розмістити дані, що обробляються різним чином, в різних сегментах свого віртуального простору (так, в ОС Unix, наприклад, кожен процес має при початку виконання три сегменти: кодів, даних і стека). Кожному сегменту можуть бути визначені свої права доступу. Оскільки звернення до пам'яті можуть бути трьох видів: читання, запис і передача управління, то для опису прав доступу достатньо 3-бітового поля Read-Write-eXecute, кожен розряд якого визначає дозвіл один з видів доступу. Апаратні засоби більшості архітектури забезпечують контроль права доступу при трансляції адрес: поле прав доступу включається в дескриптор сегменту і, якщо вид звернення, що поступив, не дозволений, то виконується переривання-пастка "порушення доступу".
Інша важлива перевага багатосегментної моделі полягає в тому, що процес має можливість використовувати віртуальний адресний простір, розмір якого більший, ніж розмір доступної реальної пам'яті. Це досягається за рахунок того, що не обов'язково всі сегменти процесу повинні одночасно знаходитися в реальній пам'яті. Дескриптор кожного сегменту містить біт present, який встановлений в 1, якщо сегмент підкачаний в оперативну пам'ять, або в 0 - якщо сегмент витиснений з неї. Апаратура трансляції адрес перевіряє цей біт і при нульовому його значенні виконує переривання-пастку "відсутність сегменту" (segment falure). На відміну від більшості інших пасток, які в основному сигналізують про помилки, при яких подальше виконання процесу неможливе, ця не приводить до фатальних для процесу наслідків. ОС, обробляючи це переривання, знаходить образ витисненого сегменту на зовнішній пам'яті, і підкачує його в реальну пам'ять. Природно, що процес, що звернувся до витисненого сегменту, переводиться в очікування, це очікування може затягнутися, якщо у ОС є проблеми з ресурсом реальної пам'яті. Коли сегмент буде підкачаний, процес перейде в чергу готових і буде активізований знов з тієї команди, яка викликала переривання-пастку. У тих апаратних системах, які не обробляють біт присутності в дескрипторі сегменту, можна замість нього використовувати поле size: ОС повинна скидати це поле в 0 при витісненні сегменту і відновлювати при його підкачці.
Надзвичайно важливою перевагою багатосегментної моделі є можливість розділення (сумісного використання) сегментів процесами. Процеси можуть бути розроблені так, щоб віртуальні простори два або більш за процеси перекривалися в якихось областях. Процеси можуть використовувати загальний віртуальний простір для обміну даними. Реалізація цієї можливості в якійсь мірі залежить від апаратних засобів. У багатьох обчислювальних системах процес може працювати з декількома таблицями дескрипторів, оскільки в системі є декілька регістрів адрес таблиць (так в процесорі Intel 80286 і подальших передбачено дві таблиці, звані локальною і глобальною). Рішення, що використовує це властивість, полягає в тому, що дескриптор сегменту, що розділяється, поміщається в загальну для всіх процесів (глобальну) таблицю, такий сегмент може бути доступним для всіх процесів і має загальний віртуальний номер для всіх процесів. Інше рішення, можливе і за наявності тільки однієї таблиці для кожного процесу, полягає в тому, що для загального сегменту створюється по запису в таблиці кожного процесу, з ним що працює, для кожного процесу цей сегмент має свій віртуальний номер. Друге рішення представляється вдалішим з погляду захисту, оскільки, по-перше, доступ до сегменту мають тільки ті процеси, в таблицях яких створені відповідні дескриптори, по-друге, є можливість дати різним процесам разные права доступу до сегменту, що розділяється. Але за таке рішення доводиться платити тим, що при свопінгу сегменту, що розділяється, і при обліку його використання необхідно коректувати його дескриптори в таблицях всіх процесів.
Сторінкова модель
Сторінкову організацію пам'яті легко представити як багатосегментну модель з фіксованим розміром сегменту. Такі сегменти називаються сторінками. Вся доступна реальна пам'ять розбивається на сторінкових кадрів (page frame), причому межі кадрів в реальній пам'яті фіксовані. Іншими словами, реальна пам'ять представляється як масив сторінкових кадрів. Віртуальна адреса складається з номера сторінки і зсуву в сторінці, система підтримує таблицю дескрипторів сторінок для кожного процесу. Дескриптор сторінки в основному подібний до дескриптора сегменту, але в нім може бути скорочена розрядність поля base, оскільки в нім зберігається не повна реальна адреса, а тільки номер сторінкового кадру, а необхідність в полі size взагалі відпадає, оскільки розмір сторінок фіксований. Проблема розміщення значно спрощується, оскільки будь-який сторінковий кадр підходить для розміщення будь-якої сторінки, необхідно тільки вести облік вільних кадрів. За рахунок цього сторінкова організація виявляється зручною навіть за відсутності свопінгу, оскільки дозволяє розмістити безперервний віртуальний адресний простір в несуміжних сторінкових кадрах. (Іноді для позначення свопінгу на рівні сторінок застосовують спеціальний термін "paging" - сторінковий обмін.) Зовнішні дірки в сторінковій моделі відсутні, зате з'являються внутрішні дірки за рахунок недовикористаних сторінок. За наявності в системі свопінгу нульове значення бита present викликає переривання-пастку "сторінкову відмову" (page falure) і підкачку сторінки в реальну пам'ять. Для обліку занятых/свободных сторінок підходить техніка бітової карти, але більшість ОС використовують як елементи карти (таблиці сторінкових кадрів) не биті, а куди складніші структури, з яких можуть складатися і багатозв'язкові списки (у тому числі і списки вільних кадрів).
Який розмір сторінки вигідніший - великий або малий? Міркування, які можуть вплинути на вибір розміру наступні:
при малих сторінках виходять менші внутрішні дірки;
при малих сторінках менше вірогідність сторінкової відмови (оскільки більше сторінок поміщаються в пам'яті);
при великих сторінках менші апаратні витрати (оскільки розбиття пам'яті на великі блоки обійдеться дешевшим);
при великих сторінках менші заголовні дірки і витрати на пошук і управління сторінками (таблиці мають менший розмір);
при великих сторінках вище ефективність обміну із зовнішньою пам'яттю.
Сегментно-сторінкова модель
З попереднього викладу повинно бути ясно, що сегментна модель пам'яті орієнтована більшою мірою на програміста, а сторінкова - на ОС. Програмістові зручно компонувати команди і дані свого процесу в блоки змінної довжини (сегменти). ОС же зручніше управляти пам'яттю, розбитою на блоки постійної довжини (сторінки). Природним чином розвитку моделей пам'яті з'явилося об'єднання достоїнств цих двох моделей в одній - сегментно-сторінковою.
Віртуальна адреса тепер складається з трьох частин - номери сегменту, номери сторінки в сегменті і зсуву в сторінці. Апарат трансляції адрес, представлений на Малюнку 3.8, принаймні, трьохкроковий:
регістр адреси дескриптора указує на таблицю сегментів, з неї вибирається дескриптор сегменту, а з останнього - адреса таблиці сторінок;
з таблиці сторінок вибирається дескриптор сторінки, а з нього - номер сторінкового кадру;
реальна адреса виходить складанням базової адреси сторінкового кадру із зсувом в сторінці.
Ріс.3.8. Трансляція адрес. Cегментно-страничная модель |
Серйозним недоліком цієї моделі є багатоступінчатість трансляції адрес. Ця проблема вирішується на апаратному рівні шляхом застосування надшвидкодіючої (зазвичай асоціативною) пам'яті для зберігання частини таблиць.
Оскільки в моделі, приведеній на рис.3.8, кожен сегмент має власну таблицю сторінок, самі таблиці сторінок можуть займати значний об'єм в пам'яті. Просте вирішення цієї проблеми представляє Windows 3.x: у системі існує єдина таблиця сторінок. Сегментна частина трансляції адреси має, таким чином, на виході адресу загалом для всіх процесів віртуальному сторінковому просторі, об'єм якого перевищує об'єм реальної пам'яті не більш, ніж в 4 рази. Подібне ж, хоча і гнучкіше і захищеніше рішення представляє VSE: система забезпечує загальний об'єм віртуальної пам'яті (до 2 Гбайт), який розбивається на розділи (до 12 статичних і до 200 динамічних), сумарний об'єм адресних просторів всіх розділів не перевищує загального об'єму віртуальної пам'яті. Простота рішення, проте, може істотно позначатися на його ефективності: по-перше, із-за обмежень на розмір віртуальної пам'яті, по-друге, із-за необхідності виділяти суміжні дескриптори в таблиці сторінок для сторінок, суміжних у віртуальній пам'яті. Тому дійсно багатозадачні системи застосовують множинні таблиці сторінок і включають пам'ять, займану таблицями сторінок, в сторінковий обмін. Витіснення і завантаження приватних таблиць сторінок проводиться або виключно самою ОС (Unix), або ОС використовує для цього наявні апаратні засоби (так, ОС, орієнтовані на Intel-Pentium, використовують каталоги сторінок).
З погляду програміста, він має справу з сегментами, API управління пам'яттю - такий же, як і в сегментній моделі. Сторінкова частина адресації для процесів абсолютно прозора, та зате ця частина використовується ОС для ефективної організації свопінгу.
Плоска модель пам'яті
Починаючи з моделі Intel-80386, в мікропроцесорах Intel-Pentium адреса складається з 16-розрядного номера сегменту і 32-розрядного зсуву. 32-розрядне поле зсуву дозволяє адресувати до 4 Гбайт в межах одного сегменту, що більш ніж достатньо для більшості мислимих застосувань і дозволяє реалізувати дійсно "плоску" (flat) модель віртуальної пам'яті процесу, що є лінійним безперервним простором адрес..
Проте, при розмірі сторінки 4 Кбайт таблиця сторінок повинна містити більше 106 елементів і займати 4 Мбайт пам'яті. Для економії пам'яті апаратура трансляції адреси мікропроцесора підтримує таблиці сторінок двох рівнів. Сторінкова таблиця верхнього рівня називається каталогом сторінок. Старші 10 байт 32-розрядного зсуву є номером елементу в сторінковому каталозі. Елемент сторінкового каталога адресує таблицю сторінок другого рівня. Наступні 10 байт зсуву є номером елементу в таблиці сторінок другого рівня. Елемент таблиці другого рівня адресує сторінковий кадр в реальній пам'яті, а молодші 12 байт зсуву є зсувом в сторінці. Сегментна частина апарату трансляції адреси виявляється зайвою, в Intel-Pentium вона не може бути відключена, але той же ефект досягається, якщо кожному процесу призначається тільки один сегмент, і для процесу створюється таблиця сегментів, що містить тільки один елемент. Поле base цього елементу адресує сторінковий каталог процесу, а кожен елемент сторінкового каталога - одну таблицю сторінок. Структури елементів каталога сторінок і таблиці сторінок другого рівня ідентичні, кожна таблиця сторінок (каталог або таблиця другого рівня) містить 1024 елементи і сама займає сторінковий кадр в пам'яті. Таблиці сторінок беруть участь в сторінковому обміні так само, як і сторінки, що містять будь-які інші дані і коди.
У 4-Гбайтном адресному просторі з'являється можливість розмістити не тільки коди і дані процесу, але і об'єкти, використовувані їм спільно з іншими процесами, у тому числі і модулі самої ОС. В цьому випадку звернення процесу до ОС відбувається як звернення до процедури, розміщеної в адресному просторі самого процесу. У сучасних ОС структура адресного простору процесу зазвичай буває наступною:
сама молодша частина адресного простору зазвичай для процесу недоступна, вона використовується ОС для підтримки реального режиму; розмір цієї частини адресного простору зазвичай не менше 4 Мбайт, що відповідає одному елементу сторінкового каталога;
далі розміщується приватний адресний простір процесу, що містить його коди, локальні дані, стік;
вище розміщуються "прикладні" загальні області пам'яті, використовувані декількома процесами спільно;
ще вище - системні модулі, що працюють в непривілейованому режимі, ці модулі спільно використовуються всіма процесами;
нарешті, в самій верхній частині розміщуються системні модулі, що працюють в режимі ядра (рівень привілеїв - 0), ці модулі також спільно використовуються.
Сумісне використання пам'яті забезпечується або тим, що елементи каталогів різних процесів адресують одну і ту ж таблицю сторінок другого рівня, або тим, що таблиці сторінок другого рівня різних процесів адресують один і той же сторінковий кадр. У першому випадку віртуальні адреси спільно використовуваних об'єктів є однаковими для всіх процесів, в другому - разными. Всі системи використовують перший спосіб для системних модулів, але різні способи для "прикладних" загальних областей пам'яті.
Більшість розробників застосувань гаряче вітали введення плоскої моделі пам'яті в сучасних ОС (OS/2 Warp, Windows 95, Windows NT), оскільки представлення віртуальної адреси у вигляді одного 32-розрядного слова позбавляє програміста від необхідності розрізняти ближні і дальні покажчики і спрощує програмування. Відмова від сегментної структуризації віртуального адресного простору де в чому обмежує можливості програміста. Велика ж ефективність плоскої моделі пам'яті є об'єктивним чинником, оскільки, по-перше, операція з 32-розрядними адресними словами зменшує число команд в програмі, а по-друге, оскільки в 4-Гбайтном віртуальному адресному просторі процесу можуть бути розміщені і процедури, що реалізовують системні виклики, то звернення процесу до ОС відбуваються як до власних локальних процедур і не вимагають перемикань контексту.
Декілька ускладнюється захист пам'яті при фактичній відмові від сегментації. У Intel-Pentium в апаратному дескрипторі сегменту передбачено п'ять двійкових розрядів, які можуть бути використані для цілей захисту, а в дескрипторі сторінки - тільки два таких розряду. Надійність захисту пам'яті в сучасних ОС визначається тільки тим, наскільки активно і акуратно ці можливості використовуються.