Олег Цилюрик - QNX/UNIX - Анатомия параллелизма

Здесь есть возможность читать онлайн «Олег Цилюрик - QNX/UNIX - Анатомия параллелизма» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Санкт-Петербург, Год выпуска: 2006, ISBN: 2006, Издательство: Символ-Плюс, Жанр: Программирование, ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

QNX/UNIX: Анатомия параллелизма: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «QNX/UNIX: Анатомия параллелизма»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «QNX/UNIX: Анатомия параллелизма», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Весьма доходчивый пример для проверки и иллюстрации обработки сигналов реального времени приведен У. Стивенсом [2]. Мы же построим приложение, реализующее его основную идею: [33] Повторить приложение У. Стивенса в QNX в чистом виде не удастся — оно аварийно завершится по сигналу. Тонкий анализ этого факта интересен сам по себе, но он выходит за рамки нашего рассмотрения. Мы обращаем внимание на это обстоятельство, чтобы лишний раз сделать акцент на достаточно ощутимых отличиях реализаций QNX от схем POSIX (или того, как эти схемы понимаются в других ОС).

Приоритеты сигналов реального времени

#include

#include

#include

#include

#include

static void handler(int signo, siginfo_t* info, void* context) {

cout << "received signal " << signo << " code = " << info->si_code <<

" val = " << info->si_value.sival_int << endl;

}

int main(int argc, char *argv[]) {

cout << "signal SIGRTMIN=" << (int)SIGRTMIN

<< " - signal SIGRTMAX=" << (int)SIGRTMAX << endl;

int opt, val, beg = SIGRTMAX, num = 3,

fin = SIGRTMAX - num, seq = 3;

// обработка параметров запуска:

while ((opt = getopt(argc, argv, "b:e n")) != -1) {

switch(opt) {

case 'b': // начальный сигнал серии

if (sscanf(optarg, "%i", &val) != 1)

perror("parse command line failed"), exit(EXIT_FAILURE);

beg = val;

break;

case 'e': // конечный сигнал серии

if (sscanf(optarg, "%i", &val) != 1)

perror("parse command line failed"), exit(EXIT_FAILURE);

fin = val;

break;

case 'n': // количество сигналов в группе посылки

if (sscanf(optarg, "%i", &val) != 1)

perror("parse command line failed"), exit(EXIT_FAILURE);

seq = val;

break;

default:

exit(EXIT_FAILURE);

}

}

num = fin - beg;

fin += num > 0 ? 1 : -1;

sigset_t sigset;

sigemptyset(&sigset);

for (int i = beg; i != fin; i += (num > 0 ? 1 : -1))

sigaddset(&sigset, i);

pid_t pid;

// вот здесь ветвление на 2 процесса

if (pid - fork() == 0) {

// дочерний процесс, здесь будут приниматься посланные сигналы

sigprocmask(SIG_BLOCK, &sigset, NULL);

for (int i = beg; i != fin; i += (num > 0 ? 1 : -1)) {

struct sigaction act, oact;

sigemptyset(&act.sa_mask);

act.sa_sigaction = handler;

// вот оно - реальное время!

act.sa_flags = SA_SIGINFO;

if (sigaction(i, &act, NULL) < 0) perror("set signal handler: ");

}

cout << "CHILD: signal mask set" << endl;

sleep(3); // пауза для посылки сигналов родителем

cout << "CHILD: signal unblock" << endl;

sigprocmask(SIG_UNBLOCK, &sigset, NULL);

sleep(3); // пауза для приема всех сигналов

exit(EXIT_SUCCESS);

}

// родительский процесс: отсюда будут посылаться сигналы

sigprocmask(SIG_BLOCK, &sigset, NULL);

// пауза для установки обработчиков дочерним процессом

sleep(1);

union sigval value;

for (int i = beg, i != fin; i += (num > 0 ? 1 : -1)) {

for (int j = 0; j < seq; j++) {

value.sival_int = j;

sigqueue(pid, i, value);

cout << "signal sent: " << i << " with val = " << j << endl;

}

}

cout << "PARENT: finished!' << endl;

exit(EXIT_SUCCESS);

}

Идея этого теста крайне проста:

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

• Начальный и конечный номера сигналов в серии могут быть переопределены ключами -bи соответственно.

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

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

Таким образом, мы можем изменять последовательность сигналов на передаче и наблюдать последовательность их доставки к принимающему процессу. Запустим полученное приложение и сразу же командой pidinпосмотрим его состояние:

1077295 1 ./s5 10r NANOSLEEP

1081392 1 ./s5 10r NANOSLEEP

Это то, что мы и предполагали получить. Рассмотрим теперь результат выполнения приложения со значениями сигналов по умолчанию (сигналы 56...54, именно в порядке убывания, в каждой группе посылается 3 сигнала):

# ./s5

signal SIGRTMIN=41 - signal SIGRTMAX=56

CHILD: signal mask set

signal sent: 56 with val = 0

signal sent: 56 with val = 1

signal sent: 56 with val = 2

signal sent: 55 with val = 0

signal sent: 55 with val = 1

signal sent: 55 with val = 2

signal sent: 54 with val = 0

signal sent: 54 with val = 1

signal sent: 54 with val = 2

PARENT: finished!

# CHILD: signal unblock

received signal 56 code = -2 val = 0

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «QNX/UNIX: Анатомия параллелизма»

Представляем Вашему вниманию похожие книги на «QNX/UNIX: Анатомия параллелизма» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «QNX/UNIX: Анатомия параллелизма»

Обсуждение, отзывы о книге «QNX/UNIX: Анатомия параллелизма» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x