![]() |
Процесс создания программного обеспечения для распределенных вычислений (С++).
Введение.
Данный материал рассматривает процесс создания программного обеспечения, реализующего распределенные вычисления. Будучи рассчитанным на невысокий уровень подготовки читателя, он не претендует на открытие чего-либо нового. Автор попытался поэтапно описать процесс создания программы с наиболее детальными комментариями к коду и объяснить значение каждой команды в листингах. Гуру программирования получат отличную площадку для критики и возможность предложить свои идеи, касающиеся оптимизации кода. О виновнике торжества. Точнее - о виновниках. Распределенные вычисления - способ решения трудоёмких вычислительных задач с использованием двух или более компьютеров, объединённых в сеть. В свою очередь, эта сеть компьютеров называется ботнетом (более подробную информацию можно получить, перейдя по ссылке в конце статьи). В настоящее время под «ботнетом» в большинстве случаев понимается сеть компьютеров, зараженных вредоносным программным обеспечением – ботом. Однако, принцип любого ботнета – это прежде всего какие-либо распределенные действия, поэтому автор материала предлагает читателям абстрагироваться от понятия «ботнет» и приступить к разработке необходимого для организации распределенных вычислений ПО. Шаг первый. С первого шага начинается путешествие в тысячу ли (с) (Лао-Цзы). Нашим отправным пунктом станет проектирование программы (чтобы не повторяться, назовем ее «ботом»). Бот должен уметь: 1. получать команду от сервера; 2. обрабатывать команду, т. е. классифицировать ее на «известную» или «неизвестную» и соответствующим образом обрабатывать ее параметры; 3. выполнять команду. За кажущейся примитивностью наших требований скрывается много подводных камней. Например, как бот будет узнавать о новых командах? Для этого появляется еще одно требование: программа должна поддерживать плагины. На плюсах плагинной технологии заострять внимание нет смысла, т. к. очевидно, что расширяемость программы и ее модернизация в нашем случае окажется полезной. Теперь перейдем к практической части, разбавленной теоретическими выкладками. Шаг второй. Создаем соединение и получаем команды. При написании программы использовалась среда программирования MS Visual Studio 2008. Чтобы не заниматься рутиной (имеется в виду работа с сокетами), воспользуемся стандартной библиотекой, которая присутствует в Windows: wininet.dll. Данная DLL представляет собой API для доступа к общим протоколам интернет, включая FTP, HTTP и Gopher. Это высокоуровневый API, позволяющий, в отличие от WinSock или TCP/IP, не заботиться о деталях реализации соответствующих интернет протоколов. Кстати, именно ее использует MS Internet Explorer. Если с инструментами все понятно, то детали, касающиеся алгоритма работы программы, требуют пояснения. Пусть команды, предназначенные боту, находятся на сервере в файле command.txt. Тогда для получения команд бот должен периодически соединяться с сервером и скачивать указанный файл. Следующий листинг демонстрирует описанные действия: Код:
//httpd.cppШаг третий. Обрабатываем командный файл и подключаем необходимые DLL. Под обработкой командного файла автор подразумевает действие программы, в результате которого бот получает две строки: название команды и строка, содержащая параметры этой команды (перечисленные через символ пробела). Командный файл имеет следующую структуру команды: <команда(1)> [параметр(1)] [параметр(2)] … [параметр(i)] <команда(2)> [параметр(1)] [параметр(2)] … [параметр(j)] … <команда(k)> [параметр(1)] [параметр(2)] … [параметр(n)] где i, j, k меняются в интервале (1; бесконечность). Действия бота следующие: 1. выделение k-ой строки; 2. передача выделенной строки в функцию, которая реализует подключение библиотеки, необходимой для выполнения команды (в листинге – функция PlugLibrary); 3. PlugLibrary сама разделяет строку на команду и параметры и выполняет необходимое действие, зависящие от типа команды. Первые 2 пункта реализованы в следующей функции: Код:
//parse.cpp1. Удаление известной команды (фактически: удаление библиотеки, в которой реализована команда). 2. Загрузка файла. Если файл является DLL, то подключение этой библиотеки; если является исполняемым файлом или т.п., то запуск этого файла. 3. Если известная команда, то подключение ее библиотеки и запуск. Код рассмотренной функции приведен ниже. Код:
//pluglib.cppКод:
//main.cppНемного о DLL. Стоит немного рассказать об интерфейсе подключения библиотеки, содержащей реализацию команды, к программе. Так как заранее неизвестно, сколько параметров потребуется той или иной команде (имеется ввиду в процессе разработки главного исполняемого файла), в каждой DLL происходит обработка строки с параметрами, т. е. осуществляется запись каждого параметра в массив, который, в свою очередь, DLL использует так как ей необходимо. В проекте, прилагаемом к статье, в качестве примера подключаемой DLL содержится библиотека, которая выводит MessageBox с заданными параметрами окна. Заключение. В статье были рассмотрены некоторые аспекты создания программного обеспечения, которое является основой для организации сети распределенных вычислений (также известной как «ботнет»). В качестве концепта, к материалу прилагается проект для MS Visual Studio 2008. В проекте, помимо описанных действий, реализована многопоточность, т. е. для каждой подключаемой библиотеки создается свой поток, реализовано управление пулом потоков. Тема многопоточности выходит за рамки данной статьи, поэтому автор предпочел не указывать код, реализующий работу потоков, в листингах. В заключение, хотелось бы отметить, ПО, рассмотренное в статье, никоим образом не рассчитано на деструктивные действия. Более того, сферы применения исходных кодов ограничиваются лишь фантазией программиста. http://depositfiles.com/files/pafpobeir - исходные коды рассмотренного программного обеспечения (пароль: antichat.ru). Полезные ссылки. _http://www.viruslist.com/ru/analysis?pubid=204007610 – подробная информация о ботнетах. _https://forum.antichat.ru/thread49663.html - система распределенных вычислений BruteNet (автор: ZaCo). _http://distributed.ru/wiki/what-is - распределенные вычисления и проекты, связанные с ними. (c) c0n Difesa (defec.ru) специально для antichat.ru |
Статья интересная, спасибо. И ссылки полезные. Давно искал что-нибудь толковое по теме распределенных вычислений. Ждем обновлений и добавлений :)
|
Исходник, который стягивает файл в определённый промежуток времени разбирает строки и что-то вызывает... ПРИ ЧЁМ ТУТ РАСПРЕДЕЛЁННЫЕ ВЫЧИСЛЕНИЯ? Тут не расписано как основная трудоёмкая задача разделяется на равные порции микрозадач, как микрозадачи распределяются между участниками, как участники отдают сделанные части, как проверяется правильность результата... В общем задача из разряда "как стянуть и распарсить файл", никаких распределёных вычислений тут нет.
|
groundhog
+1 ТС, я ожидал увидеть тут разделение и контроль выполнения заданий для распределенных вычислений, сбор и анализ статистики скорости работы отдельного модуля для сбалансированного разделения заданий на порции. Незачёт, тема вообще не раскрыта. |
Цитата:
Любое действие, осуществляемое посредством ботнета, является в той или иной степени распределенным, даже не смотря на то, что трудоемкая задача не разделяется явно на порции микрозадач. Например, DDoS. Несмотря на приставку distributed, задача непосредственно не делится (в подавляющем большинстве атак) на порции. Тут может возникнуть одно НО по поводу слова «вычисления». В статье ничего не вычислялось в прямом смысле этого слова, однако создавалась база для организации этих вычислений (имеется ввиду плагинная технология). Ничто не мешает бот-мастеру написать библиотеку, вычисляющую, к примеру, MD5, и, зная интерфейс подключения плагинов, подключить ее к ядру (более того, это уже прекрасно сделано и описано за меня - рекомендую обратиться к ссылкам). Помимо всего прочего, потребуется написать едва ли не превышающую по объему серверную часть, отвечающую за разбивание задачи на порции и организующую раздачу этих порций ботом. Обращаю Ваше внимание на то, что в самом начале статьи я указал, на кого она рассчитана, тем самым избавив себя от рассмотрения вышеперечисленных вещей. Цитата:
|
Цитата:
|
Цитата:
|
Я так полагаю под распределенными вычислениями подразумевается:
- разбиение задачи ее владельцем на несколько этапов - выполнение различных этапов разными исполнителями - передача результата от исполнителя владельцу, который на основании полученного результата принимает решение о завершении задачи или продолжении ее распределенного выполнения исполнителями с учетом полученных результатов - передача исполнителю задания должна зависить от множества факторов, в частности от результата выполнения части задачи другим исполнителем Ничего из указанного в : Цитата:
|
Вот это - распределенные вычисления
http://www.gentoo.org/doc/ru/distcc.xml |
Цитата:
http://forum.antichat.ru/thread120114.html - здесь описана разработка системы с учетом Ваших предложений. |
| Время: 14:32 |