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

30. Алгоритм керування числом потоків в пулі потоків.

Пулы потоков – это несколько потоков, используемых для определенной цели. В пуле могут находится в двух режимах функционирования: режим блокирования и режим обработки.

Библиотека для работы в QNX с пулами: <sys/dispach.h>

Для управлением пулом потоков используется специальная атрибутная структура – thread_pool_attr_t, которая содержит указатели на функции для управления потоками, и атрибуты управления количеством потоков в пуле. Управление количеством потоков в пуле осуществляет ядро ОС на основе следующих значений

1.lo_water – задает min число потоков в режиме блокировки, если число меньше указанного, создается автомат. еще increment потоков.

2.Increment – соответственно задает сколько еще потоков должно быть создано, если lo_water совпало с числом потоков в режиме ожидания.

3.hi_water – max число потоков в режиме блокирования, лишние удаляются.

4.maximum – макс. Число потоков, которые могут работать одновременно в пуле потоков.

Пользуясь данными атрибутами, мы можем применить такой алгоритм для управления числом потоков в пуле:

FOREVER DO

IF (#threads<lo_water) THEN если потоков в режиме блокир меньше чем lo_water

IF (#threads<maximum) THEN если потоков меньше чем мак число потоков в пуле

create new thread создать потоки в количестве Increment штук

context=(*context_alloc)(handle) инициализировать память созданных потоков

ENDIF

ENDIF

retval=(*block_func)(context) обработка режима ожидания

(*handle_func)(retval); режим обработки

IF (#thread>hi_water) THEN если число потоков режиме блокир больше чем hi_water

(*context_free)(context) освободить выделенную память

KILL thread убить поток

ENDIF

DONE

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

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

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

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

Существуют различные схемы обмена сообщениями:

- клиент - сервер;

- клиент - субсервер;

- клиент - многопотоковый сервер и т.д..

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

Первоначально сервер ждет от кого-нибудь сообщение. В этот момент сервер должен быть в состоянии блокировки по приему (receive). По получению общения сервер переходит в состояние готовности (ready) и становится способен выполнять работу. Если данный процесс (сервер) имеет наивысший приоритет, то он получает процессор и может обработать сообщение клиента. В какой-то момент времени сервер завершит обработку и затем «ответит» клиенту.

Клиент первоначально работал самостоятельно, пока не решил послать сообщение серверу. Клиент переключается при этом из состояния готовности (ready) в состояние либо блокировки по передаче (send), либо блокировки по приему ответа (reply), в зависимости от состояния сервера.

Состояние REPLY означает следующее: сервер принял сообщение и теперь обрабатывает его. Клиент ожидает ответа от сервера. Состояние SEND означает следующее: сервер все еще не принял сообщение, либо из-за того что занят обработкой другого сообщения, либо из-за какой-то внутренней ошибки.

Смену состояний можно отобразить следующим образом:

Сервер

Пример программы-клиента, который делает передачу сообщений.

#include <fcntl.h>

#include <stdlib.h>

#include <unistd.h>

int main ()

{ int fd;

fd = open (“my.dat”, O_WRONY|O_CREAT);

write (fd, “This is message \n”, 16);

close (fd);

return (EXIT_SUCCESS); }

Благодаря абстрагированию предоставленного сервиса, пример для распределительного обмена сообщениями выглядит аналогично локальному, за исключением указания маршрута

32. Обмін повідомленнями за моделлю "клієнти - багатопоточний сервер". (+28)

Модель клиенты - многопотоковый сервер аналогична модели клиент сервер.

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

Первоначально сервер ждет от кого-нибудь сообщение. В этот момент сервер должен быть в состоянии блокировки по приему (receive). По получению общения сервер переходит в состояние готовности (ready) и становится способен выполнять работу. Если данный процесс (сервер) имеет наивысший приоритет, то он получает процессор и может обработать сообщение клиента. В какой-то момент времени сервер завершит обработку и затем «ответит» клиенту.

Клиент первоначально работал самостоятельно, пока не решил послать сообщение серверу. Клиент переключается при этом из состояния готовности (ready) в состояние либо блокировки по передаче (send), либо блокировки по приему ответа (reply), в зависимости от состояния сервера.

Состояние REPLY означает следующее: сервер принял сообщение и теперь обрабатывает его. Клиент ожидает ответа от сервера. Состояние SEND означает следующее: сервер все еще не принял сообщение, либо из-за того что занят обработкой другого сообщения, либо из-за какой-то внутренней ошибки.

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

Потоков можно использовать библиотеку пула потоков.

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