Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операційні системи.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6.41 Mб
Скачать

Лекція № 11. Управління памяттю План

  • Основні положення розміщення процесів в пам'яті

  • Зв'язування программ и даних з адресами в памяті

  • Багатоетапна обрабка користувальницької програми

  • Логічний і фізичний адресний простір

  • Устройство управління памяттю

  • Динамічна загрузка и динамічна лінковка

  • Оверлейна структура програми

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

Основні положення розміщення процесів у пам'яті

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

Зв'язування програм і даних з адресами в пам'яті

Перед завантаженням даних або коду в пам’ятьвони повинні бути в який-небудь момент пов'язані з певними адресами в пам'яті. Зв'язування може виконуватися на різних етапах:

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

  • Зв'язування під час завантаження (load-time). Завантаження програми в память – стадія її обробки системою, що передує виконанню програми. Щоб початкову адресу області пам'яті, куди завантажується програма, можна було міняти, і це не привело б до необхідності зміни коду програми, застосовується наступний метод. Генерується переміщуваний код (relocatable code) – код, у якому адресація формується відносно значення регістра переміщення (relocation register), і адреса в пам'яті дорівнює сумі значення регістра переміщення й адреси, що обчислюється в команді. Таким чином, при необхідності завантаження коду на інше місце в пам'яті потрібно змінити тільки значення регістра переміщення. Подібний підхід широко використовується для програм, написаних на традиційних мовах програмування.

  • Зв'язування під час виконання (runtime), або динамічне (пізніше) зв'язування. Використається, якщо процес під час виконання може бути переміщений з одного сегмента пам'яті в іншій. Для реалізації зв'язування під час виконання потрібна апаратна підтримка відображення адрес - наприклад, регістри бази й границі. У більшості систем для користувальницьких програм використовується, головним чином, саме зв'язування під час виконання.

Багатоетапна обробка користувальницької програми

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

Рис. 15.1.  Багатоетапна обробка користувальницької програми.

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

Однак об'єктний модуль не може безпосередньо виконуватися, тому що він містить недозволені посилання на зовнішні модулі і їхні компоненти. Наступна фаза обробки програми – редагування зв'язків. Редактор зв'язків (linker) – системна програма, що одержує на вхід один або кілька об'єктних модулів, а на виході видає завантажувальний модуль – двійковий код, утворений кодом декількох об'єктних модулів, у якому дозволені всі міжмодульні посилання - для кожного символу, зовнішнього для даного об'єктного модуля A, знайдений відповідний символ (процедури, змінної й т.д.) з іншого модуля B, на який посилається модуль A, і код відповідно відкоректовано, тобто він правильно адресує зовнішній символ.

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

Фаза виклику редактори зв'язків і завантажника носить загальну назву час завантаження. У багатьох ОС функції редактора зв'язків і завантажника, з метою економії часу обробки програми в системі, об'єднані в одній системній програмі – редакторі зв'язків і завантажнику (linker and loader). Наприклад, у системі UNIX редактор зв'язків і завантажник називається ld (Linker and loaDer). Об'єднаному завантажнику й редактору зв'язків на вхід передається список об'єктних модулів і список бібліотек, і в результаті він генерує код, що виконується. Фаза редагування зв'язків і завантаження часто на програмістському сленгу називається лінковка (linking). Будемо далі використати саме цей короткий і виразний термін.

От приклад послідовності фаз обробки програми в термінах команд системи UNIX:

сс -c program.c // Компіляція вихідного коду на Си.

// У робочій директорії - об'єктний модуль program.o

ld program.o mylibrary.a // редагування зв'язків і завантаження

// У робочій директорії - виконує код, що, з ім'ям за замовчуванням a.out

a.out // Виконання програми

// У стандартний вивід (за замовчуванням - на консоль)

// видаються результати програми

У прикладі передбачається, що у файлі program.c зберігається вихідний код програми на Си, що використає бібліотечні функції з бібліотеки mylibrary.a. Відзначимо угоди в системі UNIX про розширення імен файлів: .c – вихідний код на Си, .o – об'єктний модуль, .a – бінарний файл статично линкуемої бібліотеки (абревіатура від терміна archive). Код, що виконує, (executable) в UNIX не має стандартного розширення імені, але має повне ім'я за замовчуванням - трохи архаїчне ім'я a.out (абревіатура від asembler output).

В Windows угоди про розширення імен файлів трохи інші: .obj – об'єктний модуль, .exe – виконує код, що, .lib – статично линкуемая бібліотека.

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

На етапі виконання, при першому звертанні до них із програми, в память завантажуються динамічно лінкуємі бібліотеки (dymanically linked libraries). Даний різновид бібліотек, реалізований у всіх сучасних ОС, дозволяє заощадити пам'ять, займану образом виконуваного коду, який при статичній лінковці з бібліотеками виявляється дуже великий.

Логічний і фізичний адресний простір

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

Логічною адресою називається адреса, яка генерирується процесором при виконанні машинної команди.

Фізична адреса – це реальна адреса в пам'яті, яку "бачить" й "розуміє" пристрій керування пам'яттю (Memory Management Unit – MMU).

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

Пристрій керування пам'яттю

Пристрій керування пам'яттю (Memory Management Unit – MMU) – це один з модулів апаратури, відповідальний за адресацію пам'яті й зв'язаний із процесором й іншими пристроями системною шиною. З погляду підтримки описаних концепцій адресації, пристрій керування пам'яттю - це апаратура, що перетворить логічну адресу (отриманий по загальній шині від процесора) у фізичну (реальна адреса в пам'яті, по якійу й відбувається обмін).

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

Програма користувача працює тільки з логічними адресами й не "бачить" фізичних адрес.

Схема адресації й перетворення логічної адреси у фізичну з використанням регістра переміщення зображена на рис. 15.2.

Рис. 15.2.  Адресація з використанням регістра переміщення.