Передача данных
Передача данных
Как уже обсуждалось, передача данных в потоке происходит в виде сообщений. Процесс инициирует передачу данных с помощью системных вызовов write(2) и putmsg(2), которые непосредственно взаимодействуют с головным модулем. Головной модуль формирует сообщение, копируя в него прикладные данные, и передает его следующему модулю вниз по потоку. В конечном итоге сообщение принимается драйвером, который выполняет необходимые операции с конкретным устройством. В случае, когда драйвер получает данные от устройства, он также передает их в виде сообщений вверх по потоку. Процесс имеет возможность получить данные с помощью системных вызовов read(2) или getmsg(2). Если в головном модуле данные отсутствуют, процесс блокируется и переходит в состояние сна.
Сообщения передаются модулями с помощью системной функции putnext(9F):
#include <sys/stream.h>
#include <sys/ddi.h>
int putnext(queue_t *q, mblk_t *mp);
Эта функция адресует очередь следующего модуля параметром q и вызывает процедуру xxput() этой очереди, передавая ей сообщение mp. Не поощряется непосредственный вызов функции xxput() следующего модуля, поскольку это может вызвать определенные проблемы переносимости.
Передача данных внутри потока осуществляется асинхронно и не может блокировать процесс. Блокирование процесса возможно только при передаче данных между процессом и головным модулем. Таким образом, функции обработки данных потока — xxput() и xxservice() не могут блокироваться. Если процедура xxput() не может передать данные следующему модулю, она помещает сообщение в собственную очередь, откуда оно может быть передано позже процедурой xxservice(). Если и процедура xxservice() не может осуществить передачу сообщения, например, из-за переполнения очереди следующего модуля, она не будет ожидать изменения ситуации, а вернет сообщение обратно в собственную очередь и завершит выполнение. Попытка передачи повторится, когда ядро через некоторое время опять запустит xxservice().
Процедура xxservice() вызывается в системном контексте, а не в контексте процесса, который инициировал передачу данных. Таким образом, блокирование процедуры xxservice() может заблокировать (перевести в состояние сна) независимый процесс, что может привести к непредсказуемым результатам и потому недопустимо. Решение этой проблемы заключается в запрещении процедурам xxput() и xxservice() блокирования своего выполнения.
Блокирование недопустимо и для драйвера. Обычно прием данных драйвером осуществляется с использованием прерываний. Таким образом процедура xxput() вызывается в контексте прерывания и не может блокировать свое выполнение.
Когда процедура xxput() не может передать сообщение следующему модулю, она вызывает функцию putq(9F), имеющую следующий вид:
#include <sys/stream.h>
int putq(queue_t *q, mblk_t *mp);
Функция putq(9F) помещает сообщение mp в очередь q, где сообщение ожидает последующей передачи, и заносит очередь в список очередей, нуждающихся в обработке. Для таких очередей ядро автоматически вызывает процедуру xxservice(). Планирование вызова процедур xxservice() производится функцией ядра runqueues().[59] Функция runqueues() вызывается ядром в двух случаях:
? Когда какой-либо процесс выполняет операцию ввода/вывода над потоком.
? Непосредственно перед переходом какого-либо процесса из режима ядра в режим задачи.
Заметим, что планирование обслуживания очередей не связано с конкретным процессом и производится для всей подсистемы STREAMS в целом.
Функция runqueue() производит поиск всех потоков, нуждающихся в обработке очередей. При наличии таковых просматривается список очередей, ожидающих обработки, и для каждой из них вызывается соответствующая функция xxservice(). Каждая процедура xxservice(), в свою очередь, пытается передать все сообщения очереди следующему модулю. Если для каких-либо сообщений это не удается, они остаются в очереди, ожидая следующего вызова runqueue(), после чего процесс повторяется.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Передача и обработка данных в html-файле
Передача и обработка данных в html-файле Передача данных в html-файл:Передачу данных в html-файл можно произвести через URL-адрес. После адреса ставиться знак вопроса и после него параметр, который Вы хотите передать. Если этих параметров несколько, то между ними ставиться
fscommand - Передача данных браузеру
fscommand - Передача данных браузеру fscommand(Глобальная функция)Позволяет отправить данные программе, которая запустила данный клипСинтаксис:fscommand(command, arguments)Аргументы:Описание:С помощью функции fscommand(), фильм Flash может связываться с автономным проигрывателем или
fscommand - Передача данных браузеру
fscommand - Передача данных браузеру fscommand(Глобальная функция)Позволяет отправить данные программе, которая запустила данный клипСинтаксис:fscommand(command, arguments)Аргументы:Описание:С помощью функции fscommand(), фильм Flash может связываться с автономным проигрывателем или
Передача данных
Передача данных Как уже обсуждалось, передача данных в потоке происходит в виде сообщений. Процесс инициирует передачу данных с помощью системных вызовов write(2) и putmsg(2), которые непосредственно взаимодействуют с головным модулем. Головной модуль формирует сообщение,
Передача данных
Передача данных После создания виртуального канала взаимодействующие процессы получают возможность обмениваться данными в дуплексном режиме.Хотя фактически передача данных осуществляется в виде сегментов, ее логический вид представляет собой последовательный поток
5.3.8. Защищенная передача данных
5.3.8. Защищенная передача данных В состав пакета SSH входят еще две полезные программы — это sftp-server (FTP-сервер с поддержкой шифрования передаваемых данных) и sftp (FTP-клиент для подключения к SFTP-серверу). Давайте посмотрим на последнюю строку файла конфигурации SSH-сервера
2.1.9. Передача данных при использовании UDP
2.1.9. Передача данных при использовании UDP Мы наконец-то добрались до изучения того, ради чего сокеты и создавались: как передавать и получать с их помощью данные. По традиции начнем рассмотрение с более простого протокола UDP. Функции, которые рассматриваются в этом разделе,
2.1.11. Передача данных при использовании TCP
2.1.11. Передача данных при использовании TCP При программировании TCP и UDP применяются одни и те же функции, но их поведение при этом различно. Для передачи данных с помощью TCP необходимо сначала установить соединение, и после этого возможен обмен данными только с тем адресом, с
Урок № 67. Передача собственных материалов в переработку на сторону и передача продукции из давальческого сырья
Урок № 67. Передача собственных материалов в переработку на сторону и передача продукции из давальческого сырья В процессе производственной деятельности предприятия часто приходится осуществлять передачу собственных материалов стороннему переработчику для выпуска
Передача и получение пользовательских данных состояния
Передача и получение пользовательских данных состояния Заключительным аспектом нашего рассмотрения асинхронных делегатов будет обсуждение последнего из аргументов метода BeginInvoke() (этот аргумент у нас до сих пор был равен null). С помощью этого параметра можно передать в
6.2. Передача данных с одного экрана на другой
6.2. Передача данных с одного экрана на другой Постановка задачи Необходимо передавать данные из одной сцены в другую, используя
8.12. Функция sendfile(): быстрая передача данных
8.12. Функция sendfile(): быстрая передача данных Функция sendfile() — это эффективный механизм копирования данных из одного файлового дескриптора в другой. Дескрипторам могут соответствовать дисковые файлы, сокеты или устройства.Обычно цикл копирования реализуется следующим
Передача данных
Передача данных Код для отправки и посылки файлов приведен в листинге 12.5.Листинг 12.5private void butSend_Click(object sender, EventArgs e) { // Открываем файл для отправки и получаем его поток Stream fileStream; try { fileStream = new FileStream(fileSend, FileMode.Open); } catch (Exception exFile) { MessageBox.Show("Не могу открыть " + exFile.ToString());
Интерфейсы и передача пакетов данных
Интерфейсы и передача пакетов данных Перед запуском системы в нее необходимо загрузить огромные объемы данных. В системе R/3 4.0 для этого предусмотрена утилита, которая называется «Инструментальные средства для миграции прежней системы» (Legacy System Migration Workbench, LSMW). Принцип
Робачевский Андрей М.
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉