Достоинства и недостатки объектов CRITICAL_SECTION

Достоинства и недостатки объектов CRITICAL_SECTION

Прежде всего, мы попытаемся количественно оценить влияние объектов синхронизации на производительность, и сравним между собой объекты CRITICAL_SECTION и мьютексы. В программе statsMX.c (программа 9.1) для синхронизации доступа к специфической для каждого потока структуре данных используется мьютекс. Программа statsCS.c, листинг которой здесь не приводится, но его можно найти на Web-сайте книги, делает точно то же, но с использованием объекта CRITICAL_SECTION, тогда как в программе stats IN. с для этого привлекаются функции взаимоблокировки (interlocked functions). Наконец, в программе statsNS.с, которая также здесь не приводится, синхронизация вообще не используется; оказывается, в данном примере можно вообще обойтись без синхронизации, поскольку каждый рабочий поток обращается к собственной уникальной области памяти. Некоторые предостережения по этому поводу приведены в конце данного раздела. В реальных программах количество рабочих потоков может быть неограниченным, однако для простоты в программе 9.1 обеспечивается поддержка 64 потоков.

Описанная совокупность программ не только позволяет оценить зависимость производительности от выбора конкретного типа объекта синхронизации, но и говорит о следующих вещах:

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

• В простейших ситуациях, например, когда требуется инкрементировать значение совместно используемой переменной, достаточно использовать функции взаимоблокировки.

• В большинстве случаев использование мьютексов обеспечивают более высокое быстродействие программы по сравнению с использованием объектов CS.

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

Программа 9.1. statsMX: поддержка статистики потоков

/* Глава 9. statsMX.c */

/* Простая система "хозяин/рабочий", в которой каждый рабочий поток */

/* информирует главный поток о результатах своей работы для их отображения.*/

/* Версия, использующая мьютекс. */

#include "EvryThng.h"

#define DELAY_COUNT 20

/* Использование: statsMX nthread ntasks */

/* Запускается "nthread" рабочих потоков, каждой из которых поручается */

/* выполнение "ntasks" единичных рабочих заданий. Каждый поток сохраняет*/

/* информацию о выполненной работе в собственной неразделяемой ячейке */

/* массива, хранящего данные о выполненной потоком работе. */

DWORD WINAPI worker(void *);

typedef struct _THARG {

 int thread_number;

 HANDLE *phMutex;

 unsigned int tasks_to_complete;

 unsigned int *tasks_complete;

} THARG;

int _tmain(DWORD argc, LPTSTR argv[]) {

 INT tstatus, nthread, ithread;

 HANDLE *worker_t, hMutex;

 unsigned int* task_count, tasks_per_thread;

 THARG* thread_arg;

 /* Создать мьютекс. */

 hMutex = CreateMutex(NULL, FALSE, NULL);

 nthread = _ttoi(argv[1]);

 tasks_per_thread = _ttoi(argv[2]);

 worker_t = malloc(nthread * sizeof(HANDLE));

 task_count = calloc(nthread, sizeof(unsigned int));

 thread_arg = calloc(nthread, sizeof(THARG));

 for(ithread = 0; ithread < nthread; ithread++) {

  /* Заполнить данными аргумент потока. */

  thread_arg[ithread].thread_number = ithread; 

  thread_arg[ithread].tasks_to_complete = tasks_per_thread;

  thread_arg[ithread].tasks_complete = &task_count[ithread];

  thread_arg[ithread].phMutex = &hMutex;

  worker_t[ithread] = (HANDLE)_beginthreadex (NULL, 0, worker, &thread_arg[ithread], 0, &ThId);

 }

 /* Ожидать завершения рабочих потоков. */

 WaitForMultipleObjects(nthread, worker_t, TRUE, INFINITE);

 free(worker_t);

 printf("Выполнение рабочих потоков завершено ");

 for (ithread = 0; ithread < nthread; ithread++) {

  _tprintf(_T("Количество заданий, выполненных потоком %5d: %6d "), ithread, task_count[ithread]);

 }

 return 0;

 free(task_count);

 free(thread_arg);

}

DWORD WINAPI worker(void *arg) {

 THARG * thread_arg;

 int ithread;

 thread_arg = (THARG*)arg;

 ithread = thread_arg->thread_number;

 while (*thread_arg->tasks_complete < thread_arg->tasks_to_complete) {

  delay_cpu(DELAY_COUNT);

  WaitForSingleObject(*(thread_arg->phMutex), INFINITE);

  (*thread_arg->tasks_complete)++;

  ReleaseMutex(*(thread_arg->phMutex));

 }

 return 0;

} 

Для изучения поведения различных вариантов реализации можно воспользоваться программой timep из главы 6 (программа 6.2). Тесты, которые проводились на системах, не загруженных никакими другими задачами, и состояли в выполнении 250 000 единичных рабочих заданий с использованием 1,2,4, 8, 16, 32, 64 и 128 потоков, показали следующие результаты:

• При небольшом количестве потоков (4 и менее) для выполнения каждого из вариантов реализации NS (отсутствие синхронизации), IN (функции взаимоблокировки) и CS (объекты CRITICAL_SECTION) требуется примерно одно и то же время. Вариант CS может оказаться несколько более медленным (10-20 процентов), демонстрируя типичное замедление работы программ, использующих синхронизацию. Вместе с тем, для выполнения варианта MX (мьютексы) требуется в два-три раза больше времени. 

• Производительность варианта CS на однопроцессорных системах при использовании 5 и более потоков не всегда изменяется пропорционально количеству потоков. Картина может меняться при переходе от одной NT5-системы к другой, однако, как свидетельствуют данные, для каждой конкретной системы результаты согласуются между собой. В случае некоторых систем истекшее время удваивается при переходе к следующему члену ряда 1, 2, 4 и так далее, соответствующему количеству используемых потоков, но в одном случае (Windows 2000, процессор Pentium с частотой 1 ГГц, портативный компьютер) оно составляло (в секундах) 0.5, 1.0, 2.0, 4.0, 14.9, 16.0, 32.1 и 363.4, а в другом (Windows 2000, процессор Pentium 500 МГц, на стольный компьютер) — 1.2, 2.3, 4.7, 9.3, 42.7, 101.3, 207.8 и 1212.5 секунд. Как правило, резкое изменение поведения происходит тогда, когда количество потоков начинает превышать 4 или 8, но производительность остается приемлемой, пока количество потоков не превышает 128.

• В случае однопроцессорных систем вариант MX уступает варианту CS, причем отношение показателей производительности варьирует в пределах от 2:1 до 10:1 в зависимости от типа системы.

• В случае SMP-систем производительность может резко ухудшаться в десятки и сотни раз. Интуитивно кажется, что с увеличением количества процессоров производительность может только повышаться, но в силу механизмов внутренней реализации процессоры конкурируют между собой за право владения блокировками и обращения к памяти, и это объясняет, почему результаты для вариантов MX и CS оказываются практически одинаковыми. В случае объектов CS некоторого улучшения производительности удавалось добиться за счет тонкой настройки спин-счетчиков, о чем говорится в одном из следующих разделов.

• Для ограничения количества готовых к выполнению рабочих потоков без изменения базовой программной модели можно использовать семафоры. Эта методика рассматривается далее в этой главе.

Предупреждение

В массиве task_count намеренно использованы 32-битовые целые числа, чтобы увеличить верхний предел значений счетчика заданий и избежать создания предпосылок для возникновения "разрыва слов" ("word tearing") и "конфликтов строки кэша" ("cache line conflict") в SMP-системах. Два независимых процессора, на которых выполняются смежные рабочие потоки, могут одновременно изменять значения счетчиков смежных заданий путем внесения соответствующих изменений в свои кэши (32-битовые в системах на основе Intel x86). Вместе с тем, реально записываться в память будет только один кэш, что может сделать результаты недействительными. Чтобы избежать возможных рисков, следует позаботиться об отделении рабочих ячеек каждым из потоков друг от друга и их выравнивании в соответствии с размерами кэшей. В данном примере счетчик заданий может быть сгруппирован с аргументом потока, так что использованию 32-битовых счетчиков ничто не препятствует. Эта тема исследуется в упражнении 9.6. 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Не только достоинства VoIP

Из книги Skype: бесплатные звонки через Интернет. Начали! автора Гольцман Виктор Иосифович

Не только достоинства VoIP Недостатки VoIP-телефонии – это продолжение достоинств. Поскольку телефонная связь осуществляется через Интернет, то ее надежность напрямую зависит от качества и надежности интернет-соединения. А оно, прямо скажем, не всегда бывает на высшем


44. Достоинства и недостатки оптимизации

Из книги Программирование автора Козлова Ирина Сергеевна

44. Достоинства и недостатки оптимизации Оптимизация кодов для любого языка всегда заставляет идти на компромиссы. Такими компромиссами являются:1) сокращение используемого объема памяти в результате снижения быстродействия;2) увеличение быстродействия в результате


Достоинства и недостатки симметричного и асимметричного методов шифрования

Из книги Защити свой компьютер на 100% от вирусов и хакеров автора Бойцев Олег Михайлович

Достоинства и недостатки симметричного и асимметричного методов шифрования На сегодняшний день в сфере ИБ широко представлены системы как с симметричным шифрованием, так и с асимметричным. Каждый из алгоритмов имеет свои преимущества и недостатки, о которых нельзя не


21.1. Достоинства и недостатки

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

21.1. Достоинства и недостатки В этой главе будет рассмотрена настройка Linux как рабочей станции для игрового зала. У вас может возникнуть вопрос: почему именно как рабочей станции? Ответ очень прост: любую Linux-систему довольно легко превратить из рабочей станции в сервер,


Использование объектов CRITICAL_SECTION для защиты разделяемыхпеременных

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Использование объектов CRITICAL_SECTION для защиты разделяемыхпеременных Использование объектов CRITICAL_SECTION не вызывает сложностей, и одним из наиболее распространенных способов их применения является обеспечение доступа потоков к разделяемым глобальным переменным.


Сравнительный обзор: мьютексы и объекты CRITICAL_SECTION

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Сравнительный обзор: мьютексы и объекты CRITICAL_SECTION Как уже неоднократно упоминалось, мьютексы и объекты CRITICAL_SECTION весьма напоминают друг друга и предназначены для решения одного и того же круга задач. В частности, объекты обоих типов могут принадлежать только одного


Дополнительные рекомендации относительно использования мьютексов и объектов CRITICAL_SECTION

Из книги Интернет – легко и просто! автора Александров Егор

Дополнительные рекомендации относительно использования мьютексов и объектов CRITICAL_SECTION К этому времени мы успели познакомиться со всеми объектами синхронизации Windows и исследовали их применимость на ряде примеров. Мьютексы и объекты CS рассматривались первыми, а


12.20 Недостатки DNS

Из книги Macromedia Flash Professional 8. Графика и анимация автора Дронов В. А.

12.20 Недостатки DNS Domain Name System — очень важная система. Некорректные элементы базы данных могут сделать невозможным доступ к прикладным хостам. Поскольку многие администраторы используют распределенную базу данных с ручным вводом информации, весьма вероятно возникновение


Достоинства и недостатки

Из книги Фундаментальные алгоритмы и структуры данных в Delphi автора Бакнелл Джулиан М.

Достоинства и недостатки Несомненным достоинством каталогов является наглядность и простота поиска. Вам не нужно выдумывать какие-либо запросы, а затем выискивать что-то полезное из всего того многообразия ссылок, которые нашла поисковая система, – вы точно знаете,


Достоинства и недостатки

Из книги Язык Си - руководство для начинающих автора Прата Стивен

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


Достоинства Flash

Из книги Анонимность и безопасность в Интернете. От «чайника» к пользователю автора Колисниченко Денис Николаевич

Достоинства Flash Давайте перечислим все достоинства Flash, Короля Графики, Спасителя Всея Интернета и проч., и проч., и проч., и подробно их опишем. Ну и, конечно, расскажем о его недостатках и о том, как их можно обойти или преодолеть.УниверсальностьПредставим себе двух


Достоинства и недостатки связных списков

Из книги HTML, XHTML и CSS на 100% автора Квинт Игорь

Достоинства и недостатки связных списков Связные списки обладают одним очень важным преимуществом: для них операции вставки и удаления принадлежат к классу O(1). Независимо от текущего элемента спуска и его емкости, для вставки или удаления элемента всегда требуется одно


ДОСТОИНСТВА ЯЗЫКА СИ

Из книги автора

ДОСТОИНСТВА ЯЗЫКА СИ Язык Си быстро становится одним из наиболее важных и популярных языков программирования. Его использование все более расширяется, поскольку часто программисты предпочитают язык Си всем другим языкам после первого знакомства с ним. Когда вы изучите


1.3.3. Достоинства и недостатки анонимных прокси-серверов

Из книги автора

1.3.3. Достоинства и недостатки анонимных прокси-серверов Особых преимуществ перед анонимайзерами у анонимных прокси-серверов нет, если не считать того, что вы можете выбрать анонимный прокси с нужным вам IP-адресом. А вот недостатков достаточно:? непостоянство – как уже


3.1.2. Недостатки

Из книги автора

3.1.2. Недостатки А теперь ложка дегтя – о недостатках I2P. Нет ничего идеального, и I2P – тоже не идеальна. Начнем с самой концепции I2P. Анонимизация и шифрование трафика происходит лишь внутри этой сети. Работая с I2P, вы можете обратиться только к I2P-ресурсам (к I2P-сайтам, почте,


5.8. Достоинства и недостатки фреймов

Из книги автора

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