Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
456 Кб
Скачать
☆

33. Обмін повідомленнями за моделлю "клієнт – сервер - субсервер". Смотри далее.

Субсерверная модель в случае одного клиента и одного субсервера на мой взгляд не имеет никакго смылса, так как получается что сервер просто перекладывает свои обязанности по выполнению заданий на субсервер, а сам заниемается только приемом сообщений от клиента. Единственным оправданием такого подхода может быть то что задания достаточно трудоемкие, и поступают с большой интенсивностью, в таком случае на сервер возлагается задача формирования очереди заданий.

34. Обмін повідомленнями за моделлю "клієнт – сервер - субсервер".

В соответствии с этой моделью сервер создает ряд других процессов (субсерверов); каждый субсервер посылает сообщения серверу, но сервер не отвечает им до тех пор, пока не получит запрос от клиента.

Затем сервер передаёт запрос клиента одному из субсерверов, отвечая таким образом на его сообщение заданием которое субсервер должен выполнить.

Особенность этой модели в том, что она является управляемой по ответу, так как выполнение задания начинается с ответа субсерверу, а стандартная модель клиент-сервер, является управляемой по запросу, так как работа начинается с передачи сообщения серверу.

Пример программы фрактальной графики распределения по сети.

Ведущая программа делит экран на 64 зоны при чём на её старте задается список узлов сети, которые могут учавствовать в работе. Затем, ведущая программа запускает рабочие программы (субсерверы) по одной на каждый узел сети и ждёт от них сообщений.

Программы – субсерверы посылают сообщение ведущей о готовности к работе. Ведущая по очереди берёт незаполненные зоны и передаёт задачу фрактальных вычислений программе-субсерверу, отвечая ей на её сообщение.

Потом субсервер посылает рещультаты ведущей, которая выводит их на экран. Так как данные он отправил, то он опять готов получить новое задание.

Если бы ведущая использовала «клиент-сервер» она была бы блокирована и не могла бы работать до тех пор, пока субсервер закончит обработку.

Эта модель является reply-driven моделью, так как выполнение задания начинается с ответа сервера субсерверу, в котором содержится задание. В данной модели задачей сервера является распределение заданий.

35. Механізм обміну повідомленнями між клієнтом та сервером в ос qnx-6.

Архитектура клиент-сервер это механизм, когда запрос любой программы-клиента обрабатывается программой-сервером путём отправки/приёма сообщений, в которых могут передаваться некоторые данные. В QNX-6 ядро обеспечивает маршрутизацию сообщений между этими программами, выполняя роль своеобразного посредника.

В QNX-6 обмен сообщениями происходит очень быстро. К видам сообщений относятся импульсы, сигналы, сообщения.

Службы передачи сообщений копируют сообщение непосредственное с адресного пространства одного потока в другое без буферизации. Neutrino не анализирует содержание сообщения - данные в сообщении имеют значение только для отправителя и получателя.

В Neutrino передача сообщений направлена скорее к каналам и подключениям, чем непосредственно от потока к потоку. Поток, что желает получить сообщение, сначала создает канал; другой поток, что желает послать сообщение первому потоку, должен сначала создать подключение, присоединяясь к созданному каналу.

Если много потоков прикрепляются на один и тот же канал, то одно подключение будет распределено между всеми потоками.

Поток, который выполняет MsgSend(), посылая сообщение к другому потоку (который может быть в пределах другого процесса), будет блокирован, пока тот другой поток не выполнит MsgReceive(), обработает сообщение, и не выполнит MsgReply(). Если поток выполняет MsgReceive() без предварительно посланного сообщения, то он блокируется, пока другой поток не выполняет MsgSend(), то есть не пошлет сообщения.

Функция MsgReply () используется сервером для ответа клиенту, чтобы вернуть ноль или большее количество байтов, а функция MsgError () используется, чтобы вернуть клиенту только состояние. Обе функции разблокируют клиента от его MsgSend ().

Пример:

Сервер

……

while(1) {

rcvid=MsgReceive(chid, message, sizeof(message), NULL);

.......

MsgReply(rcvid, 0, message, sizeof(message)); }

........

Клиент

........

coid=ConnectAttach(0,pid_ser,1,0,0);

if (coid==-1) {printf("Connection error\n");exit(1);}

if (MsgSend(coid,smsg,strlen(smsg)+1,rmsg,sizeof(rmsg))==-1) {

printf("Send message error\n");exit(1);}

if (strlen(rmsg)>0) {printf("Process return %s\n",rmsg);}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]