Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка QNX.doc
Скачиваний:
7
Добавлен:
03.09.2019
Размер:
211.97 Кб
Скачать

Диспетчеризація потоків

QNX - багатозадачна ОС. Це означає, що в системі може існувати досить багато процесів (і потоків). Причому декілька з них можуть одночасно виявитися в стані готовності до виконання. Як визначити, якому з цих процесів надати вільний процесор? Для цього мікроядро використовує пріоритет, призначений кожному потоку. Всього в QNX Neutrino версії 6.3 є 256 рівнів пріоритету (раніше в Neutrino було 64 рівня пріоритету). Найнижчий пріоритет - 0, найвищий - 255. Нульовий пріоритет має спеціальний потік адміністратора процесів під назвою idle (що в перекладі з англійської означає "лінивець. Цей потік завжди знаходиться в стані готовності до виконання READY.

Диспетчеризація виконується мікроядром в трьох випадках:

□ потік, що виконується на процесорі перейшов в блокований стан;

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

□ потік, що виконується сам передає право виконання на процесорі іншому потоку (викликає функцію sched_yield ()).

Синхронізація потоків

Для синхронізації потоків в QNX застосовують кілька способів. Причому тільки два з них (mutex і condvar) реалізовані в мікроядрі, решта - надбудови над цими двома:

□ взаємовиключне блокування (Mutual exclusion lock - mutex, "мутекс") - цей механізм забезпечує винятково доступ потоків до поділюваних даних. Тільки один потік в один момент часу може володіти мутексом. Якщо інші потоки спробують захопити мутекс, вони стають мутекс-блокованими;

□ умовна змінна (condition variable, або condvar) – призначена для блокування потоку до тих пір, поки виконується деяка умова. Ця умова може бути складною. Умовні змінні завжди використовуються з мутекс-блокуванням для визначення моменту зняття мутекс-блокування;

□ бар'єр - встановлює точку для декількох взаємодіючих потоків, на якій вони повинні зупинитися і зачекати на "відсталі" потоки. Як тільки всі потоки з контрольованої групи досягли бар'єру, вони розблоковуються і можуть продовжити виконання;

□ очікуюче блокування - спрощена форма спільного використання умовної змінної з мутекс. На відміну від прямого застосування mutex+condvar має деякі обмеження;

□ блокування читання/запису (rwlock) - проста і зручна у використанні "надбудова" над умовними змінними і мутекс;

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

Більшість цих механізмів працює тільки в межах одного процесу, але це обмеження долається шляхом поділу пам'яті.

Програмний інтерфейс qnx

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

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

Системні виклики і функції стандартних бібліотек

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

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

Обробка помилок

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

Зазвичай у разі виникнення помилки системні виклики повертають ціле значення -1 і встановлюють значення глобальної системної змінної ERRNO, яке вказує причину виникнення помилки. Системний файл <errno.h> містить коди помилок, значення яких може приймати змінна ERRNO, з короткими коментарями.

Бібліотечні функції, як правило, не встановлюють значення змінної ERRNO, а код повернення різний для різних функцій.

Типи файлів

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

Файл в файловій системі розглядається як посилання на його метадані, в той час як метадані не містять відомостей про ім'я файлу.

У QNX існують 6 типів файлів, що розрізняються за функціональним призначенням та діям операційної системи при виконанні тих чи інших операцій над файлами:

• Звичайний файл

• Зв'язок

• Каталог

• Іменований канал

• Сокет

• Файл пристрої

Звичайний файл

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

Зв'язок

Крім імені файлу для посилання на його метадані можуть використовуватися також так звані зв'язку. Зв'язок в QNX є аналогом ярлика файлової системи ОС Windows. Вона дозволяє поставити у відповідність одному файлу кілька різних імен (псевдонімів), розміщуючи їх потім в різних місцях файлової системи.

Зв'язок може бути організована за допомогою так званих жорстких посилань ("жорсткі зв'язку") і символічних або м'яких посилань ("символічні зв'язку").

При створенні для деякого файлу додаткового імені за допомогою жорсткого зв'язку в каталог поміщається новий елемент, який посилається на той же файл. Для забезпечення механізму жорстких зв'язків операційна система використовує спеціальний системний файл /.Inodeas, в якому, зокрема, ведеться лічильник посилань на файл. При створенні черговий жорсткого зв'язку лічильник посилань збільшується на одиницю. Жорсткі зв'язку можуть бути поміщені в різні каталоги, що знаходяться на одному і тому ж фізичному носії (одному розділі жорсткого диска). Створення ще одного імені файлу (жорсткого зв'язку) здійснюється за допомогою команди <ln>. Не можна створювати жорсткі зв'язку для каталогів. При видаленні однієї з жорстких звязків реально буде видалено тільки відповідний елемент каталогу, а лічильник посилань на файл буде зменшений на одиницю. Як тільки лічильник досягне нуля, то файл і відповідні йому атрибути управління будуть фізично знищені (при цьому файл повинен мати статус "закрито").

На відміну від жорсткої зв'язку символічний зв'язок реалізується у вигляді системного текстового файлу, що містить ім'я файлу. Відмінною властивістю символічної зв'язку є те, що з її допомогою можна створювати додаткові імена для будь-якого файлу (в тому числі каталогу), що знаходиться, в загальному випадку, на іншому фізичному носії (наприклад, в іншому розділі диска або на іншому вузлі мережі). Можливість створення символічних зв'язків для каталогів створює небезпеку нескінченних циклів. Тому число переходів по символічним зв'язків обмежено значенням системної змінної SYMLOOP_MAX, визначеної у файлі <limits.h>.

Каталог

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

Іменований канал

Іменований канал (FIFO) - цей тип файлів відносять до засобів взаємодії процесів, вони використовуються для передачі даних між процесами.

Сокети

Сокети - цей тип файлів відносять до засобів доступу до мережі TCP/IP.

Пристрої

Файл пристрою забезпечує доступ до фізичного або віртуального пристрою, зареєстрованому в QNX. Для взаємодії з пристроями крім драйверів їм ставляться у відповідність файли пристроїв. Програми обмінюються даними з пристроями через файли пристроїв. Пристрої поділяють на два типи:

• Символьні (байт-орієнтовані) пристрою читають і записують дані у вигляді послідовного потоку байтів. Сюди входять послідовні і паралельні порти, накопичувачі на магнітній стрічці, термінали і звукові карти.

• Блокові (блок-орієнтовані) пристрою читають і записують дані блоками фіксованого розміру. Блокові пристрої надають прямий доступ до своїх даних. Прикладом блочного пристрою є накопичувач на жорсткому або гнучкому диску.

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

Всі файли пристроїв, відомих системі, містяться в каталозі /dev. Імена цих файлів стандартизовані. Для доступу до символьного пристрою досить відкрити відповідний файл пристрою як звичайний файл і здійснювати читання/запис традиційним чином.

Віртуальні пристрої

У QNX є ряд спеціальних символьних пристроїв, яким не відповідають ніякі апаратні компоненти. Ці пристрої є віртуальними.

Пристрій /Dev/null

Поглинає будь-які дані, що направляються в пристрій. У тих випадках, коли вивідні дані програми не потрібні, в якості вихідного файлу призначають пристрій /Dev/null, наприклад:

# Verbose_command> / Dev/null

При читанні з пристрою /Dev/null завжди повертається ознака кінця рядка (файлу). Якщо відкрити /Dev/null за допомогою функції Open () і спробувати прочитати дані з нього за допомогою функції read (), то функція поверне 0 байтів.При копіюванні вмісту файлу /Dev/null буде створено порожній файл нульової довжини.

Пристрій /Dev/null поводиться так, якби він був файлом нескінченної довжини, заповнений одними нулями. Файл зручно використовувати у функціях виділення пам'яті, які відображають цей файл в пам'ять, щоб ініціалізувати її нулями.

Пристрій /Dev/full

Пристрій /Dev/full поводиться так, якби він був файлом, в якому немає вільного місця. Операція запису в цей файл завершується помилкою, і в змінну ERRNO поміщається код, який свідчить про те, що пристрій переповнений.

Цей файл зручний для перевірки того, як програма буде вести себе у випадку, якщо при записі у файл виникає брак місця.

Пристрої генерування випадкових чисел

Спеціальні пристрої /dev/random і /dev/urandom надають доступ до засобів генерування випадкових чисел, що входять в QNX. Ці пристрої для отримання випадкових чисел використовують зовнішнє "джерело хаосу». Заміряючи затримки між діями користувача, зокрема натисканнями клавіш і переміщеннями миші, пристрої здатні генерувати непередбачуваний потік дійсно випадкових чисел.Отримати доступ до цього потоку можна шляхом читання з пристроїв /dev/random і /dev/urandom.