Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Шрифт:
Операция, которая является «неделимой», то есть такая, которая не может быть прервана любой другой операцией. Атомарные операции критично важны, особенно в подпрограммах обработки прерываний и многопоточных программах, поскольку последовательность событий типа «проверить и установить», которая осуществляется в одном потоке, должна быть гарантирована от прерывания другим потоком. Любую последовательность можно сделать атомарной с точки зрения защищённости от вмешательства других потоков, применяя мутексы или — в обработчиках прерываний — функции InterruptLock и InterruptUnlock.
Структура, используемая в пределах администратора ресурса и содержащая информацию, относящуюся к устройству, которое администратор ресурса декларирует в пространстве имен путей, Если администратор ресурса декларирует несколько устройств (например, администратор последовательного порта может объявить
Объект синхронизации на уровне потоков, которому соответствует некое значение счетчика. Потоки, запрашивающие блокировку по барьеру (функция barrier_wait), блокируются до тех пор, пока число потоков, запросивших блокировку, не станет равным указанному значению; как только это произойдет, все эти потоки будут разблокированы. Сопоставьте это с работой семафора.
Структура данных, используемая администратором ресурсов и содержащая информацию по каждому клиентскому запросу типа open. Если клиент открыл несколько файлов, то для каждого дескриптора файла, который этот клиент имеет у соответствующих администраторов ресурсов, будет существовать соответствующий блок управления открытым контекстом (OCB). Сравните с атрибутной записью.
Средство синхронизации потоков по отношению к другим потокам или событиям. В заблокированном состоянии (которых имеется порядка дюжины) поток не расходует процессорное время — он находится в ожидании в списке, поддерживаемом в пределах ядра. Когда происходит ожидаемое потоком событие, поток разблокируется и снова становится способным использовать процессор.
Структура, в которой каждый элемент содержит указатель и длину. Обычно применяются не одиночные векторы ввода/ вывода, а массивы векторов — такой массив структур из указателей и длин определяет список фрагментов сообщения для операции фрагментации/дефрагментации (scatter/gather), позволяющей выполнять обмен сообщениями намного эффективнее (в противном случае, чтобы сформировать один непрерывный буфер, данные пришлось бы копировать по отдельности).
Аварийная ситуация, которая возникает, когда два потока взаимно заблокированы, ожидая друг от друга ответ. Это состояние можно легко воспроизвести: просто заставьте два потока отправить друг другу сообщение — с этого момента оба потока перейдут в состояние ожидания ответа. Поскольку оба потока блокированы, они не имеют возможности ответить, следовательно, наблюдается тупиковая ситуация. Для исключения взаимной блокировки
клиенты и серверы должны придерживаться иерархического принципа обмена.Система виртуальной памяти — это система, в которой виртуальное адресное пространство может, но не обязательно, быть преобразовано на основе взаимно-однозначного соответствия с физическим адресным пространством. Типовым примером этого (на момент написания книги в QNX/Neutrino это не поддерживается) является система «со страничной организацией памяти», где в случае недостатка ОЗУ некоторые фрагменты адресного пространства процессов могут быть выгружены на диск. Что QNX/Neutrino действительно поддерживает, так это динамическое распределение стековых страниц.
Адрес, которому не обязательно соответствует физический адрес. В QNX/Neutrino все потоки работают в режиме виртуальной адресации, когда виртуальные адреса транслируются в физические при помощи диспетчера памяти. Сравните с понятиями «физический адрес» и «виртуальная память».
Выравнивание — характеристика операции, при которой доступ к N-байтовому элементу данных должен выполняться только по адресу, кратному N. Например, чтобы обратиться к 4-байтовому целому числу, адрес этого целого числа должен быть кратным 4 байтам (например, 0x2304B008, а не 0x2304B009). В архитектуре некоторых процессоров (CPU) при попытке невыровненного доступа генерируется ошибка выравнивания (alignment fault). В архитектуре других процессоров (например, x86) невыровненный доступ осуществляется медленнее, чем выровненный доступ.
Аппаратный блок (обычно интегрированный с центральным процессором), который обеспечивает трансляцию виртуальных адресов в физические и может использоваться для реализации системы виртуальной памяти. В QNX/Neutrino главным преимуществом применения диспетчер памяти является возможность обнаружить момент, когда поток обращается к виртуальному адресу, который не отображен в адресное пространство соответствующего процесса.
При диспетчеризации FIFO (First In — First Out) поток будет использовать процессор до тех пор, пока поток с более высоким приоритетом не перейдет в состояние готовности, или пока поток добровольно не освободит процессор. Если не существует потоков с более высокими приоритетами, и поток добровольно не освобождает процессор, он будет выполняться вечно. Сопоставьте с карусельной диспетчеризацией.
Когда сервер принимает сообщение от клиента, функции сервера MsgReceive или MsgReceivev возвращают идентификатор отправителя (часто сокращенно в программах называемый «rcvid»). Этот идентификатор rcvid затем используется по отношению к заблокированному клиенту как дескриптор, позволяя серверу отправить клиенту ответ с данными, там самым разблокировав его. После использования rcvid для ответа клиенту, он перестает иметь значение для всех вызовов функций, кроме функции MsgDeliverEvent.