Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lesson_05_SPZ.doc
Скачиваний:
4
Добавлен:
21.12.2018
Размер:
458.24 Кб
Скачать

Тема 5. Керування реальною пам’яттю

  1. Підходи до керування реальною пам’яттю.

  2. Неперервний розподіл оперативної пам’яті.

  3. Розподіл з перекриттям.

  4. Статичний розподіл пам’яті.

  5. Динамічний розподіл пам’яті.

  6. Розділи пам’яті з фіксованими розмірами.

  7. Розділи пам’яті зі змінними розмірами.

  1. Підходи до керування реальною пам’яттю.

Фізична пам’ять являє собою впорядковану множину комірок і всі вони пронумеровані, тобто до кожної із них можна звернутися вказавши її впорядкований номер (адрес). Кількість комірок фізичної пам’яті є обмеженою і фіксованою. СПЗ повинно зв’язати кожне вказане користувачем ім’я з фізичною коміркою пам’яті, тобто здійснити відображення простору імен на фізичну пам’ять комірки. В загальному випадку це відображення здійснюється в два етапи:

  • спочатку системою програмування;

  • потім ОС (з допомогою спеціальних програмних модулів керування пам’яттю і використання спеціальних апаратних засобів).

Між цими етапами звернення до пам’яті має форму віртуального або логічного адресу. При цьому потрібно відзначити, що множина всіх допустимих значень віртуального адресу для будь – якої програми визначає її віртуальний адресний простір або віртуальну пам’ять.

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

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

Частина програмних модулів будь – якої ОС обов’язково повинна бути абсолютно двійковими програмами. Ці програми розміщуються по фіксованих адресах і з їх допомогою можна як наслідок реалізувати розміщення інших програм, що підготовлені системою програмування таким чином, що вони можуть працювати на різних фізичних адресах (тобто де їх розмістить ОС).

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

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

  1. Неперервний розподіл оперативної пам’яті.

Неперервний розподіл – це найпростіша схема, згідно якої всю пам’ять можна поділити на три частини:

  • область, яку займає операційна система;

  • область, в якій розміщується програма яка виконується;

  • незайнята область пам’яті.

Дана схема, незважаючи на те, що була першою схемою розподілу пам’яті, досить поширена і на сьогодні. При цьому ОС не підтримувала мультипрограмування, тому і не виникали проблеми розподілу пам’яті між декількома задачами. Програмні модулі необхідні для всіх програм включаються в області самої ОС, а решта пам’яті, що залишилась може бути задана задачі. Ця область пам’яті при цьому получається неперервною, що і полегшує роботу самої системи програмування. Щоб для задач відвести як можна більше пам’яті ОС будується так, що в пам’яті розміщується тільки потрібна її частина. Дану частину ОС ми називаємо ядром. Інші модулі ОС можуть бути звичайними транзитними, тобто завантаженими в пам’ять при потребі і вивантаженими після свого виконання.

  1. Розподіл з перекриттям.

Якщо є необхідність створити програму логічний і віртуальний адресний простір якої повинен бути більший ніж вільна пам’ять або ніж вся доступна оперативна пам’ять то використовується розподіл з перекриттям.

Цей метод означає, що вся програма може бути розбита на частини. Кожна частина містить одну основну частину і декілька сегментів (тобто в пам’яті машини одночасно можуть знаходитись основа і сегменти). Доти, поки в пам’яті розміщуються сегменти, що виконуються, решта знаходяться в зовнішній пам’яті.

Після того як поточний сегмент завершить своє виконання можливі два варіанти:

    • або він сам звертається до ОС з вказанням в який сегмент має бути завантажений в пам’ять наступним;

    • або повертає управління основній частині задачі і він звертається до ОС який сегмент потрібно зберегти, а який завантажити наступним.

Найпростіша схема сегментування визначає, що в пам’яті в кожний поточний момент часу може знаходитись тільки один сегмент. Більш складні сегментування дозволяють розмішати декілька сегментів, які можуть перекриватися. Як правило, сегменти діляться на сегменти коду і сегменти даних: сегменти коду можуть залишатися незмінними, а сегменти даних потрібно постійно поновляти.

  1. Статичний розподіл пам’яті.

Статичний розподіл пам’яті полягає в тому, що програма або операційна система жорстоко відводить певний об’єм пам’яті на весь час свого існування. Розмір цієї пам’яті є незмінним під час функціонування ОС чи програми, яка здійснила розподіл.

Як правило, статичний розподіл здійснюється на рівні довгострокового планування під час розробки програми або ОС.

Приклад на мові Assembler:

buffer db 1024 dup(?)

  1. Динамічний розподіл пам’яті.

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

4Ah, 48h, 49h – функції операційної системи, переривання 21h – на мові Assembler.

Команди malloc, realloc – на мові С.

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

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