3. Основні класи архітектур програмних засобів
Розрізняють наступні основні класи архітектури програмних засобів [6.1]:
цілісна програма;
комплекс автономно виконуваних програм;
шарова (слоистая) програмна система;
колектив паралельно виконуваних програм.
Цілісна програма представляє вироджений випадок архітектури ПЗ: до складу ПЗ входить тільки одна програма. Таку архітектуру вибирають зазвичай у тому випадку, коли ПЗ повинне виконувати одну яку-небудь яскраво виражену функцію і її реалізація не представляється дуже складною. Природно, що така архітектура не вимагає якого-небудь опису (окрім фіксації класу архітектури), оскільки відображення зовнішніх функцій на цю програму тривіально, а визначати спосіб взаємодії не потрібно (через відсутність якої-небудь зовнішньої взаємодії програми, окрім як взаємодії її з користувачем, а останнє описується в документації по застосуванню ПЗ).
Комплекс автономно виконуваних програм складається з набору програм, такого, що:
будь-яка з цих програм може бути активізована (запущена) користувачем;
при виконанні активізованої програми інші програми цього набору не можуть бути активізовані до тих пір, поки не закінчить виконання активізована програма;
всі програми цього набору застосуються до одного і того ж інформаційного середовища.
Таким чином, програми цього набору по управлінню не взаємодіють взаємодія між ними здійснюється тільки через загальне інформаційне середовище.
Шарова програмна система складається з деякої впорядкованої сукупності програмних підсистем, званих шарами, такої, що:
на кожному шарі нічого не відомо про властивості (і навіть існування) подальших (вищих) шарів;
кожен шар може взаємодіяти по управлінню (звертатися до компонентів) з безпосередньо попереднім (нижчим) шаром через наперед визначений інтерфейс, нічого не знаючи про внутрішню будову всіх попередніх шарів;
кожен шар має в своєму розпорядженні певні ресурси, які він або приховує від інших шарів, або надає безпосередньо подальшому шару (через вказаний інтерфейс) деякі їх абстракції.
Таким чином, в шаровій програмній системі кожен шар може реалізувати деяку абстракцію даних. Зв'язки між шарами обмежені передачею значень параметрів звернення кожного шару до суміжного знизу шару і видачею результатів цього звернення від нижнього шару верхньому. Неприпустимо використання глобальних даних декількома шарами.
Як приклад розглянемо використання такої архітектури для побудови операційної системи. Таку архітектуру застосував Дейкстра при побудові операційної системи [6.2]. Ця операційна система складається з чотирьох шарів (див. мал.1). На нульовому шарі проводиться обробка всіх переривань і виділення центрального процесора програмам (процесам) в пакетному режимі. Тільки цей рівень обізнаний про мультипрограмні аспекти системи. На першому шарі здійснюється управління сторінковою організацією пам'яті. Всім вищестоящим шарам надається віртуальна безперервна (не сторінкова) пам'ять. На другому шарі здійснюється зв'язок з консоллю (пультом управління) оператора. Тільки цей шар знає технічні характеристики консолі. На третьому шарі здійснюється буферизація вхідних і вихідних потоків даних і реалізуються так звані абстрактні канали введення і виведення, так що прикладні програми не знають технічних характеристик пристроїв введення і виведення.
Прикладні програми
3: Управління
вхідними і вихідними потоками даних
2: Забезпечення
зв'язку з консоллю оператора
1:
Управління пам'яттю
0: Диспетчеризація
і синхронізація процесів
Комп'ютер
Мал.1. Архітектура операційної системи THE
Колектив паралельно виконуваних програм є набором програм, здатних взаємодіяти між собою, знаходячись одночасно в стадії виконання. Це означає, що такі програми, по-перше, викликані в оперативну пам'ять, активізовані і можуть почергово розділяти за часом один або декілька центральних процесорів, а по-друге, здійснювати між собою динамічні (в процесі виконання) взаємодії, на базі яких проводитися їх синхронізація. Звичайна взаємодія між такими процесами проводиться шляхом передачі один одному деяких повідомлень.
Простим різновидом такої архітектури є конвеєр. Можливості для організації конвеєра є, наприклад, в операційній системі UNIX. Конвеєр є послідовністю програм, в якій стандартне виведення кожної програми, окрім найостаннішої, пов'язане із стандартним введенням наступної програми цієї послідовності (див. мал.2). Конвеєр обробляє деякий потік повідомлень. Кожне повідомлення цього потоку поступає на введення першій програмі, яка перероблене повідомлення передає наступній програмі, а сама починає обробку чергового повідомлення потоку. Таким же чином діє кожна програма конвеєра: отримавши повідомлення від попередньої програми і, обробивши його, вона передає перероблене повідомлення наступній програми і приступає до обробки наступного повідомлення. Остання програма конвеєра виводить результат роботи всього конвеєра (результуюче повідомлення). Таким чином, в конвеєрі, що складається з n програм, може одночасно знаходитися в обробці до n повідомлень. Звичайно, внаслідок того, що різні програми конвеєра можуть витратити на обробку чергових повідомлень різні відрізки часу, необхідно забезпечити яким-небудь чином синхронізацію цих процесів (деякі процеси можуть знаходитися у стадії очікування або можливості передати перероблене повідомлення, або можливості отримати чергове повідомлення).
Мал.2. Конвеєр програм, що паралельно діють
У загальному випадку колектив паралельно виконуваних програм може бути організований в систему з портами повідомлень. Порт повідомлень є програмною підсистемою, що обслуговує деяку чергу повідомлень: вона може приймати на зберігання від програми яке-небудь повідомлення, ставлячи його в чергу, і може видавати чергове повідомлення іншій програми на її вимогу. Повідомлення, передане якою-небудь програмою деякому порту, вже не належатиме цій програмі (і не використовуватиме її ресурси), але воно не належатиме і ніякий іншій програмі, поки по черзі не буде передано якій-небудь програмі за її запитом. Таким чином, програма, що передає повідомлення не знаходитиметься у стадії очікування поки програма, що приймає це повідомлення, не буде готова його обробляти (якщо тільки не буде переповнений приймаючий порт).
Приклад програмної системи з портами повідомлень приведений на мал.3. Порт U може розглядатися як порт вхідних повідомлень для представленого на цьому малюнку колективу програм, що паралельно діють, а порт W як порт вихідних повідомлень для цього колективу програм.
Мал. 3. Приклад програмної системи з портами повідомлень.
Програмні системи з портами повідомлень можуть бути як жорсткої конфігурації, так і гнучкої конфігурації. У системах з портами жорсткої конфігурації кожна програма жорстко зв'язується з одним або з декількома вхідними портами. Для передачі повідомлення така програма повинна явно вказати адресу передачі: ім'я програми і ім'я її вхідного порту. В цьому випадку при зміні конфігурації системи доведеться коректувати використовувані програми: змінювати адреси передач повідомлень. У системах з портами гнучкої конфігурації з кожною програмою пов'язані як вхідні, так і вихідні віртуальні порти. Перед запуском такої системи програм на підставі інформації, що задається користувачем, повинна проводитися її попередня настройка за допомогою спеціальної програмної компоненти, такої, що здійснює поєднання кожного вихідного віртуального порту однієї програми з яким-небудь вхідним віртуальним портом іншої. Тим самим при зміні конфігурації системи в цьому випадку не вимагається якого-небудь коректування використовуваних програм необхідні зміни повинні бути відбиті в інформації для настройки. Проте в цьому випадку потрібно мати спеціальну програмну компоненту, таку, що здійснює настройку системи.
