Разработка структур данных с диiиплиной доступа один пишет - много читают для многопоточного взаимодействия в системах реального времени
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
акже необходимо отметить, что различные компиляторы под разными операционными системами имеют различные возможности по работе с процессорными инструкциями типа CAS, которые использовались при реализации некоторых функций. Microsoft Visual Studio обеспечивает доступ к этим инструкциям на центральных процессорах архитектуры Intel с помощью семейства функций _InterlockedCompareExchange и _InterlockedCompareExchangePointer, определенных в заголовочном файле intrin.h. Для атомарных операций увеличения и уменьшения значения счетчика на единицу можно использовать функции _InterlockedIncrement и _InterlockedDecrement.
Помимо этого стоит отметить, что _InterlockedCompareExchange имеет несколько отличный синтаксис от описанных ранее в данной работе атомарных операций CAS: параметры следуют в ином порядке и, кроме того, возвращаемый результат - это не логическое значение, определяющее, успешно ли совершена операция. Результат функции _InterlockedCompareExchange - старое значение, которое хранилось по адресу.
Суммарный объём разработанных классов без учёта комментариев составляет около тысячи строк.
.2 Тестирование разработанных алгоритмов
Прежде чем приступить к тестированию разработанной структуры при многопоточном доступе, необходимо проверить, что разработанные алгоритмы правильно функционируют. Для этого можно использовать изолированное тестирование каждого алгоритма, при этом должен быть обеспечен проход по каждой ветви.
Для проверки алгоритма записи без запуска алгоритма освобождения памяти введённое значение записывалось в указанную ячейку, после чего сравнивались записанное значение и значение, находящееся в ячейке. Кроме того проверялись указатель на вершину списка выбывших узлов, значение, хранящееся в данном узле, и счётчик. Ошибок выявлено не было.
Для проверки алгоритмов чтения необходимо проверить ситуацию, когда во время чтения данные были изменены. Для этого перед проверкой успешности чтения была введена одноразовая задержка, за время которой изменилось значение в текущей ячейки массива. В результате в первый раз значение считано не было, также не произошло увеличение счётчика в методе неблокирующего подсчёта ссылок, а в методе опасных указателей не изменился опасный указатель. Во второй раз данные успешно считались. Они оказались верными. Также были проверены: значение счётчика и указатель для метода неблокирующего подсчёта ссылок и опасный указатель для метода опасных указателей. Ошибок выявлено не было.
Для проверки алгоритмов освобождения памяти использовалась программа Visual Leak Detector. После завершения алгоритма она выдаёт информацию об утечках. Для проверки всех ветвей алгоритма освобождения памяти метода неблокирующего подсчёта ссылок (рис. 2.7) использовался следующий порядок обхода:
A1->B1->C1->E1->D2->C1->D1->E1->F1.
В алгоритме освобождения памяти метода опасных указателей (рис. 2.8) использовался следующий порядок обхода:
A1->B1->C1->D2->C3->C1->D2->E2->F1->G2->H2->C1->F1->J1.
Утечек выявлено не было:Leak Detector Version 2.2.3 installed.memory leaks detected.Leak Detector is now exiting.
Также были проверены алгоритмы добавления и удаления узлов для метода опасных указателей. В результате тестирования ошибок и утечек в данных алгоритмах выявлено не было.
.3 Тестирование разработанной структуры при многопоточном доступе
Разработка неблокирующих алгоритмов довольно сложна, разработка эффективных алгоритмов вдвойне сложнее, а отладка и тестирование многопоточных программ, тем более неблокирующих, занятие не менее простое, но является очень важной составляющей процесса разработки программ. Отладка многопоточных программ (а тем более неблокирующих) занятие не из простых. Ошибки, возникшие в условиях высокой нагрузки очень сложно воспроизвести в режиме отладки, когда нагрузка отсутствует, к тому же весьма непростой задачей является поиск ошибки в программе, если ошибка не воспроизводится. Однако в условиях разработанной структуры и поставленной задачи тестирование заметно упрощается, так как могут возникнуть всего три проблемы:
)Некорректность данных. Возникает, если пишущий поток не успел закончить запись, а читающий уже получил доступ к этим данным и начал читать. Также данная проблема может возникнуть, если читающий поток читает данные, пишущий подменяет старые данные на новые, а в результате читающий поток считал часть старых данных и часть новых данных.
)Обращение к данным, из-под которых уже освобождена память. Возникает, если память была освобождена прежде, чем все потоки завершили работу с ними.
)Утечка памяти. Возникает при условии, что освобождение памяти не происходит из-под каких-либо данных. Причиной этого может быть как то, что некоторые данные всегда помечены как используемые, так и то, что они не просматриваются по какой-либо причине.
Для тестирования первой проблемы наиболее оптимально запустить пишущий поток без освобождения памяти на одном ядре, так как в противном случае ошибка может возникнуть не из-за некорректной записи или некорректного чтения, а из-за второй проблемы, а все читающие потоки на другом. Начать проверку можно с одного читающего потока, чтобы была наибольшая конкуренция за данные, а далее увеличивать количество читающих потоков, чтобы проверить, как будут вести себя потоки в условиях прерывания одного потока и передачи процессорного времени другому потоку. В завершении тестирования первой проблемы можно запустить все потоки, в том числе и пишущий, без привязки к ядрам, чтобы про