Сучасні інформаційні технології

Комп’ютерна інженерія

Р.В. Бараненко

Херсонський національний технічний університет

ЗАСТОСУВАННЯ МЕХАНІЗМУ НЕПОДІЛЬНИХ ТРАНЗАКЦІЙ

ДЛЯ СИНХРОНІЗАЦІЇ ПРОЦЕСІВ

 

В міру здешевлення процесорів на початку 60-х років з'явилися нові способи організації обчислювального процесу, що дозволили врахувати інтереси користувачів [1]. Поява багатопроцесорних обчислювальних систем з'явилася черговою ступінню в розвитку комп'ютерної технології. Їхніми головними перевагами є відмовостійкість й висока продуктивність, що досягається за рахунок паралельної роботи декількох процесорів, що дозволяють здійснювати виконання декількох процесів одночасно. Операційна система надає кожному процесові право на використання системних ресурсів, що породжує проблему забезпечення контролю за виділенням ресурсів [2]. У мультипроцесорному обчислювальному комплексі операційна система повинна таким чином розподіляти роботу між процесорами й іншими ресурсами, щоб користувач був звільнений від необхідності самостійно контролювати ресурси [3].

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

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

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

Для програмування з використанням транзакцій потрібний деякий набір примітивів, що повинні бути надані програмістові або операційною системою, або мовою програмування. Приклади примітивів такого роду:

BEGIN_TRANSACTION

-

команди, що формують транзакцію.

END_TRANSACTION

-

завершує транзакцію і намагається зафіксувати її.

ABORT_TRANSACTION

-

перериває транзакцію, відновлює попередні значення.

READ

-

читає дані з файлу (або іншого об'єкта).

WRITE

-

пише дані у файл (або інший об'єкт).

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

Транзакції мають наступні властивості: впорядкованість, неподільність, сталість.

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

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

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

Існує декілька підходів до реалізації механізму транзакцій.

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

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

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

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

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

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

 

Література:

1.          Компьютерные сети. Принципы, технологии, протоколы /В.Г. Олифер, Н.А. Олифер. – СПб: Питер, 2001. – 672 с.: ил.

2.          С.Н. Шаганян, Р.В. Бараненко Выполнение запросов о выделении ресурсов в системах с обходами тупиков //Вестник Херсонского государственного технического университета. – 2004. – №19. – С.63-65.

3.          Столингс Вильям. Структурная организация и архитектура компьютерных систем, 5-е издание.: пер. с англ. – М.: Издательский дом «Вильямс», 2002. – 896 с.: ил. – Парал. тит. англ.