-->

QNX/UNIX: Анатомия параллелизма

На нашем литературном портале можно бесплатно читать книгу QNX/UNIX: Анатомия параллелизма, Цилюрик Олег Иванович-- . Жанр: Программирование / ОС и Сети. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
QNX/UNIX: Анатомия параллелизма
Название: QNX/UNIX: Анатомия параллелизма
Дата добавления: 16 январь 2020
Количество просмотров: 311
Читать онлайн

QNX/UNIX: Анатомия параллелизма читать книгу онлайн

QNX/UNIX: Анатомия параллелизма - читать бесплатно онлайн , автор Цилюрик Олег Иванович

Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса. Некоторые из результатов испытаний тестовых примеров будут большим сюрпризом даже для самых бывалых программистов. Тем не менее излагаемые техники вполне доступны и начинающим программистам: для изучения материала требуется базовое знание языка программирования C/C++ и некоторое понимание «устройства» современных многозадачных ОС UNIX.

В качестве «испытательной площадки» для тестовых фрагментов выбрана ОСРВ QNX, что позволило с единой точки зрения взглянуть как на специфические механизмы микроядерной архитектуры QNX, так и на универсальные механизмы POSIX. В этом качестве книга может быть интересна и тем, кто не использует (и не планирует никогда использовать) ОС QNX: программистам в Linux, FreeBSD, NetBSD, Solaris и других традиционных ОС UNIX.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

  return EXIT_FAILURE;

 }

 /* В результате по адресу dpp создана структура диспетчеризации */

 /* Инициализация атрибутов менеджера ресурсов */

 memset(&resmgr_attr, 0, sizeof resmgr_attr);

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = MESSIZE_MAX;

 /* Задаем число доступных структур векторов ввода/вывода (IOV) = 1.

    Задаем максимальный размер буфера получения равным MESSIZE_MAX.

    В результате инициализируются атрибуты менеджера ресурсов */

 /* Инициализация функций обработки сообщений */

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_funcs,

  _RESMGR_IO_NFUNCS, &io_funcs);

 /* В результате заполняются две таблицы (структуры), задающие функции

    обработки для двух специальных типов сообщений:

    таблица функций связи и таблица функций ввода/вывода.

    В соответствующих местах размещаются принимаемые по умолчанию функции

    iofunc_*_default() ... Своими не заменяем - нет необходимости. */

 /* Инициализация используемой устройством структуры атрибутов */

 iofunc_attr_init(&attr, S_IFNAM | 0666, 0, 0);

 attr.nbytes = MESSIZE_MAX + 1;

 /* В результате инициализируется структура атрибутов,

    используемая устройством;

    S_IFNAM указывает, что тип устройства - Special named file,

    побитовые флаги определяют права доступа,

    число байт в ресурсе задается равным размеру буфера. */

 /* Прикрепление имени устройства */

 if ((id = resmgr_attach(dpp, &resmgr_attr, "/dev/MESSTEST/RM", _FTYPE_ANY,

  0, &connect_funcs, &io_funcs, &attr)) == -1) {

  printf("%s: невозможно прикрепить имя менеджера"

   " ресурсов.n", argv[0]);

  return EXIT_FAILURE;

 }

 /* Ключевое действие: мы регистрируем на нашем узле имя /dev/MESSTEST/RM

    dpp и resmgr_attr - инициализированные выше структуры;

    /dev/MESSTEST/RM - ассоциированное с устройством имя,

    _FTYPE_ANY - определяет тип открытия устройства (в данном случае

    допускается любой тип запроса открытия); равный нулю флаг

    разборки пути имени файла определяет, что запрос -

    только по имени /dev/MESSTEST/RM,

    &connect_funcs - заданные выше подпрограммы связи;

    &io_funcs - заданные выше подпрограммы ввода/вывода;

    attr - инициализированная выше структура атрибутов устройства.

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

    приватные, с передачей их обработчику для таких сообщений -

    PrivatHandler() */

 if (message_attach(dpp, NULL, 0x5000, 0x5fff, &PrivatHandler, NULL) == -1) {

  printf("невозможно подключить данный "

   "диапазон приватных сообщенийn");

  return(EXIT_FAILURE);

 }

 /* Размещение контекстной структуры */

 ctp = dispatch_context_alloc(dpp);

 /* Размер буфера сообщений, содержащегося а этой структуре, равно как и

    число векторов ввода/вывода, также содержащихся в этой структуре,

    установлены при инициализации структуры атрибутов менеджера ресурсов */

 /* Запуск петли сообщений менеджера ресурсов */

 while(1) {

  // ожидание прихода сообщений

  if ((ctp = dispatch_block(ctp)) == NULL) {

   printf("ошибка блокаn");

   return EXIT_FAILURE;

  }

  printf("Менеджер ресурсов получил сообщение"

   " длиной %i байтn", ctp->resmgr_context.info.msglen);

  result = dispatch_handler(ctp);

  // сообщение раскодируется, и на основании заданных таблиц функций связи

  // и ввода/вывода вызывается соответствующая функция обработки сообщения

  if (result)

   printf("Менеджер ресурсов не смог обработать"

    " сообщение result = %in", result);

 }

}

/********************************************************************

Обработчик приватных сообщений, то есть сообщений, заголовок которых

укладывается в диапазон, указанный при вызове функции message_attach()

********************************************************************/

int PrivatHandler(message_context_t* ctp, int code,

Перейти на страницу:
Комментариев (0)
название