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

У однозадачних системах основна пам'ять розділяється на дві частини: одна частина - для операційної системи (резидентний монітор, ядро), а друга - для виконується в поточний момент часу програми. У багатозадачних системах "призначена для користувача" частина пам'яті повинна бути розподілена для розміщення декількох процесів. Це завдання розподілу виконується операційною системою динамічно і відома під назвою управління пам'яттю (memory management).







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

При розгляді різних механізмів і стратегій, пов'язаних з управлінням пам'яттю, корисно пам'ятати вимоги, яким вони повинні задовольняти:

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

Модулі можуть бути створені і скомпільовані незалежно один від одного при цьому всі посилання з одного модуля в другій вирішуються системою під час роботи програми.

Різні модулі можуть отримати різні ступені захисту (тільки для читання, тільки для виконання) за рахунок досить помірних накладних витрат.

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

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







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

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

- Основний пам'яті може бути недостатньо для програми і її даних.

- У багатозадачному середовищі програміст при розробці програми не знає, який обсяг пам'яті буде доступний програмі і де ця пам'ять буде розташовуватися.

Таким чином, очевидно, що завдання переміщення інформації між двома рівнями пам'яті має покладатися на операційну систему. Це завдання є сутністю управління пам'яттю.

У мікропроцесорах i80x86 є не два, а чотири рівні привілеїв. Часто рівні привілеїв називають кільцями захисту, оскільки це іноді допомагає пояснити принцип дії самого механізму; тому говорить, ч го деякий програмний модуль «виповнюється в кільці захисту з таким-то номером».

Основними системними об'єктами, якими маніпулює процесор при роботі в захищеному режимі, є дескриптори. Дескриптори сегментів містять інформацію про рівень привілеї відповідного сегмента коду або даних. Рівень привілеї що виконується завдання визначається значенням поля привілеї, що знаходиться в дескрипторі її поточного кодового сегмента. Нагадаємо, що в кожному дескрипторі сегмента (див. Рис.3.3) є поле DPL в байті прав доступу, яке і визначає рівень привілеї пов'язаного з ним сегмента. Таким чином, поле DPL поточного сегмента коду стає полем З PL2. При зверненні до якого-небудь сегменту в відповідному селекторі вказується запитуваний рівень привілеїв RPL3 (див. Рис. 3.4).

В межах одного завдання використовуються сегменти з різним рівнем привілеї і в певні моменти часу виконуються або обробляються сегменти з відповідними їм рівнями привілеї. Механізм перевірки привілеїв працює в ситуаціях, які можна назвати міжсегментного переходами (зверненнями). Це доступ до сегменту даних або стекового сегменту, міжсегментні передачі управління в разі переривань (і особливих ситуацій), при використанні команд CALL, JMP, INT, IRET, RET. У таких міжсегментних зверненнях беруть участь два сегменти: цільовий сегмент (до якого ми звертаємося) і поточний сегмент коду, з якого йде звернення.

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

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







Схожі статті