`
Читать книги » Книги » Компьютеры и Интернет » Интернет » QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович

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

1 ... 64 65 66 67 68 ... 106 ВПЕРЕД
Перейти на страницу:

8      : cycles - 859554045; on semaphore — 1227

# nice -n-19 sy21 -n50000 -t13

2      : cycles - 832789852; on semaphore - 1281

3      : cycles - 832813231; on semaphore - 1281

4      : cycles - 832835011; on semaphore - 1281

5      : cycles - 832851360; on semaphore - 1281

6      : cycles - 832868482; on semaphore - 1281

7      : cycles - 832884308; on semaphore - 1281

8      : cycles - 832900935; on semaphore - 1281

9      : cycles - 832916093; on semaphore - 1281

10     : cycles - 832931944; on semaphore - 1281

11     : cycles - 832946479; on semaphore - 1281

12     : cycles - 832962202; on semaphore - 1281

13     : cycles - 832976433; on semaphore - 1281

14     : cycles - 832782465; on semaphore - 1281

# nice -n-19 sy21 -n50000 -t17

2      : cycles - 1142879872; on semaphore - 1344

3      : cycles - 1142906138; on semaphore - 1344

4      : cycles - 1142927650; on semaphore - 1344

5      : cycles - 1142943675; on semaphore - 1344

6      : cycles - 1142959582; on semaphore - 1344

7      : cycles - 1142974919; on semaphore - 1344

8      : cycles - 1142991068; on semaphore - 1344

9      : cycles - 1143005896; on semaphore - 1344

10     : cycles - 1143021518, on semaphore - 1344

11     : cycles - 1143036136; on semaphore - 1344

12     : cycles - 1143053448; on semaphore - 1344

13     : cycles - 1143068415; on semaphore - 1344

14     : cycles - 1143083676; on semaphore - 1344

15     : cycles - 1143098361; on semaphore - 1344

16     : cycles - 1143114009; on semaphore - 1344

17     : cycles - 1143128525; on semaphore - 1344

18     : cycles - 1142872665; on semaphore - 1344

Есть некоторая корреляция времени переключения контекста с размером выборки и количеством обрабатывающих потоков, но она в широком диапазоне этих параметров не превышает 8%. В данном приложении эта численная величина включает в себя: блокирование на семафоре, переключение на контекст другого потока и разблокирование семафора. Если вспомнить, что раньше мы получали оценки для принудительного (посредством sched_yield()) переключения контекста потоков в 375 процессорных циклов, а для захвата-освобождения семафора — порядка 870, то эти цифры хорошо согласуются с полученными сейчас результатами.

Рассматриваемые примитивы служат принципиально различным целям. Мьютекс, как уже было сказано ранее, предназначен в первую очередь для регламентации доступа к участкам программного кода. Семафоры же больше предназначены для регламентации порядка доступа к определенным объектам данных. Классическими задачами этого класса являются задачи «производитель-потребитель», когда M производителей создают некоторые объекты данных (читая эти данные с реальных внешних устройств, или создавая их как результат только внутренних вычислений, или любым другим способом), а N потребителей независимо берут произведенные объекты данных на последующую обработку.

Это настолько общий и часто встречающийся класс задач, что покажем для него простейший «скелет» в виде отдельного приложения, в котором отслеживание порядка доступа потребителей будет осуществлять счетный семафор ( файл sy22.cc). Для простоты понимания приложение сделано как трансформация кода предшествующей группы тестов. В качестве имитации производства объекта данных, как и в качестве его обработки потребителем, используется пассивная пауза ( delay()) на случайную величину (производство и обработка объектов данных в коде не показаны, так как это не относится к существу рассматриваемого — нас интересуют процессы синхронизации этих операций, а не сами операции).

Кроме основной нашей цели это приложение дополнительно демонстрирует:

• Практическое использование принудительного завершения (отмены) потоков «извне» с управлением состоянием завершаемости потоков и расстановкой точек отмены, о чем мы уже говорили ранее.

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

• Использование реентерабельных форм функций стандартной библиотеки, безопасных в многопоточной среде ( rand_r()вместо rand()).

Один производитель — T потребителей

#include <stdlib.h>

#include <stdio.h>

#include <iostream.h>

#include <unistd.h>

#include <pthread.h>

#include <errno.h>

#include <semaphore.h>

#include <atomic.h>

const int D = 10;

unsigned int T = 2;

static sem_t sem;

pthread_t* tid;

void* writer(void* data) {

 unsigned long i = (int)(data); // общий размер выборки

 unsigned int s = 1;

 while (i-- > 0) {

  delay((long)rand_r(&s) * D / RAND_MAX + 1);

  sem_post(&sem); // объект данных произведен

 }

 for (i = 0; i < T; i++) pthread_cancel(tid[i + 1]);

 return NULL;

}

static char *str; // строка результирующей диагностики

static volatile unsigned ind = 0;

1 ... 64 65 66 67 68 ... 106 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)