- •Лабораторна робота №5 Тема: система qnx. Мікроядро Теоретичні відомості
- •1.1. Архітектура ядра системи qnx
- •1.1.1. Ядро системи qnx
- •1.1.2. Системні процеси
- •Системні процеси і процеси користувача
- •Драйвери пристроїв
- •1.2. Зв'язок між процесами
- •1.2.1. Операційна система з передачею повідомлень
- •1.3. Qnx як мережа
- •2.1. Мікроядро
- •2.2. Зв'язок між процесами
- •2.3. Зв'язок між процесами за допомогою повідомлень
- •2.3.1. Передача повідомлень
- •2.3.2. Синхронізація процесів
- •2.3.3. Стани блокувань
- •2.3.4. Використовування функцій Send(), Receive() і Reply()
- •Використовування функції Send()
- •Використовування функції Receive()
- •Використовування функції Reply()
- •2.3.5. Reply-керована передача повідомлень
1.3. Qnx як мережа
В найпростішому випадку локальна обчислювальна мережа реалізує механізм розділення файлів і зовнішніх пристроїв між декількома взаємозв'язаними комп'ютерами. В системі QNX ця концепція отримала подальший розвиток, внаслідок чого вся мережа стала бути єдиним однорідним набором ресурсів.
Користувачі мають доступ до всіх файлів мережі, можуть використовувати будь-який зовнішній пристрій і запускати додатки на будь-якій машині мережі (за умови, що вони мають на це відповідне повноваження). Відповідно, всі процеси можуть взаємодіяти між собою по всій мережі. Таким чином, механізм передачі повідомлень, забезпечує гнучку і прозору мережну обробку.
2.1. Мікроядро
Ядро операційної системи QNX, представлене на рисунку 2, виконує наступні функції:
зв'язок між процесами (IPC). Ядро забезпечує три форми IPC (повідомлення, proxy і сигнали);
мережна взаємодія нижнього рівня. Ядро передає всі повідомлення, призначені процесам на іншому вузлі;
планування процесів. Планувальник ядра визначає, який процес виконуватиметься наступним;
первинну обробку переривань. Всі переривання і збої апаратного забезпечення спочатку обробляються в ядрі, а потім передаються відповідному драйверу або системному адміністратору.
Рисунок 2 Мікроядро
2.2. Зв'язок між процесами
Ядро QNX підтримує три типи зв'язку між процесами: повідомленнями, proxy і сигналами.
Основною формою IPC в системі QNX є обмін повідомленнями. Повідомлення забезпечують синхронний зв'язок між взаємодіючими процесами, при якій процес, що посилає повідомлення, вимагає підтвердження про його прийом і, можливо, відповіді на повідомлення.
Зв'язок за допомогою proxy є особливим видом передачі повідомлень. Цей вид зв'язку спеціально призначений для сповіщення про події, при яких процес-відправник не потребує взаємодії з процесом-одержувачем.
Зв'язок сигналами - це традиційна форма IPC. Сигнали використовуються для забезпечення асинхронного зв'язку між процесами.
2.3. Зв'язок між процесами за допомогою повідомлень
В системі QNX під повідомленням розуміється пакет байтів, який синхронно передається від одного процесу до іншого. Для самої системи вміст повідомлення не має ніякого значення. Дані в повідомленні мають сенс тільки для відправника і одержувача.
2.3.1. Передача повідомлень
Для прямого зв'язку один з одним взаємодіючі процеси використовують наступні функції мови Сі:
C-функция |
Призначення |
||
Send() |
для посилки повідомлень; |
||
Receive() |
для прийому повідомлень; |
|
|
Reply() |
для відповіді процесу, що послав повідомлення. |
|
Ці функції можуть використовуватися локально або по всій мережі.
Зверніть увагу на те, що для прямого зв'язку процесів один з одним необов'язкове використовування функцій Send(), Receive() і Reply(). Система бібліотечних функцій QNX надбудована над системою обміну повідомленнями, тому процеси можуть використовувати передачу повідомлень побічно при використовуванні стандартних сервісних засобів, наприклад, програмних каналів (pipe).
Рисунок 3 Процес А посилає повідомлення процесу В, який приймає його, обробляє і передає відповідь.
Приведений вище рис. 3 ілюструє простий приклад використовування функцій Send(), Receive() і Reply() при взаємодії двох процесів - А і В:
Процес А посилає повідомлення процесу В, видавши ядру запит Send(). З цієї миті процес А стає SEND-блокованим до тих пір, поки процес В не видасть Receive(), підтверджуючи отримання повідомлення;
Процес У видає Receive() процесу А, чекаючому повідомлення. Процес А змінює свій стан на REPLY-блокований. Оскільки від процесу В очікується повідомлення, він не блокується.
Процес У виконує необхідну обробку, визначувану отриманим від процесу А повідомленням, і видає Reply(). Процес А одержує у відповідь повідомлення і розблоковується. Процес В також розблоковується. Який з процесів почне виконуватися першим, залежить від їх відносних пріоритетів.