• Большинство осуществляемых вами операций обмена сообщениями «с внешним миром» будут реализовываться с помощью вызовов функций высокого уровня (таких как функция
• Дескрипторы узлов не кэшируются — предполагается, что получив дескриптор, вы используете немедленно и забудете про него.
• Существует ряд библиотечных функций, предназначенных для преобразования имени пути (например, /net/magenta
) в дескриптор узла.
Чтобы работать с дескрипторами узлов, вам понадобится подключить файл
, потому что он содержит прототипы семейства функций
Для преобразования строки в дескриптор узла используется функция
Так что если вы получили дескриптор «7» для узла /net/magenta
, подсоединились к нему, передали сообщение и затем отсоединились, то существует возможность того, что администратор сети заново назначит дескриптор «7» другому узлу.
Поскольку дескрипторы узлов в сети не уникальны, возникает вопрос: «А как передавать эти штуки по сети?» Очевидно, взгляды узла magenta
и узла wintermute
на дескриптор «7» будут радикально отличаться. Существуют два способа решения этой проблемы:
• Не передавать по сети дескрипторы узлов и пользоваться символьными именами (например, /net/wintermute
).
• Применять функцию
Первый метод хорош как универсальное решение. Второй метод достаточно удобен на практике.
int netmgr_remote_nd(int remote_nd, int local_nd);
Эта функция принимает два параметра, где
Например, пусть wintermute
— имя нашей локальной машины. У нас есть дескриптор узла «7», который является корректным на нашей локальной машине и указывает на узел magenta
. Мы хотели бы выяснить, какой дескриптор узла использует узел magenta
для связи с нашим узлом:
int remote_nd;
int magenta_nd;
magenta_nd = netmgr_strtond("/net/magenta", NULL);
printf("ND узла magenta — %d\n", magenta_nd);
remote_nd = netmgr_remote_nd(magenta_nd, ND_LOCAL_NODE);
printf("С точки зрения узла magenta, наш ND — %d\n",
remote_nd);
Это программа могла бы вывести что-то вроде следующего:
ND узла magenta - 7
С точки зрения узла magenta, наш ND — 4
Это говорит о том, что на узле magenta
нашему узлу соответствует дескриптор «4». (Обратите внимание на использование специальной константы ND_LOCAL_NODE, которая в действительности равна нулю, для указания на «локальный узел»).
Теперь вернемся к тому, о чем мы говорили в разделе «Кто послал сообщение?»). Параметр struct _msg_info
содержит, среди всего прочего, два дескриптора узлов:
struct _msg_info {
int nd;
int srcnd;
...
};
Мы определили в описании для этих двух полей, что:
•
•
Так, для приведенного выше примера, где узел wintermute
— локальный, а узел magenta
— удаленный, когда узел magenta
посылает нам (узлу wintermute
) сообщение, эти поля заполняются следующим образом:
•
•
Наследование приоритетов
Одним из интересных моментов в операционных системах реального времени является феномен инверсии приоритетов.
Инверсия приоритетов наблюдается, например, в случае, когда поток с низким приоритетом потребляет все процессорное время, в то время как в состоянии готовности находится поток с более высоким приоритетом.
Вы, наверное, сейчас думаете: «Минуточку! Вы утверждали ранее, что поток с более высоким приоритетом будет всегда вытеснять поток с более низким приоритетом! Как же такое может быть?»