Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Интернет » QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович
<< На главную

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 77 78 79 80 81 82 83 84 85 ... 106
Перейти на страницу:

...

Видно, как 3 клиента отправляют сообщения одновременно ([ 0000000]), поток сервера (TID = 2) немедленно получает сообщение ([ 0000000], 1-я строка), отправленное клиентом с TID = 3, два других сообщения (от клиентов с TID = 4 и 5) помещаются системой в очередь обслуживания (строки 2 и 3). После завершения обслуживания запроса от TID = 3 и ответа ([ 0000501]) поток сервера получает (извлекается из очереди ранее отправленное сообщение) сообщение от TID = 4 и так далее.

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

# n1 10

3:  [0000000]-&gt;[0000000] ... [0000501]-&gt;[0000501]

4:  [0000000]-&gt;[0000501] ... [0001003]-&gt;[0001003]

5:  [0000000]-&gt;[0001003] ... [0001505]-&gt;[0001505]

6:  [0000000]-&gt;[0001505] ... [0002007]-&gt;[0002007]

7:  [0000000]-&gt;[0002007] ... [0002508]-&gt;[0002508]

8:  [0000000]-&gt;[0002508] ... [0003010]-&gt;[0003010]

9:  [0000000]-&gt;[0003010] ... [0003512]-&gt;[0003512]

10: [0000000]-&gt;[0003512] ... [0004014]-&gt;[0004014]

11: [0000000]-&gt;[0004014] ... [0004516]-&gt;[0004516]

12: [0000000]-&gt;[0004516] ... [0005017]-&gt;[0005018]

3:  [0005501]-&gt;[0005501] ... [0006003]-&gt;[0006003]

5:  [0008024]-&gt;[0008024] ... [0008526]-&gt;[0008526]

7:  [0008038]-&gt;[0008526] ... [0009028]-&gt;[0009028]

4:  [0009273]-&gt;[0009273] ... [0009775]-&gt;[0009775]

6:  [0010377]-&gt;[0010377] ... [0010878]-&gt;[0010878]

8:  [0010590]-&gt;[0010878] ... [0011380]-&gt;[0011380]

9:  [0010952]-&gt;[0011380] ... [0011882]-&gt;[0011882]

12: [0011297]-&gt;[0011882] ... [0012384]-&gt;[0012384]

11: [0011356]-&gt;[0012384] ... [0012886]-&gt;[0012886]

10: [0012024]-&gt;[0012886] ... [0013387]-&gt;[0013388]

3:  [0012874]-&gt;[0013388] ... [0013889]-&gt;[0013889]

7:  [0014888]-&gt;[0014888] ... [0015390]-&gt;[0015390]

4:  [0016254]-&gt;[0016254] ... [0016756]-&gt;[0016756]

5:  [0017646]-&gt;[0017646] ... [0018148]-&gt;[0018148]

6:  [0019088]-&gt;[0019088] ... [0019590]-&gt;[0019590]

11: [0020206]-&gt;[0020206] ... [0020708]-&gt;[0020708]

8:  [0020320]-&gt;[0020708] ... [0021210]-&gt;[0021210]

10: [0021078]-&gt;[0021210] ... [0021712]-&gt;[0021712]

12: [0021384]-&gt;[0021712] ... [0022213]-&gt;[0022213]

7:  [0021630]-&gt;[0022213] ... [0022715]-&gt;[0022715]

9:  [0021811]-&gt;[0022715] ... [0023217]-&gt;[0023217]

3:  [0022009]-&gt;[0023217] ... [0023719]-&gt;[0023719]

Динамический пул потоков

Динамический пул потоков не является каким-то специфическим механизмом, продиктованным именно микроядерной архитектурой QNX. Это удачная искусственная конструкция, все определения которой размещены в файле &lt;sys/dispatch.h&gt;. Удивительно не то, что в составе API QNX имеется такой механизм, а то, что подобные инструменты отсутствуют в других ОС.

В предыдущих примерах кода мы неоднократно создавали наборы потоков для тех или иных целей, но всем им было присуще одно: общее количество потоков в них было фиксированным на момент создания. Это и были статическиепулы потоков, разделяющих между собой работу приложения. Архитекторы QNX идут чуть дальше: они предоставляют инструментарий для создания пулов однотипных(с общей функцией потока) потоков, в которых конкретное число потоков может увеличиваться или уменьшаться синхронно с изменением нагрузки на приложение. Именно своим динамическимсоставом эта конструкция и отличается.

Динамический пул потоков нужен разработчикам QNX в первую очередь как инструмент построения многопоточных менеджеров ресурсов - основы построения сервисов ОС QNX. Но и помимо этой цели динамический пул потоков представляет собой мощнейшее средство для конструирования параллельных механизмов обработки.

Проиллюстрируем применение динамического пула потоков примером программного кода, который был нами описан в книге [4] в главе «Сервер TCP/IP... много серверов хороших и разных». По сути, это ретранслирующий TCP/IP-сервер, но сейчас это для нас неважно:

Сервер на базе динамического пула потоков

#include &lt;pthread.h&gt;

#include &lt;sys/dispatch.h&gt;

static int ls; // прослушивающий TCP-сокет

THREAD_POOL_PARAM_T* alloc(THREAD_POOL_HANDLE_T* h) {

 return (THREAD_POOL_PARAM_T*)h;

}

// функция блокирования пула потоков

THREAD_POOL_PARAM_T* block(THREAD_POOL_PARAM_T* p) {

 int rs = accept(ls, NULL, NULL);

 if (rs &lt; 0) errx(&quot;accept error&quot;);

 return(THREAD_POOL_PARAM_T*)rs;

}

int handler(THREAD_POOL_PARAM_T* p) {

 retrans((int)p);

 close((int)p);

 delay(250);

 cout &lt;&lt; pthread_self() &lt;&lt; flush;

 return 0;

}

1 ... 77 78 79 80 81 82 83 84 85 ... 106
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу QNX/UNIX: Анатомия параллелизма - Цилюрик Олег Иванович бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга