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

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

Интервал:

Закладка:

Сделать

EDEADLK— вызывающий поток уже является владельцем блокировки в эксклюзивном режиме;

EINVAL— неверный параметр вызова: либо rwlуказывает на неинициализированный объект блокировки чтения/записи, либо время тайм-аута abs задано меньше нуля или равно или выше предельного значения 1000 миллионов;

ETIMEDOUT— не удалось захватить блокировку до истечения заданного срока тайм-аута.

Освобождение блокировки

int pthread_rwlock_unlock(pthread_rwlock_t* rwl);

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

Возвращаемые значения:

EOK— успешное завершение;

EAGAIN— при первом использовании статически инициированной блокировки чтения/записи ( PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;

EFAULT— ядро не смогло обратиться к объекту rwl;

EINVAL— объект rwlуказывает на неверно инициированный объект блокировки чтения/записи;

EPERM— нет потоков, захвативших объект rwlв режиме чтения или записи, или вызывающий поток не владеет блокировкой в режиме записи.

Использование блокировок чтения/записи

Построим приложение, использующее блокировку чтения/записи ( файл sy10.cc ):

Эффективность блокировки чтения/записи

#include

#include

#include

// сколь угодно сложные элементы внутренней базы данных

// приложения; в примере мы используем их простейший вид

typedef int element;

// база данных приложения - динамический список элементов

class dbase : public list {

static const int READ_DELAY = 1, WRITE_DELAY = 2;

public:

// операция "добавить в базу данных"

void add(const element& e) {

int pos = size() * rand() / RAND_MAX;

list::iterator p = begin();

for (int i = 0; i < pos; i++) p++;

insert(p, e);

delay(WRITE_DELAY);

}

// операция "найти в базе данных"

int pos(const element& e) {

int n = 0;

for (list::iterator i = begin(); i != end(); i++, n++)

if (*i == e) {

delay(READ_DELAY);

break;

}

if (n == size()) n = -1;

return n;

}

} data;

inline element erand(unsigned long n) {

return (element)((n * rand()) / RAND_MAX);

}

inline bool wrand(double p) {

return (double)rand() / (double)RAND_MAX < p;

}

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

// общее число обращений приложения к базе данных

static unsigned long n = 1000;

// вероятность обновления базы данных при обращении

static double p = .1;

unsigned long m;

if (argc > 1 && (m = atoll(argv[1])) ! = 0) n = m;

double q;

if (argc > 2 && (q = atof(argv[2])) != 0) p = q;

// начальное заполнение базы данных

for (int i = 0; i < n; i++) data.add(erand(n));

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

const uint64_t cps = SYSPAGE_ENTRY(qtime)->cycles_per_sec;

// последовательность n обращений к базе данных,

// из них p*n требуют обновления списка, а остальные

// (1-p)*n требуют только выборки данных:

uint64_t t = ClockCycles();

for (int i = 0; i < n; i++) {

element e = erand(n);

if (!wrand(p)) data.pos(e);

else data.add(e);

}

t = ((ClockCycles() - t) * 1000000000) / cps;

cout << "evaluation time: " << (double)t / 1.E9

<< " sec." << endl;

return EXIT_SUCCESS;

}

Перед нами простейшая последовательная программа, которая массированно читает свою базу данных и изредка ее модифицирует. Для выполнения реальных операций чтения/записи данных программе необходимо выполнять некоторые достаточно продолжительные операции. В приведенном коде эти операции имитируются задержками delay(WRITE_DELAY)и delay(READ_DELAY).

Возникает совершенно естественное желание преобразовать последовательные запросы к данным в параллельные ( файл sy11.cc ). Для этого преобразуем структуру списка элементов, с которым работаем:

class dbase : public list {

static const int READ_DELAY = 1, WRITE_DELAY = 2;

pthread_mutex_t loc;

public:

dbase(void) { pthread_mutex_init(&loc, NULL); }

~dbase(void) { pthread_mutex_destroy(&loc); }

void add(const elements e) {

pthread_mutex_lock(&loc);

int pos = size() * rand() / RAND_MAX;

list::iterator p = begin();

for (int i = 0; i < pos; i++) p++;

insert(p, e);

delay(WRITE_DELAY);

pthread_mutex_unlock(&loc);

}

int pos(const elements e) {

int n = 0;

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

Интервал:

Закладка:

Сделать

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

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


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

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

x