исследований.
Провести исследование сети на предмет наличия в ней изолированных
групп узлов и мостов.
Проанализировать возможность восстановления полной структуры
сети (в случае, если изолированные группы узлов присутствуют).
Организовать параллельное исполнение программы, используя
возможности стандарта С++ 11.
Оценить полученный прирост производительности.
2.2 Проектирование.
В качестве языка реализации программы выбран язык C++.
С++ – язык общего назначения. За исключением, может быть,
некоторых деталей, он целиком содержит в себе язык С. Язык С++
расширяется введением средств, предназначенных для гибкого создания
необходимых типов. Программист получает возможность доопределять
свою задачу, определив новые типы, которые наиболее точно соответствуют
его задаче. Такой подход к построению программных продуктов принято
называть абстракцией данных. Информация о типах содержится в некоторых
объектах типов, определенных пользователем. Если этот подход применяется
10
правильно, то код программы становится короче и понятнее, а дальнейшее
сопровождение программного продукта упрощается.
Ключевым понятием С++ является класс. Класс - это определяемый
пользователем тип.
Классы обеспечивают удобную работу с данными пользователя:
создание интерфейсов (дающих пользователю необходимые методы доступа
и работы с данными – и не более), инициализацию определенными
начальными значениями, возможность перегрузки операций, механизмы
контроля распределения памяти.
Язык и стандартные библиотеки С++ разрабатывались с расчетом на
переносимость. Имеющиеся реализации языка С++ будут работать в
большинстве систем, поддерживающих С. В программах на С++ можно
использовать библиотеки С.
С был выбран как основа для С++ по нескольким причинам. Среди них:
универсальность, краткость; соответствие большинству задач,
заключающихся в написании системного программного обеспечения;
переносимость программных продуктов (4).
2.3 Стандарт С++ 11.
Введение стандарта С++ 11 расширяет возможности программиста в
многопоточном программировании. Работать с потоками можно как
вручную, используя std::thread (управляя запуском, числом потоков,
параметрами ожидания), так и с помощью вызова функции через
std::async. Функция, вызванная вторым способом, может быть запущена
в отдельном потоке (при необходимости).
Число одновременно работающих потоков программы задается
пользователем, учитываю проверку на корректность – не более, чем число
ядер в системе. Иначе произойдет существенный спад производительности
вследствие повышения накладных расходов на избыточное контекстное
переключение ядер процессора.
11
Стандарт С++ 11 предоставляет 4 вида мьютексов:
(необходимо подключение #include <mutex> )
· mutex — повторный захват одним и тем же потоком не
контролируется
· recursive_mutex — повторные захваты тем же потоком допустимы,
каждый такой захват учитывается счетчиком
· timed_mutex — нет контроля повторного захвата тем же потоком,
поддерживается захват мьютекса с тайм-аутом;
· recursive_timed_mutex — повторные захваты тем же потоком
допустимы, ведётся счётчик таких захватов, поддерживается захват
мьютекса с тайм-аутом.
Сбор результирующих данных программой производится в глобальную
структуру MyRes, представляющую собой вектор результирующих строк.
Запись в структуру не вызывает взаимоблокировок потоков вследствие того,
что запускаемые одновременно потоки гарантированно не завершатся
одновременно (если не произойдет ошибки, в этом случае поток завершится
без обращения к структуре) – соответственно, каждый поток к моменту
завершения получает доступ к незаблокированной структуре MyRes без
необходимости согласовывать свой доступ с другими потоками и дожидаться
ее разблокировки. Таким образом, отпадает необходимость использовать
механизм мьютексов-семафоров для синхронизации потоков, и, тем более –
писать собственный мьютекс.
2.4 Модель.
Пусть есть граф G=(V, E).
Информация о сети генерируется как набор вершин ∈
объектов
класса node (приложение А), имеющих координаты расположения на
плоскости xu, yu и радиус приема/передачи радиосигнала rangeu.
12
По этому набору программой вычисляется множество E ребер,
соединяющих пары вершин графа.
Ребро между u и v определяется, как возможность узлов обмениваться
информацией без участия дополнительных передатчиков. Для этого оба узла
должны находиться в зоне радиовидимости друг друга, т. е. расстояние
( − )+ ( − ) должно быть меньше, чем rangeu и rangev.
Сформулируем условие окончательно:
Ребро e(u, v) добавляется в граф G тогда и только тогда, когда
( − )+ ( − ) < min, ∈(‑,‑)
Узлы сети заданы вектором объектов класса node (приложение А).
Проведя анализ расстояний, получим список смежности графа.
Таким образом, получаем граф G=(V, E), являющийся моделью
структуры данной сети. В программе представлен объектом класса grafe
(приложение Б)
Недостаток такой модели заключается в том, что при высокой степени
связности графа (на практике это может выражаться в большом скоплении
узлов сети в пределах прямой видимости. Схема связей в этом случае
стремится к «каждый к каждому») алгоритм поиска мостов, основанный на
рекурсивном обходе, вызовет переполнение стека вызовов. Однако, в
современных условиях вероятность наступления такой ситуации очень мала
(т. к. потребуется собрать свыше 30000 устройств внутри круга радиуса r ≤
100 м., препятствий обмену радиосигналом между устройствами быть не
должно).
Алгоритмы.
Для поиска связных компонент используется итеративная форма
обхода графа в глубину.
Описание алгоритма итеративного обхода в глубину:
Пусть вершины графа перенумерованы i=1…n, n – общее число
вершин.
13
Поиск компонент связности.
Для нахождения всех групп изолированных узлов сети,
представленных компонентами связности в графовой модели, необходимо
обойти граф в глубину. Каждый обход из непосещенной вершины графа
будет возвращать множество вершин, находящихся в одной компоненте
связности со стартовой вершиной. Если таковая компонента одна, то граф
является связным, изолированных узлов в сети нет. Иначе в векторе
Components после завершения просмотра графа получим номера компонент
связности и список вершин, входящих в каждую компоненту.
Поскольку обходятся все ребра графа, временная оценка алгоритма
О(|V|+|E|).
Компоненты связности представлены в классе grafe полем vector<vector
<int>> Components.
Сведения о восстановлении структуры хранятся в виде расстояний
между парами компонент UCi, UCj; , = 1$$$,$#$ , k – число компонент.
На рисунке 3. изображен граф G сети с 6 узлами. Узлы 4 и 5 находятся
в одной компоненте связности, остальные узлы изолированы (находятся в
компонентах связности, состоящих из 1 узла).
14
Рисунок 3 – Пример графа ad hoc сети.
Поскольку для установки связи со всеми узлами компоненты UCi
достаточно установить связь хотя бы с одним ее узлом, то представим группу
узлов, входящих в компоненту UCi, как один узел ACi, имеющий
характеристики, средние по всем узлам компоненты UCi:
%&' =()
*+
,-
.' (1)
%&' =()
*+
,-
.' (2)
‑%&' =(‑)
*+
,-
.' (3)
Где ni – число вершин в i-й компоненте.
Для показанного на рис. 6. Графа после преобразования получим вид,
изображенный на рисунке 7 , некоторые компоненты перенумерованы для
удобства.
15
Рисунок 4 – Граф ad hoc сети после преобразования компоненты
связности.
Эти данные хранятся в векторе объектов класса
T_Averaged_Components (приложение В).
Поиск мостов.
Из определения моста, приведенного выше, следует, что ребра (u, v),
являющиеся мостами в данной сетевой модели, имеют в ней особое значение.
Соответственно, таким участкам следует уделить внимание в виде
повышения их надежности (усиление аппаратуры конкретных узлов,
соединенных мостом), либо добавления дополнительных мостов,
связывающих сегменты, содержащие u и v для снижения вероятности
разрыва структуры сети в случае выхода из строя моста (u, v).
Для того чтобы найти мосты в графе, необходимо для каждого ребра:
А) Удалить его из графа.
Б) Проверить, не увеличилось ли число компонент связности
16
В) Если увеличилось – добавляем это ребро в вектор, хранящий
информацию о мостах.
Информация о найденных мостах хранится в grafe::Bridges – векторе
объектов класса T_Bridges (приложение Г).
Координаты и область радиовидимости узла (x, y, range) задаются
псевдослучайными числами и ограничены диапазонами: ∈ 10,1003, ∈
10,1003,‑ ∈ 10,1003 . Псевдослучайное задание величины range
имитирует влияние препятствий на прохождение радиосигнала между
узлами.
Для выяснения зависимости появления мостов в сети от плотности
расположения узлов, расположенных на фиксированной площади, были
проведены серии из 50 тестов на графовых моделях сетей случайного
построения из 500, 1500, 4500 и 13500 узлов.
Обозначим среднее число мостов B(N), среднее время поиска мостов
T(N), время, затраченное на поиск одного моста T1(N). N – число вершин в
тестируемом графе.
Результаты тестирования представлены в таблице 2.
Таблица 2.
Результаты оценки величин B(N), T(N), T1(N) для проведенных серий
испытаний.
N = 500 N = 1500 N = 4500 N = 13500
B(N) 6 13 26 48
T(N), мс. 0,96 4,3 38 339
T1(N), мс. 0,16 0,33 1,46 7,06
Более наглядно итоги показаны на рисунках 5 и 6.
17
Рисунок 5 – Итоговый график, показывающий изменение среднего
количества мостов при увеличении плотности размещения узлов в сети.
Рисунок 6 – Итоговый график, показывающий изменение времени,
затраченного на поиск одного моста при увеличении плотности размещения
узлов в сети.
Видно, что с ростом количества узлов в сети, при фиксированной
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


