Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ободяк 3 курс / РСтаМ-том1-2011.docx
Скачиваний:
128
Добавлен:
19.04.2015
Размер:
8.73 Mб
Скачать
    1. Перенесення коду в гетерогенних системах

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

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

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

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

Перенесення коду обмежене декількома конкретними моментами виконання програми. Точніше, перенесення можливе лише у момент виклику чергової підпрограми. Під підпрограмою мається на увазі функція в С, метод в Java і тому подібне. Виконуюча система створює власну копію програмного стека, причому машинно-незалежну. Ця копія називаєтьсястеком перенесення (migration stack).Стек перенесенняоновлюється під час виклику підпрограми або поверненні управління з підпрограми.

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

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

Рис. 4.15 Перенесення коду в гетерогенних системах

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

Приклад

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

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

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

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

Приклад

Аби проілюструвати перенесення коду, розглянемо тепер платформу проміжного рівня, який підтримує різні форми перенесення коду. D'Agent, або повністю Agent TCL, – це система, побудована на основі концепції агента. Агентом в системі D'Agent називається програма, яка в гетерогенній системі здатна переміщатися з однієї машини на іншу.

Соседние файлы в папке Ободяк 3 курс