Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Понятие мультиплексирования. Мультиплексирование сообщений. Модель взаимодействия процессов клиент-сервер. Неравноправность клиента и сервера.




Используя технику из предыдущего примера, мы можем организовать получение сообщений одним процессом от множества других процессов через одну очередь сообщений и отправку им ответов через ту же очередь сообщений, т.е. осуществить мультиплексирование сообщений. Вообще под мультиплексированием информации понимают возможность одновременного обмена информацией с несколькими партнерами. Метод мультиплексирования широко применяется в модели взаимодействия процессов клиент-сервер. В этой модели один из процессов является сервером. Сервер получает запросы от других процессов - клиентов - на выполнение некоторых действий и отправляет им результаты обработки запросов. Наиболее часто модель клиент-сервер используется при разработке сетевых приложений, с которыми мы столкнемся на завершающих семинарах курса. Она изначально предполагает неравноправность взаимодействующих процессов:

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

· Сервер ждет запроса от клиентов, инициатором же взаимодействия выступает клиент.

· Как правило, клиент обращается к одному серверу за раз, в то время как к серверу могут одновременно поступить запросы от нескольких клиентов.

· Клиент должен знать, как обратиться к серверу (например, какого типа сообщения он воспринимает) перед началом организации запроса к серверу, в то время как сервер может получить недостающую информацию о клиенте из пришедшего запроса.

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

Примеры программ

Программа 06-1

/* Программа 06-1 для иллюстрации работы с семафорами */

/* Эта программа получает доступ к одному системному семафору, ждет пока его значение не станет больше или равным 1 после запусков программы 2,а затем уменьшает его на 1*/

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

{

int semid; /* IPC дескриптордлямассива IPC семафоров */

charpathname[] = "08-1a.c"; /* Имяфайла, использующеесядлягенерацииключа. Файлстакимименемдолженсуществоватьвтекущейдиректории */

key_tkey; /* IPCключ */

structsembufmybuf; /* Структурадлязаданияоперациинадсемафором */

/* ГенерируемIPCключизименифайла 08-1a.cвтекущейдиректориииномераэкземпляраобластиразделяемойпамяти 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can\'t generate key\n");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву семафоров, если он существует,или создать его из одного семафора, если он еще не существует, с правами доступаread&writeдлявсехпользователей */

if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){

printf("Can\'t get semid\n");

exit(-1);

}

/* Выполним операцию D(semid1,1) для нашего массива семафоров.Для этого сначала заполним нашу структуру. Флаг, как обычно, полагаем равным 0. Наш массив семафоров состоит из одного семафора с номером 0. Код операции -1.*/

mybuf.sem_op = -1;

mybuf.sem_flg = 0;

mybuf.sem_num = 0;

if(semop(semid, &mybuf, 1) < 0){

printf("Can\'t wait for condition\n");

exit(-1);

}

printf("Condition is present\n");

return 0;

}

Программа 06-1

/* Программа 06-2 для иллюстрации работы с семафорами *//* Эта программа получает доступ к одному системному семафоруи увеличивает его значение на 1, чтобы разблокировать программу 1 */

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <stdio.h>

int main()

{

int semid; /* IPC дескриптор для массива IPC семафоров */

char pathname[] = "08-1a.c"; /* Имя файла, использующееся для генерации ключа. Файл с таким именем должен существовать в текущей директории */

key_t key; /* IPC ключ */

structsembufmybuf; /* Структура для задания операции над семафором */

/* Генерируем IPC ключ из имени файла 08-1a.c в текущей директориии номера экземпляра области разделяемой памяти 0 */

if((key = ftok(pathname,0)) < 0){

printf("Can\'t generate key\n");

exit(-1);

}

/* Пытаемся получить доступ по ключу к массиву семафоров, если он существует,или создать его из одного семафора, если он еще не существует, с правами доступаread & write для всех пользователей */

if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){

printf("Can\'t get semid\n");

exit(-1);

}

/* Выполним операцию A(semid1,1) для нашего массива семафоров.Для этого сначала заполним нашу структуру. Флаг, как обычно, полагаем равным 0. Наш массив семафоров состоит из одного семафора с номером 0. Код операции 1.*/

mybuf.sem_op = 1;

mybuf.sem_flg = 0;

mybuf.sem_num = 0;

if(semop(semid, &mybuf, 1) < 0){

printf("Can\'t wait for condition\n");

exit(-1);

}

printf("Set condition\n");

return 0;

}

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных