Технологii вiртуалiзацii: вчора, сьогоднi, завтра

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

алi яких би то не було стороннiх чинникiв - компютера, на якому вона запущена, або iнших працюють на цьому ж компютерi програм. РЖ, треба сказати, результати тут були досягнутi вражаючi. Першi процесори працювали безпосередньо з фiзичною оперативною памяттю, безпосередньо вказуючи в програмi конкретну комiрку в модулi памятi, з якою вони працювали. Виходило щось на кшталт модуль памятi # 1, мiкросхема 4, банк 3, рядок даних 63, байт 13, - або, у двiйковiй нотацii, модуль 01, мiкросхема 01000, банк 11, рядок даних 0111111, байт 01101 . Цi числа записувалися пiдряд - i виходив адресу 010100011011111101101, тобто 669 677 у звичнiй нам десятковiй нотацii. При дотриманнi мiнiмальних обмежень на органiзацiю модулiв памятi при такому способi запису фактично виходить, що ми нумеруючи елементу памятi що йдуть пiдряд числами, починаючи з нуля i закiнчуючи деякими великим числом. А це зручно i проектувальникам залiза, i програмiстам. (До речi, саме звiдси пiшло правило обсяг модуля памятi повинен бути ступенем двiйки - при такому пiдходi всi молодшi бiти фiзичноi адреси модуля виходять допустимими, i в нумерацii адрес фiзичноi оперативноi памятi не виникаСФ дiрок). Ось з цими фiзичними адресами памятi, що утворюють вiдрiзок на числовоi прямоi, першi програми i працювали. Система була за своiм досить витончена, але, на жаль, абсолютно не пристосована для одночасного виконання кiлькох програм, - в кращому випадку одна програма в компютерi могла на час передавати управлiння iншiй.

Взагалi, про прийоми роботи того часу можна скласти непогане враження, якщо згадати, що модулi звичноi нам динамiчноi оперативноi памятi (DRAM), що вимагають регулярноi пiдзарядки, програмiстовi в тi днi доводилося оновлювати (регенерувати) самостiйно. Справа в тому, що модулi DRAM порiвняно швидко втрачають зберiгаСФться в них у виглядi заряду мiкроконденсаторов iнформацiю (швидко тут означаСФ за мiлiсекунди), i в той чаiю особливiсть даного типу памятi доводилося враховувати вручну, тобто програмними засобами прописуючи звернення до клiтинок (стовпцями) i тим самим регулярно оновлюючи що зберiгаСФться в памятi iнформацiю. Лише пiзнiше функцiю регенерацii памятi поклали на схемотехнiку i мiкросхеми системноi логiки (контролери памятi) навчилися проводити регенерацiю памятi автоматично, у фоновому режимi i непомiтно для програмiста. Яка вже тодi багатозадачнiсть - за регенерацiСФю б встежити...

Втiм, складнiсть, повязана з необхiднiстю облiку наявностi у фiзичнiй оперативноi памятi одночасно декiлькох програм (i абсолютно рiзноi iнформацii - коду, даних, стека, керуючих структур) - це лише пiвбiди. Головна ж бiда полягаСФ в тому, що в будь-яких програмах зустрiчаються рiзнi помилки (причому, чим складнiше програма, тим зникаСФ), дуже часто призводять в першу чергу саме до псування оперативноi памятi за випадковим адресою. РЖ заглючiвшая програма, що працюСФ з фiзичноi оперативною памяттю, в бiльшостi випадкiв буде просто вбивати не тiльки саму себе (а iнодi - i не стiльки), скiльки оточуючих ii сусiдiв по памятi.

Схема 1. Компьютер без виртуализации

Як же роздiлити i захистити працюють у фiзичноi оперативноi памятi програми один вiд одного? Найпростiше рiшення, яке приходить в голову, - просто нарiзати цю память (великий вiдрiзок адрес) невеликими шматочками (меншими вiдрiзками адрес - сегментами). Кожен такий шматочок задаСФться координатами його почала (першим адресою вiдрiзка) i довжиною (кiлькiстю адрес). Будь-який адресу цього вiдрiзка вважаСФться як вiдстань мiж цiСФю адресою i першим адресою вiдрiзка (змiщення вiд початку сегмента). Замiсть того щоб працювати з фiзичними адресами, програми працюють з цими змiщеннями i сегментами, - реалiзувати це зовсiм не так вже й важко, причому, видiливши кожнiй програмi навiть не по одному, а по кiлька сегментiв - сегмент для машинного коду програми, сегмент для ii даних, сегмент для органiзацii стека, i т.д.

Подiбна система називаСФться сегментованоi моделлю оперативноi памятi, в архiтектурi x86 вона зявилася в процесорах i80286 (де отримала назву захищеного режиму) i зникла з цiСФi архiтектури тiльки з переходом до 64-бiтним роздiлами iнструкцiй AMD64/Intel EM64T.

Схема 2. Сегментована память

Що ми отримуСФмо вiд переходу до сегментацii? По-перше, захист одних програм вiд iнших: процесор перевiряСФ кожне звернення програм до памятi i контролюСФ, щоб вони не вийшли за межi видiлених iм сегментiв. По-друге, - i, мабуть, це навiть набагато важливiше - радикальне пiдвищення зручностi програмування. Нам не потрiбно замислюватися над тим, що на нашому компютерi взагалi iснують iншi програми - кожнiй з них забезпечено вiртуальне простiр, у якому СФ навiть не одна, а цiлих три незалежних один вiд одного, памятi, видiленi iй i тiльки iй, де зберiгаються ключовi структурнi частини будь-якоi запущеноi програми - код, данi i стек. Нам не потрiбно пiдлаштовуватися пiд особливостi конкретноi версii операцiйноi системи (а це ж теж як мiнiмум ще одна програма, запущена на компютерi!), Ми можемо використовувати для всiх випадкiв життя абсолютно однаковий програмний код.

Ефективна схема? Цiлком! Вона працюСФ, вона зручна, доступна i зрозумiла, тому що багато любителi асемблера до цих пiр iз задоволенням нею користуються. Але довго в