Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_Арх.doc
Скачиваний:
44
Добавлен:
20.02.2016
Размер:
1.27 Mб
Скачать

Лабораторна робота №9 Тема: Ієрархічна структура пам'яті. Віртуальна пам’ять.

Ієрархічна структура пам'яті є традиційним рішенням проблеми збереження великої кількості даних. Вона зображена на мал. 6.7. Зверху знаходяться регістри процесора. Доступ до регістрів здійснюється швидше всього. Далі йде кеш-пам'ять, обсяг якої зараз складає від 32 Кбайт до декількох мегабайт. Потім - основна пам'ять, що у теперішній час може уміщати від 16 Мбайт до десятків гігабайтів. Далі йдуть магнітні диски і, нарешті, нагромаджувачі на магнітній стрічці й оптичні диски, що використовуються для збереження архівної інформації.

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

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

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

Нагромаджувачі на магнітних стрічках ми розглядати не будемо, оскільки вони дуже рідко використовуються; до того ж про них практично нічого сказати.

Віртуальна пам'ять

В перших комп'ютерах пам'ять була дуже малою по об’єму і до того ж дорого коштувала. IBM-650, найкращий комп'ютер того часу (кінець 50-х років), містив тільки 2000 слів пам'яті. Один з перших 60 компіляторів, ALGOL, був написаний для комп'ютера з розміром пам'яті 1024 слова. Древня система з поділом часу прекрасно працювала на комп'ютері PDP-1, загальний розмір пам'яті якого складав 4096 18-бітних слів для операційної системи і користувальницьких програм. У ті часи програмісти витрачали дуже багато часу на те, щоб вмістити свої програми в малюсіньку пам'ять. Часто доводилось використовувати алгоритм, що працює набагато повільніше іншого алгоритму, оскільки кращий алгоритм був занадто великим по розміру і програма, у якій використовувався цей кращий алгоритм, могла не поміститися в пам'ять комп'ютера.

Традиційним рішенням цієї проблеми було використання допоміжної пам'яті (наприклад, диска). Програміст поділяв програму на кілька частин, так званих оверлеїв, кожний з який міг поміститися в пам'ять. Щоб прогнати програму, спочатку треба було зчитувати і запускати перший оверлей. Коли він завершувався, потрібно було зчитувати і запускати другий оверлей і т.д. Програміст відповідав за розбивку програми на оверлеї і вирішував, у якому місці допоміжної пам'яті повинний був зберігатися кожен оверлей, контролював передачу оверлеїв між основною і допоміжною пам'яттю і взагалі керував усім цим процесом без будь-якої допомоги з боку комп'ютера. Хоча ця технологія широко використовувалася протягом багатьох років, вона вимагала тривалої кропіткої роботи, зв'язаної з керуванням оверлеями. У 1961 році група дослідників з Манчестера (Англія) запропонувала метод автоматичного виконання процесу накладення, при якому програміст міг узагалі не знати про цей процес. Цей метод, що зараз називається віртуальною пам'яттю, мав очевидну перевагу, оскільки звільняв програміста від величезної кількості нудотної роботи. Вперше цей метод був використаний у ряді комп'ютерів, випущених у 60-і роки. До початку 70-х років віртуальна пам'ять з'явилася в більшості комп'ютерів. В даний час навіть комп'ютери на одній мікросхемі, у тому числі Pentium II і UltraSPARC II, містять дуже складні системи віртуальної пам'яті.

Приклади віртуальної пам'яті

У цьому розділі ми поговоримо про віртуальну пам'ять у системах UNIX і NT. З погляду програміста вони багато в чому подібні.

Віртуальна пам'ять UNIX

Модель пам'яті в системі UNIX досить проста. Кожен процес має три сегменти: код, дані і стек, як показано на мал. 6.8. У машині з лінійним адресним простором код звичайно розташовується в нижній частині пам'яті, а за ним йдуть дані. Стек міститься у верхній частині пам'яті. Розмір коду фіксований, а дані і стек можуть збільшуватися або зменшуватися. Таку модель легко реалізувати практично на будь-якій машині. Вона використовується в операційній системі Solaris.

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

Опис, даний вище (віртуальна пам'ять з підкачуванням сторінок за вимогою), у цілому підходить для Berkeley UNIX. Однак Sysytem V (і Solaris) має деякі особливості, що дозволяють користувачам керувати віртуальною пам'яттю. Найважливішою є здатність процесу відображати файл або частину файла на частину його адресного простору. Наприклад, якщо файл в 12 Кбайт відображається на віртуальну адресу 144 К, то в осередку з адресою 144 К буде знаходитися перше слово цього файлу. Таким чином, можна здійснювати ввод-вивод файлу без застосування системних викликів. Оскільки розмір деяких файлів може перевищувати розмір віртуального адресного простору, можна відображати не весь файл, а тільки його частину. Щоб здійснити відображення, спочатку потрібно відкрити файл і одержати дескриптор файлу (file descriptor). Дескриптор використовується для ідентифікації файлу, який потрібно відобразити. Потім процес робить виклик paddr=rnap (virtua1_address.lengtfi.protec1on.flags.fd.fi]e_offset) який відображає length, починаючи з filejoffset у файлі, у віртуальний адресний простір, починаючи з virtual_address. Параметр flags вимагає, щоб система вибрала віртуальну адресу, що потім повертається в paddr. Відображувана область повинна містити ціле число сторінок і повинна бути вирівняна в гра-iniiax сторінки. Параметр protection визначає дозвіл на читання, запис i виконання (у будь-якій комбінації). Відображення можна надалі видалити за допомогою команди unmap.

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

Віртуальна пам'ять Windows NT

У NT кожен користувальницький процес має свій власний віртуальний адресний простір. Довжина віртуальної адреси складає 32 біта, тому кожен процес має 4 Гбайти віртуального адресного простору. Нижні 2 Гбайти призначені для коду і даних процесу; верхні 2 Гбайти дозволяють обмежений доступ до пам'яті ядра. Виключення складають версії NT для підприємств, у яких поділ пам'яті може бути іншим: 3 Гбайти — для користувача і 1 Гбайт — для ядра. Віртуальний адресний простір з підкачуванням сторінок за вимогою містить сторінки фіксованого розміру (4 Кбайт на машині Pentium П).

Кожна віртуальна сторінка може знаходитися в одному з трьох станів: вона може бути вільною (free), зарезервованою (reserved) і виділеною (committed). Вільна сторінка в сучасний момент не використовується, а звертання до неї викликає помилку через відсутність сторінки. Коли процес починається, усі його сторінки знаходяться у вільному стані доти, поки програма і початкові дані не будуть відображені у свій адресний простір. Якщо код чи дані відображені в сторінку, то така сторінка є виділеною. Звертання до виділеної сторінки буде успішним, якщо сторінка знаходиться в основній пам'яті. Якщо сторінка відсутня в основній пам'яті, то відбудеться помилка і операційній системі прийдеться викликати потрібну сторінку з диска. Віртуальна сторінка може знаходитися й у зарезервованому стані. Це значить, що ця сторінка недоступна для відображення доти, поки резервування не буде скасовано. Крім атрибутів стану сторінки мають і інші атрибути (наприклад, що вказують на можливість читання, запису і виконання). Верхні 64 Кбайт і нижні 64 Кбайт пам'яті завжди вільні, щоб можна було відшукувати помилки покажчиків (неініціалізовані покажчики часто рівні 0 чи -1).

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

NT, як і System V, дозволяє відображати файли прямо в області віртуального адресного простору. Якщо файл був відображений в адресний простір, його можна зчитувати або записувати шляхом звичайних звертань до пам'яті.

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

NT дозволяє відображати два і більш процесів в одному файлі одночасно, можливо, у різних віртуальних адресах. Шляхом зчитування слів з пам'яті і запису слів у пам'ять процеси можуть взаємодіяти один з одним і передавати дані в обох напрямках з досить високою швидкістю, оскільки ніякого копіювання не потрібно. Різні процеси можуть мати різні дозволи на доступ. Усі процеси, що використовують відображений файл, розділяють ті самі сторінки, тому зміни, зроблені одним із процесів, помітні всім іншим процесам, навіть якщо файл на диску ще не був обновлений. WIN 32 API містить ряд функцій, що дозволяють процесу відкрито керувати віртуальною пам'яттю. Найважливіші з цих функцій приведені в табл. 6.3. Усі вони працюють в області, що складається або з однієї сторінки, або з двох чи більше сторінок, послідовно розташованих у віртуальному адресному просторі.