Олег Цилюрик - 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: Анатомия параллелизма», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

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

Интервал:

Закладка:

Сделать

Ниже показано решение, свободное от многих из этих недостатков ( файл t3.cc ). Приложение представляет собой тестовую программу, осуществляющую 3 цепочки выполнения различных целевых функций ( mon1, mon2, mon3) с разными периодами для каждой цепочки (массив period[]):

Синхронизация выполнения участка кода

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

static void out(char s) {

int policy;

sched_param param;

pthread_getschedparam(pthread_self(), &policy, &param);

cout << s << param.sched_curpriority << flush;

}

// целевые функции каждой из последовательностей только

// выводят свой символ-идентификатор и следующий за ним

// приоритет, на котором выполняется целевая функция

static void mon1(void) { out('.'); }

static void mon2(void) { out('*'); }

static void mon3(void) { out('+'); }

// это всего лишь перерасчет временных интервалов,

// измеренных в тактах процессора (в наносекундах)

inline uint64_t cycles2nsec(uint64_t с) {

const static uint64_t cps =

// частота процессора

SYSPAGE_ENTRY(qtime)->cycles_per_sec;

return (с * 1000000000) / cps;

}

// структура, необходимая только для накопления статистики параметров

// ряда временных отметок: среднего, среднеквадратичного отклонения,

// минимального и максимального значений

struct timestat {

private:

uint64_t prev;

public:

uint64_t num;

double mean, disp, tmin, tmax;

timestat(void) {

mean = disp = tmin = tmax = 0.0;

num = 0;

}

// новая временная отметка в ряду:

void operator++(void) {

uint64_t next = ClockCycles(), delta;

if (num i= 0) {

double delta = cycles2nsec(next — prev);

if (num == 1) tmin = tmax = delta;

else tmin = min(tmin, delta), tmax = max(tmax, delta);

mean += delta;

disp += delta * delta;

}

prev = next;

num++;

}

// подвести итог ряда;

void operator !(void) {

mean /= (num - 1);

disp = sqrt(disp / (num - 1) - mean * mean);

}

}

// предварительное описание функции потока объекта

void* syncthread(void*);

class thrblock {

private:

static int code;

bool ok, st;

public:

pthread_t tid;

struct sigevent event;

timer_t timer;

int chid;

void* (*func)(void*);

sched_param param;

// структура только для статистики:

timestat sync;

// конструктор класса - он не только инициализирует структуру данных

// создаваемого объекта, но и запускает отдельный поток для его исполнения

thrblock(

// параметры конструктора

// - целевая функция последовательности

void (*dofunc)(void);

// - период ее синхронизации

unsigned long millisec;

// - приоритет возбуждения синхросерии

unsigned short priority;

// - копить ли статистику временных интервалов?

bool statist = false

) {

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

if (!(ok = ((chid = ChannelCreate(0)) >= 0))) return;

// создать соединение по каналу, которое будет использовать таймер

event.sigev_coid =

ConnectAttach(ND_LOCAL_NODE, 0, chid, NTO_SIDE_CHANNEL, 0);

if (!(ok = (event.sigev_coid >= 0))) return;

// занести целевую функцию, заодно выполнив

// трюк преобразования над ее типом

func = (void*(*)(void*))dofunc;

int policy;

// запомнить приоритет вызывающей программы

// под этим приоритетом и вызывать целевую функцию

pthread_getschedparam(pthread_self(), &policy, &param);

st = statist;

event.sigev_code = code++;

event.sigev_notify = SIGEV_PULSE;

// а вот это приоритет, с которым нужно будет пробуждаться от таймера!

event.sigev_priority = priority;

// создание таймера

if (!(ok = (timer_create(CLOCK_REALTIME, &event, &timer) == 0))) return;

// запуск отдельного потока, который по сигналу

// таймера будет выполнять целевую функцию

if (!(ok = (pthread_create(&tid, NULL, &syncthread, (void*)this) == EOK)))

return;

// и только после этого можно установить период срабатывания

// таймера, после чего он фактически и запускается

struct itimerspec itime;

nsec2timespec(&itime.it_value, millisec * 1000000ull);

itime it_interval = itime.it_value;

if (!(ok = (timer_settime(timer, 0, &itime, NULL) == 0))) return;

}

// признак того, что объект создан успешно и его поток запущен:

bool OK(void) { return ok; }

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

Интервал:

Закладка:

Сделать

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

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


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

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

x