ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.11.2023
Просмотров: 116
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
75
Л
АБОРАТОРНАЯ РАБОТА
№
1
П
РОГРАММИРОВАНИЕ НЕЗАВИСИМЫХ ПОТОКОВ
Цель работы
Познакомиться с базовыми возможностями многопоточного про- граммирования; научиться работать с потоками, не имеющими инфор- мационных зависимостей.
Порядок выполнения работы
1. Изучить теоретическую часть из раздела 1 настоящего пособия.
2. Записать программу из примера 1. Скомпилировать ее и прове- рить корректность работы.
3. Доработать программу с целью поддержки n потоков.
4. Оценить стоимость запуска одного потока операционной систе- мой. Изменяя количество операций (можно использовать любую арифметическую операцию), которые исполняет функция потока, определить такое их количество, чтобы порождение потока было оправданным.
5. Добавить в программу возможность запуска потоков с разными атрибутами (см. пример 2).
6. Добавить в программу возможность передавать в поток сразу не- сколько параметров (см. пример 3).
7. Добавить в функцию потока возможность вывода информации о всех параметрах потока, с которыми он был создан.
8. Разработать программу, которая обеспечивает параллельное применение заданной функции к каждому элементу массива. Размер массива, применяемая функция и количество потоков задаются дина- мически.
9. Выполнить задание для самостоятельной работы (вариант согла- совывается с преподавателем), по результатам подготовить отчет.
Варианты заданий для самостоятельной работы
Создать упрощенный HTTP-сервер, отвечающий на любой запрос клиента (например, браузера) строкой «Request number <номер запро- са> has been processed», где под номером запроса понимается порядко- вый номер, присвоенный запросу сервером. Нумерация начинается с единицы.
76 1. Доработать однопоточную версию сервера, доступную по адре- су: http://rosettacode.org/wiki/Hello_world/Web_server#C. Обработка каждого запроса выполняется в отдельном потоке: при получении за- проса создается новый поток для его обработки, после отправки ре- зультата клиенту поток завершает свою работу. Соединение с клиен- том закрывается сразу после обработки запроса. Подробную информа- цию о работе с сокетами можно найти в книге [2].
2. Оценить производительность сервера с помощью утилиты ab
4
, входящей в комплект поставки веб-сервера Apache. Утилита создана для оценки производительности веб-сервера Apache, однако может быть использована и для оценки любого другого веб-сервера. Список оцениваемых параметров согласовать с преподавателем.
3. Оценить максимальное количество потоков, с которым может работать сервер, для различных размеров стека по умолчанию
(2 Мбайт, 1 Мбайт, 512 Кбайт).
4. Добавить в обработчик запроса от клиента запуск простейшего
PHP-скрипта, возвращающего версию PHP (?>). Вернуть номер версии клиенту. Оценить изменение производи- тельности сервера с помощью утилиты ab.
Контрольные вопросы
1. Что такое POSIX Threads? Для чего он используется в парал- лельном программировании?
2. Как можно создать новый поток? Могут ли вновь созданные потоки создавать другие потоки?
3. Какие способы завершения потока существуют? В чем их разли- чие?
4. Как задаются атрибуты потока? Можно ли изменить атрибуты созданного потока?
5. Каким образом поток, завершивший свою работу, может вернуть некоторое значение? Каким образом можно вернуть группу значений?
6. Чем отличается присоединяемый поток от отсоединенного?
7. Какой функцией (набором функций) можно отсоединить теку- щий поток?
8. Как выполнить некоторую функцию однократно любым потоком процесса?
4
ab – Apache HTTP server benchmarking tool [Electronic resource] // The
Apache Software Foundation. – URL: https://httpd.apache.org/docs/2.4/programs/ ab.html (accessed: 08.08.2017).
77
Л
АБОРАТОРНАЯ РАБОТА
№
2
П
РОГРАММИРОВАНИЕ ВЗАИМОДЕЙСТВУЮЩИХ ПОТОКОВ
Цель работы
Познакомиться со средствами планирования и синхронизации по- токов; научиться работать с потоками, которые обмениваются инфор- мацией между собой.
Порядок выполнения работы
1. Изучить теоретическую часть из раздела 2 и 3 настоящего посо- бия.
2. Записать программу из примера 4. Скомпилировать ее и прове- рить корректность работы.
3. Добавить в пример 4 вывод информации о том, какой поток ка- кую задачу взял на исполнение, а также некоторое достаточно продол- жительное вычисление в функцию do_task(). Проверить, что все за- дачи выполняются, причем каждая – не более одного раза. Отключить вызовы функций pthread_mutex_lock() и pthread_mutex_ unlock() и убедиться, что при отсутствии мьютекса некоторые задачи будут выполняться дважды, тогда как другие не выполнятся ни разу.
4. Сравнить скорости работы примитивов синхронизации – мьютек- са и спинлока. Выяснить, как количество потоков, одновременно об- ращающихся к ресурсу, защищенному примитивом синхронизации, влияет на скорость исполнения программы.
5. Реализовать условную переменную с помощью мьютекса и цик- ла ожидания.
6. Реализовать функцию для выполнения вычислений по модели
MapReduce. Подробную информацию о модели MapReduce можно найти в электронном документе: Калита Р. MapReduce
5
. В качестве параметров функция должна принимать массив данных для обработки, имена функций map и reduce, количество разрешенных потоков.
В качестве реализации параллельного применения функции map к каж-
5
Калита Р. MapReduce [Электронный ресурс] // Блог о разработке, про- граммировании на С#/.NET, и не только. – URL: http://regfordev.blogspot.ru/
2015/09/mapreduce.html (дата обращения: 10.08.2017).
78 дому элементу массива использовать результаты пункта 8 порядка вы- полнения лабораторной работы № 1. Реализовать параллельное приме- нение функции reduce к списку, полученному в результате работы функции map.
7. Выполнить задание для самостоятельной работы (вариант согла- совывается с преподавателем), по результатам подготовить отчет.
1 2 3 4 5 6 7
Варианты заданий для самостоятельной работы
Пул потоков – это набор потоков, которые могут использоваться для решения различных задач. Задачи помещаются в общую очередь.
Свободный поток (поток, который не решает в настоящий момент ни- какую задачу) обращается к очереди для получения очередной задачи, выполняет ее, после чего запрашивает в очереди следующую задачу.
В результате исполнения некоторой задачи могут появляться новые задачи. Они также добавляются в очередь. Программа завершается, когда в очереди не остается задач и все потоки оказываются свобод- ными.
Необходимо реализовать пул потоков и на его основе решить одну из следующих задач (по согласованию с преподавателем).
1. Упрощенный веб-сервер (см. описание в разделе «Варианты за- даний для самостоятельной работы» к лабораторной работе № 1). От- личие от лабораторной работы № 1 состоит в том, что на каждый за- прос клиента отдельный поток не создается – вместо этого он ставится в очередь, откуда его забирает один из потоков пула. Сравнить макси- мальное количество поддерживаемых запросов для каждой из реализа- ций.
2. Загрузчик интернет-страниц. Доработать однопоточную версию загрузчика интернет-страницы, доступную по адресу: http://rosetta- code.org/wiki/Web_scraping#C. Загрузка каждой страницы выполняется потоком из пула потоков. Содержимое загруженной страницы сохра- няется в файл, из которого извлекаются все ссылки на другие страницы и ставятся в очередь на загрузку.
3. Производитель-потребитель с несколькими потоками-потреби- телями, одним потоком-производителем и несколькими местами на складе. За основу взять программу из примера 7.
4. Многопоточный поиск подстроки в файлах. Необходимо про- смотреть все имена файлов в заданной директории (путь к директории
Пул потоков – это набор потоков, которые могут использоваться для решения различных задач. Задачи помещаются в общую очередь.
Свободный поток (поток, который не решает в настоящий момент ни- какую задачу) обращается к очереди для получения очередной задачи, выполняет ее, после чего запрашивает в очереди следующую задачу.
В результате исполнения некоторой задачи могут появляться новые задачи. Они также добавляются в очередь. Программа завершается, когда в очереди не остается задач и все потоки оказываются свобод- ными.
Необходимо реализовать пул потоков и на его основе решить одну из следующих задач (по согласованию с преподавателем).
1. Упрощенный веб-сервер (см. описание в разделе «Варианты за- даний для самостоятельной работы» к лабораторной работе № 1). От- личие от лабораторной работы № 1 состоит в том, что на каждый за- прос клиента отдельный поток не создается – вместо этого он ставится в очередь, откуда его забирает один из потоков пула. Сравнить макси- мальное количество поддерживаемых запросов для каждой из реализа- ций.
2. Загрузчик интернет-страниц. Доработать однопоточную версию загрузчика интернет-страницы, доступную по адресу: http://rosetta- code.org/wiki/Web_scraping#C. Загрузка каждой страницы выполняется потоком из пула потоков. Содержимое загруженной страницы сохра- няется в файл, из которого извлекаются все ссылки на другие страницы и ставятся в очередь на загрузку.
3. Производитель-потребитель с несколькими потоками-потреби- телями, одним потоком-производителем и несколькими местами на складе. За основу взять программу из примера 7.
4. Многопоточный поиск подстроки в файлах. Необходимо про- смотреть все имена файлов в заданной директории (путь к директории
79 передается в качестве параметра). Если найдена директория – все фай- лы внутри ее также просматриваются. Если найден текстовый файл
(определяется по расширению *.txt), то осуществляется поиск под- строки в его содержимом.
5. Генерации простых чисел с помощью алгоритма «Решето Эрато- сфена»
6
Контрольные вопросы
1. Для чего нужны примитивы синхронизации?
2. Каков процесс работы с мьютексом? Какие функции для этого предоставляет Pthreads?
3. Перечислите основные атрибуты мьютексов и способы работы с ними.
4. Каковы ограничения на использование спинлоков?
5. Приведет ли использование спинлока к выигрышу производи- тельности на одноядерном процессоре? Почему?
6. В каких целях используется примитив синхронизации «барьер»?
7. Объясните механизм работы условных переменных.
8. Сравните мьютексы, спинлоки, барьеры и условные переменные с точки зрения области применения.
Л
АБОРАТОРНАЯ РАБОТА
№
3
О
ТЛАДКА МНОГОПОТОЧНЫХ ПРОГРАММ
Цель работы
Ознакомиться со средствами отладки многопоточных программ; изучить наиболее часто встречающиеся виды ошибок в многопоточ- ных программах и средства их обнаружения и исправления.
Порядок выполнения работы
1. Изучить теоретическую часть из раздела 4 настоящего пособия.
2. Выполнить поиск ошибки из примера 8 первым и вторым спосо- бами (см. раздел «Примеры сеансов работы с GDB»).
6
Решето Эратосфена [Электронный ресурс] // Википедия. – URL: https://ru.wikipedia.org/ wiki/Решето_Эратосфена (дата обращения: 10.11.2017).
80 3. Выполнить задание для самостоятельной работы (поиск ошибок в программе, предоставленной преподавателем), по результатам под- готовить отчет.
Контрольные вопросы
1. Перечислите наиболее часто встречающиеся ошибки при разра- ботке параллельных программ. Какие действия приводят к ошибке в каждом случае?
2. Какие ошибки чаще всего допускают при использовании
Pthreads? Как их избежать?
3. Какие категории инструментов для отладки параллельных про- грамм вы знаете? На какие классы ошибок ориентирован каждый из них?
4. Расскажите о методах отладки программ в GDB.
5. Какие команды отладчика GDB предназначены для отладки па- раллельных программ?
6. Какие режимы отладчика GDB используются для отладки парал- лельных программ?
7. Приведите пример возможного сеанса работы в GDB.
П
ОДГОТОВКА ОТЧЕТА ПО ЛАБОРАТОРНОЙ РАБОТЕ
Отчет оформляется по результатам выполнения каждой лаборатор- ной работы и предоставляется на проверку в печатной форме. Каждый студент готовит отчет самостоятельно, независимо от того, выполня- лась ли лабораторная работа индивидуально или в составе группы сту- дентов. Вместе с отчетом предоставляется разработанная программа, которая может быть оформлена в печатной (в виде приложения к отче- ту) либо в электронной форме.
При сдаче отчета преподаватель может сделать устные или пись- менные замечания, попросить уточнить расчеты или выполнить их с другими параметрами. Эти задания выполняются студентом на от- дельных листах и оформляются приложением к отчету.
Требования к тексту отчета
Отчет по лабораторной работе должен содержать следующие разделы: а) постановка задачи – включает в себя цель выполнения работы и теоретическую часть;
81 б) разработка решения – включает детальное описание разработан- ного алгоритма (способа его параллельной реализации), объяснение принятых архитектурных и технических решений; в) результаты экспериментов – включают описание использованно- го оборудования, методы измерения, графики производительности и ускорения, другие полученные результаты; г) выводы – кратко излагают основные приобретенные знания о предмете исследования; д) в случае необходимости в конце отчета может быть приведен список литературы.
Отчет должен быть написан четко, ясно, аккуратно. Сокращения слов, кроме общепринятых, не допускаются.
Требования к программе
Программа разрабатывается под операционную систему Linux на языке программирования C или C++.
Программа должна успешно компилироваться компилятором
GCC.
Оформление программного кода должно быть выполнено в соот- ветствии с одним из распространенных стилей: K&R Style, Allman style, Google C++ Style Guide или аналогичным.
Исходный код должен быть разработан самостоятельно. Ре- шения, скачанные из Интернета, к защите не допускаются. В случае частичного заимствования необходимо привести ссылки на источ- ники.
Исходный код должен быть хорошо документирован. В коммен- тариях должно детально поясняться назначение основных блоков кода, а также всех неочевидных конструкций.
Требования к оформлению
Первая страница – титульный лист – оформляется согласно при- ложению А. Подробные требования к оформлению текста отчета, таблиц, рисунков, формул и программного кода приведены в при- ложении Б.
82
Д
ОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА
1. The Linux man-pages project [Electronic resource] // The Linux Kernel Ar- chives. – URL: https://www.kernel.org/doc/man-pages/ (accessed: 27.07.2017).
2. GCC online documentation [Electronic resource] // GNU Compiler Collec- tion. – URL: https://gcc.gnu.org/onlinedocs/ (accessed: 04.08.2017).
3. Столяров А.В. Оформление программного кода: методическое посо- бие // Андрей Викторович Столяров: сайт автора. – URL: http://www.sto- lyarov.info/books/pdf/codestyle.pdf (дата обращения: 08.11.2017)
83
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Богачёв К.Ю. Основы параллельного программирования: учебное по- собие / К.Ю. Богачёв. – 2-е изд. – Москва: БИНОМ. Лаборатория знаний,
2013. – 342 с.
2. Митчелл М. Программирование для Linux. Профессиональный подход /
М. Митчелл, Д. Оулдем, А. Самьюэл. – Москва: Вильямс, 2002. – 287 с.
3. Стивенс У.Р. UNIX: взаимодействие процессов / У. Р. Стивенс. –
Санкт-Петербург: Питер, 2002. – 576 с.
4. Малышкин В.Э. Параллельное программирование мультикомпьютеров /
В.Э. Малышкин, В.Д. Корнеев. – Новосибирск: Изд-во НГТУ, 2006. – 296 с.
5. Костромин В.А. Самоучитель Linux для пользователя / В.А. Костро- мин. – Санкт-Петербург: БХВ-Петербург, 2003. – 672 с.
6. Эффективное программирование современных микропроцессоров: учебное пособие / В.П. Маркова, С.Е. Киреев, М.Б. Остапкевич, В.А. Перепел- кин. – Новосибирск: Изд-во НГТУ, 2014. – 148 с.
7. IEEE Std 1003.1™-2008, 2016 Edition [Electronic resource] // The Open
Group. – URL: http://pubs.opengroup.org/onlinepubs/9699919799/ (accessed:
27.07.2017).
8. Butenhof D.R. Programming with POSIX Threads. – Addison-Wesley,
1997. – 398 P. ISBN 0-201-63392-2.
84
ПРИЛОЖЕНИЕ А
ШАБЛОН ТИТУЛЬНОГО ЛИСТА ОТЧЕТА
О ЛАБОРАТОРНОЙ РАБОТЕ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
Кафедра параллельных вычислительных технологий
ОТЧЕТ ПРИНЯТ
Оценка ________________
_________ / ___________ /
(подпись) (расшифровка)
«___» __________ _____ г.
ОТЧЕТ
по лабораторной работе № <номер работы>
<название лабораторной работы> по дисциплине <название дисциплины>
Студент гр. <номер группы>
<Ф.И.О. студента>
Новосибирск – <год>
85
ПРИЛОЖЕНИЕ Б
ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТА
Общие требования
Отчет набирается машинописным способом на странице формата
А4 с соблюдением полей: вверху и внизу – 2 см, слева – 2,5 см, спра- ва – 1 см.
Для основного текста отчета используется гарнитура Times (или свободный аналог), кегль – 12 пт, интервал – 1, цвет текста и формул – черный, отступ первой строки каждого абзаца – 1 см. Содержимое аб- заца выравнивается по ширине.
Страницы отчета нумеруются арабскими цифрами, исключая ти- тульный лист. Номера страниц указываются в правом нижнем углу.
Оформление заголовков разделов
Разделы отчета нумеруются арабскими цифрами.
Для заголовком разделов используется гарнитура Times (или свободный аналог), кегль – 14 пт, начертание – полужирное, выравни- вание – по левому краю страницы.
Оформление рисунков
Рисунки по возможности должны быть подготовлены в вектор- ном формате.
Все рисунки должны быть озаглавлены и пронумерованы. Заго- ловок помещается под рисунком и выравнивается по центру страницы.
На все рисунки в тексте должны быть даны ссылки.
Оформление таблиц
Таблицы должны быть набраны тем же кеглем, что и основной текст.
Все таблицы должны быть озаглавлены и пронумерованы. Заго- ловок таблицы должен быть помещен над таблицей и выровнен по правому краю страницы.
На все таблицы в тексте должны быть даны ссылки.