Роб Кёртен - Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Старинный компьютер, создан в период между 1965 и 1970 гг. компанией Digital Equipment Corporation (DEC; в настоящее время — Compaq) и имел самую продвинутую (в оригинале было «coolest» — прим. ред.) по тем временам переднюю панель. Также это был первый компьютер, который мне довелось программировать. Если у вас есть такой (особенно PDP-8/1) или его фрагменты, инструкции и т.д., известите меня об этом по электронной почте (адрес: [email protected]) — я их коллекционирую! К сожалению, эта замечательная 12-разрядная машина не работает под Neutrino. :(
pthreadsСобирательное имя для набора вызовов функций pthread_*(). Подавляющее большинство этих вызовов определены стандартом POSIX (Portable Operating System Interface for Unix) и используется при работе с потоками.
QNX Software Systems LimitedКомпания-разработчик операционных систем QNX2, QNX4 и QNX/Neutrino (QNX6).
QSSLАббревиатура от QNX Software Systems Limited.
абсолютный таймер (absolute timer)Таймер, истекающий в фиксированный момент времени, например, 20 января 2005 года в 9 часов 42 минуты утра по восточному поясному времени (EDT — Eastern Daylight Time). Сравните с определением «относительный таймер».
администратор ресурса (resource manager)Сокращенно также «resmgr». Это серверный процесс, предоставляющий произвольному клиенту ряд строго определенных сервисов на основе файловых дескрипторов. Администратор ресурса поддерживает некоторый ограниченный набор сообщений, которые соответствуют стандартным клиентским библиотечным функциям Си, таким как open(), write(), lseek(), devctl() и т.д.
асинхронный (asynchronous)Понятие, используемое для того, чтобы указать на то, что данная операция не синхронизирована по отношению к другой операции. Например, временные метки, которые генерируются микросхемой системного таймера, как говорят, «асинхронны» в отношении потока, запрашивающего задержку на некоторое время, поскольку запрос на задержку никак не синхронизирован с возникающим прерыванием отсчета таймера. Сравните с определением «синхронный».
атомарная операция (atomic operation)Операция, которая является «неделимой», то есть такая, которая не может быть прервана любой другой операцией. Атомарные операции критично важны, особенно в подпрограммах обработки прерываний и многопоточных программах, поскольку последовательность событий типа «проверить и установить», которая осуществляется в одном потоке, должна быть гарантирована от прерывания другим потоком. Любую последовательность можно сделать атомарной с точки зрения защищённости от вмешательства других потоков, применяя мутексы или — в обработчиках прерываний — функции InterruptLock() и InterruptUnlock(). См. также заголовочный файл <atomic.h>.
атрибутная запись (attribute structure)Структура, используемая в пределах администратора ресурса и содержащая информацию, относящуюся к устройству, которое администратор ресурса декларирует в пространстве имен путей, Если администратор ресурса декларирует несколько устройств (например, администратор последовательного порта может объявить /dev/ser1 и /dev/ser2), он будет поддерживать соответствующее число атрибутных записей. Сравните с определением OCB.
барьер (barrier)Объект синхронизации на уровне потоков, которому соответствует некое значение счетчика. Потоки, запрашивающие блокировку по барьеру (функция barrier_wait()), блокируются до тех пор, пока число потоков, запросивших блокировку, не станет равным указанному значению; как только это произойдет, все эти потоки будут разблокированы. Сопоставьте это с работой семафора.
блок управления открытым контекстом (open context block, сокр. OCBСтруктура данных, используемая администратором ресурсов и содержащая информацию по каждому клиентскому запросу типа open(). Если клиент открыл несколько файлов, то для каждого дескриптора файла, который этот клиент имеет у соответствующих администраторов ресурсов, будет существовать соответствующий блок управления открытым контекстом (OCB). Сравните с атрибутной записью.
блокирование (blocking)Средство синхронизации потоков по отношению к другим потокам или событиям. В заблокированном состоянии (которых имеется порядка дюжины) поток не расходует процессорное время — он находится в ожидании в списке, поддерживаемом в пределах ядра. Когда происходит ожидаемое потоком событие, поток разблокируется и снова становится способным использовать процессор.
вектор ввода/вывода (I/O Vector, сокр. IOV)Структура, в которой каждый элемент содержит указатель и длину. Обычно применяются не одиночные векторы ввода/ вывода, а массивы векторов — такой массив структур из указателей и длин определяет список фрагментов сообщения для операции фрагментации/дефрагментации (scatter/gather), позволяющей выполнять обмен сообщениями намного эффективнее (в противном случае, чтобы сформировать один непрерывный буфер, данные пришлось бы копировать по отдельности).
взаимная блокировка (deadlock)Аварийная ситуация, которая возникает, когда два потока взаимно заблокированы, ожидая друг от друга ответ. Это состояние можно легко воспроизвести: просто заставьте два потока отправить друг другу сообщение — с этого момента оба потока перейдут в состояние ожидания ответа. Поскольку оба потока блокированы, они не имеют возможности ответить, следовательно, наблюдается тупиковая ситуация. Для исключения взаимной блокировки клиенты и серверы должны придерживаться иерархического принципа обмена.
виртуальная память (virtual memory)Система виртуальной памяти — это система, в которой виртуальное адресное пространство может, но не обязательно, быть преобразовано на основе взаимно-однозначного соответствия с физическим адресным пространством. Типовым примером этого (на момент написания книги в QNX/Neutrino это не поддерживается) является система «со страничной организацией памяти», где в случае недостатка ОЗУ некоторые фрагменты адресного пространства процессов могут быть выгружены на диск. Что QNX/Neutrino действительно поддерживает, так это динамическое распределение стековых страниц.
виртуальный адрес (virtual address)Адрес, которому не обязательно соответствует физический адрес. В QNX/Neutrino все потоки работают в режиме виртуальной адресации, когда виртуальные адреса транслируются в физические при помощи диспетчера памяти. Сравните с понятиями «физический адрес» и «виртуальная память».
выравнивание (alignment)Выравнивание — характеристика операции, при которой доступ к N-байтовому элементу данных должен выполняться только по адресу, кратному N. Например, чтобы обратиться к 4-байтовому целому числу, адрес этого целого числа должен быть кратным 4 байтам (например, 0x2304B008, а не 0x2304B009). В архитектуре некоторых процессоров (CPU) при попытке невыровненного доступа генерируется ошибка выравнивания (alignment fault). В архитектуре других процессоров (например, x86) невыровненный доступ осуществляется медленнее, чем выровненный доступ.
диспетчер памяти (Memory Management Unit, сокр. MMU)Аппаратный блок (обычно интегрированный с центральным процессором), который обеспечивает трансляцию виртуальных адресов в физические и может использоваться для реализации системы виртуальной памяти. В QNX/Neutrino главным преимуществом применения диспетчер памяти является возможность обнаружить момент, когда поток обращается к виртуальному адресу, который не отображен в адресное пространство соответствующего процесса.
диспетчеризация FIFO (FIFO scheduling)При диспетчеризации FIFO (First In — First Out) поток будет использовать процессор до тех пор, пока поток с более высоким приоритетом не перейдет в состояние готовности, или пока поток добровольно не освободит процессор. Если не существует потоков с более высокими приоритетами, и поток добровольно не освобождает процессор, он будет выполняться вечно. Сопоставьте с карусельной диспетчеризацией.
идентификатор отправителя (receive ID)Когда сервер принимает сообщение от клиента, функции сервера MsgReceive() или MsgReceivev() возвращают идентификатор отправителя (часто сокращенно в программах называемый «rcvid»). Этот идентификатор rcvid затем используется по отношению к заблокированному клиенту как дескриптор, позволяя серверу отправить клиенту ответ с данными, там самым разблокировав его. После использования rcvid для ответа клиенту, он перестает иметь значение для всех вызовов функций, кроме функции MsgDeliverEvent().
идентификатор соединения (connection ID, сокр. CID)Дескриптор, возвращаемый функцией ConnectAttach() (на клиентской стороне) и используемый для всех операций обмена данными между клиентом и сервером. Идентификатор соединения аналогичен дескриптору файла в терминах стандартной библиотеки языка Си — иными словами, когда функция open() в QNX/Neutrino возвращает дескриптор файла, реально возвращается идентификатор соединения.