Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
При работе в QNX/Neutrino все узлы внутренне представляются 32-разрядными числами, но эти числа не являются уникальными в сети! Я имею в виду, что узел
Узел | wintermute | spud | foobar |
---|---|---|---|
wintermute | 0 | 7 | 4 |
spud | 4 | 0 | 6 |
foobar | 5 | 7 | 0 |
Обратите внимание, что каждый узел считает свой собственный дескриптор нулевым. Также отметьте, что для узла
К счастью, вам не надо беспокоиться о дескрипторах узлов по ряду причин:
• Большинство осуществляемых вами операций обмена сообщениями «с внешним миром» будут реализовываться с помощью вызовов функций высокого уровня (таких как функция open, приведенная в примере выше).
• Дескрипторы узлов не кэшируются — предполагается, что получив дескриптор, вы используете немедленно и забудете про него.
• Существует ряд библиотечных функций, предназначенных для преобразования имени пути (например,
Чтобы работать с дескрипторами узлов, вам понадобится подключить файл
Для преобразования строки в дескриптор узла используется функция netmgr_strtond. После получения дескриптора узла его следует сразу же применить в вызове функции ConnectAttach. Не пытайтесь сохранять его какой-либо структуре данных! Веским основанием для этого является то, что администратор сети может решить повторно использовать дескриптор после отключения всех соединений с узлом.
Так что если вы получили дескриптор «7» для узла
Поскольку дескрипторы узлов в сети не уникальны, возникает вопрос: «А как передавать эти штуки по сети?» Очевидно, взгляды узла
• Не передавать по сети дескрипторы узлов и пользоваться символьными именами (например,
• Применять функцию netmgr_remote_nd.
Первый
метод хорош как универсальное решение. Второй метод достаточно удобен на практике.Эта функция принимает два параметра, где remote_nd — дескриптор узла целевой машины, a local_nd — дескриптор узла, который нужно преобразовать из точки зрения локальной машины в точку зрения целевой. Результатом является дескриптор узла, корректный с точки зрения заданной удаленной машины.
Например, пусть
Это программа могла бы вывести что-то вроде следующего:
Это говорит о том, что на узле
Теперь вернемся к тому, о чем мы говорили в разделе «Кто послал сообщение?»). Параметр
Мы определили в описании для этих двух полей, что:
• nd — дескриптор принимающего узла с точки зрения передающего;
• srcnd — дескриптор передающего узла с точки зрения принимающего.
Так, для приведенного выше примера, где узел
• nd равен 7;
• srcnd равен 4.
Наследование приоритетов
Одним из интересных моментов в операционных системах реального времени является феномен инверсии приоритетов.
Инверсия приоритетов наблюдается, например, в случае, когда поток с низким приоритетом потребляет все процессорное время, в то время как в состоянии готовности находится поток с более высоким приоритетом.
Вы, наверное, сейчас думаете: «Минуточку! Вы утверждали ранее, что поток с более высоким приоритетом будет всегда вытеснять поток с более низким приоритетом! Как же такое может быть?»
Вы абсолютно правы. Поток с более высоким приоритетом всегда будет вытеснять поток с более низким приоритетом. Но при этом все-таки может произойти кое-что интересное. Давайте рассмотрим сценарий с тремя потоками (в трех различных процессах, для простоты рассмотрения), где «L» — поток с низким приоритетом, «Н» — поток с высоким приоритетом, и «S» — сервер. На рисунке показаны все три потока со своими приоритетами.