Лабораторная работа

Создать программу из которой вызываются два независимых приложения: 1- ое многопоточное приложение, в котором создаются 4 потока, каждый из которых работает параллельно главному потоку и выполняют следующие действия: первый поток: перемещает строку по диагонали от одного края терминала до другого; второй поток: переписывает символы строки в обратном порядке; третий поток: меняет случайный регистр содержимого сроки; четвёртый поток: меняет цвет строки. 2-ое создать многопоточное приложение, которое создаёт массив целых значений и сор-тирует методом Шелла, Пузырька, Шейкера, Выбором и Гномьей сортировкой. Для каждого вида сортировки создать отдельный поток выполнения. Приложение определяет эффективность использования сортировок путём определения времени выполнения потока. C и C++

Категория:

Лабораторная работа

Дисциплина:

Системное программирование

Город:

Беларусь, Минск

Учебное заведение:

БНТУ, ФИТР

Тег:

#ОперационныеCистемы

Стоимость работы:

8 руб.

Оценка: 10
Объем страниц: 27
Год сдачи: 2020
Дата публикации: 07.10.2020

* Кроме файла с работой, также есть архив с дополнительными файлами.

Описание дополнительных файлов:

Программа А состоит из следующих файлов:
• Main.cc – файл, в котором описана главная функция main, которая принимает строку и передаёт её потокам;
• thread_printer1.h – файл заголовка, в котором описан прототип функции, кото-рая переписывает символы строки в обратном порядке;
• thread_printer1.cc – файл реализации функции, которая переписывает символы строки в обратном порядке;
• thread_printer2.h – файл заголовка, в котором описан прототип функции, которая меняет случайный регистр содержимого сроки;
• thread_printer2.cc – файл реализации функции, которая , которая меняет случай-ный регистр содержимого сроки;
• thread_printer3.h – файл заголовка, в котором описан прототип функции, которая перемещает курсор по диагонали;
• thread_printer3.cc – файл реализации функции, которая перемещает курсор по диагонали;
• thread_printer4.h – файл заголовка, в котором описан прототип функции, которая меняет цвет строки;
• thread_printer4.cc – файл реализации функции, которая меняет цвет строки;


Программа B состоит из следующих файлов:

• Main.cc – файл, в котором описана главная функция main, которая выделяет динамически память под матрицу, заполняет её с помощью генератора слу-чайных чисел, предлагает отсортировать матрицу различными методами, вывести и определяет эффективность использования сортировок путём опре-деления времени выполнения потока;
• Output.h – файл заголовка, в котором описан прототип функции, которая выводит массив;
• Output.cc – файл реализации функции, которая выводит массив;
• InitRandArray.h – файл заголовка, в котором описан прототип функции, кото-рая инициализирует матрицу случайными числами;
• InitRandArray.cc – файл реализации функции, которая инициализирует матрицу случайными числами;
• Gnome_sort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу Гномьей сортировкой;
• Gnome_sort.cc – файл реализации функции, которая сортирует матрицу Гномьей сортировкой;
• BubbleSort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу методом Пузырька;
• BubbleSort.cc – файл реализации функции, которая сортирует матрицу методом Пузырька;
• Shell_Sort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу методом Шелла;
• Shell_Sort.cc – файл реализации функции, которая сортирует матрицу методом Шелла;
• SelectionSort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу методом Выбора;
• SelectionSort.cc – файл реализации функции, которая сортирует матрицу методом Выбора;
• ShakerSort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу Шейкерной сортировкой;
• ShakerSort.cc – файл реализации функции, которая сортирует матрицу Шейкерной сортировкой;
• Swap.h – файл заголовка, в котором описан прототип функции, которая меняет местами элементы матрицы;
• Swap.cc – файл реализации функции которая меняет местами элементы матрицы;

Фрагменты для ознакомления

ЛАБОРАТОРНАЯ РАБОТА № 8

Основы многозадачности в Linux. Потоки в Linux

Цель работы:

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

 

Требования:

1) Разработать многопоточное приложение под ОС Linux, которое создаёт несколько потоков для выполнения соответствующих действий и предоставляет управление ими (задание придумать самостоятельно). 

2)  Приложение должно содержать минимум три потока. Предусмотреть вывод информации о потоках. 

3)  Для компиляции, компоновки и выполнения программы использовать утилиту make. 

 

Задание A

Создать программу из которой вызываются два независимых приложения:

1. Многопоточное приложение, в котором создаются 4 потока, каждый из которых работает параллельно главному потоку и выполняют следующие действия: первый поток: перемещает строку по диагонали от одного края терминала до другого; второй поток: переписывает символы строки в обратном порядке; третий поток: меняет случайный регистр содержимого сроки; четвёртый поток: меняет цвет строки. 

2. Создать многопоточное приложение, которое создаёт массив целых значений и сортирует методом Шелла, Пузырька, Шейкера, Выбором и Гномьей сортировкой. Для каждого вида сортировки создать отдельный поток выполнения. Приложение определяет эффективность использования сортировок путём определения времени выполнения потока. 

 

Ход выполнения лабораторной работы:

Проанализировал примеры заданий и объединил их в одно задание.

Выбрал метод решения индивидуального задания и разработал алгоритм.

Изучил теоритический материал по созданию, управлению, ожиданию и завершению работы потока.

Ознакомился с функциями, которые возвращают pid потока.

Изучил команды управления курсором и цветом символов в консоли.

В текстовом редакторе gedit набрал исходный код решения задания Aна языке программирования С++ и сохранил исходник с именем. Программа А состоит из следующих файлов (см. рис. 1):

  • Main.cc – файл, в котором описана главная функция main, которая принимает строку и передаёт её потокам;
  • thread_printer1.h  файл заголовка, в котором описан прототип функции, которая переписывает символы строки в обратном порядке;
  • thread_printer1.cc – файл реализации функции, которая переписывает символы строки в обратном порядке;
  • thread_printer2.h файл заголовка, в котором описан прототип функции, которая меняет случайный регистр содержимого сроки;
  • thread_printer2.cc – файл реализации функции,  которая , которая меняет случайный регистр содержимого сроки;
  • thread_printer3.h файл заголовка, в котором описан прототип функции, которая перемещает курсор по диагонали;
  • thread_printer3.cc – файл реализации функции, которая перемещает курсор по диагонали;
  • thread_printer4.h файл заголовка, в котором описан прототип функции, которая меняет цвет строки;
  • thread_printer4.cc – файл реализации функции, которая меняет цвет строки;

Создал Makefile (см. Makefile  Приложение А).

Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения Мейкфайла.

Для компиляции программы использовал автосборку проекта с помощью Makefile(см. рис. 2).

Для тестирования работоспособности запустил программу и ввёл определённые данные (см. рис. 7.1).

Повторил реализацию методов сортировок.

Изучил функцию для определения времени сортировки.

В текстовом редакторе gedit набрал исходный код решения задания Bна языке программирования С и сохранил исходник с именем. Программа B состоит из следующих файлов (см. рис. 3):

  • Main.cc – файл, в котором описана главная функция main, которая выделяет динамически память под матрицу, заполняет её с помощью генератора случайных чисел, предлагает отсортировать матрицу различными методами, вывести и определяет эффективность использования сортировок путём определения времени выполнения потока;
  • Output.h – файл заголовка, в котором описан прототип функции, которая выводит массив;
  • Output.cc – файл реализации функции, которая выводит массив;
  • InitRandArray.h – файл заголовка, в котором описан прототип функции, кото-рая инициализирует матрицу случайными числами;
  • InitRandArray.cc – файл реализации функции, которая инициализирует матрицу случайными числами;
  • Gnome_sort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу Гномьей сортировкой;
  • Gnome_sort.cc – файл реализации функции, которая сортирует матрицу Гномьей сортировкой;
  • BubbleSort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу методом Пузырька;
  • BubbleSort.cc – файл реализации функции, которая сортирует матрицу методом Пузырька;
  • Shell_Sort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу методом Шелла;
  • Shell_Sort.cc – файл реализации функции, которая сортирует матрицу методом Шелла;
  • SelectionSort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу методом Выбора;
  • SelectionSort.cc – файл реализации функции, которая сортирует матрицу методом Выбора;
  • ShakerSort.h – файл заголовка, в котором описан прототип функции, которая сортирует матрицу Шейкерной сортировкой;
  • ShakerSort.cc – файл реализации функции, которая сортирует матрицу Шейкерной сортировкой;
  • Swap.h – файл заголовка, в котором описан прототип функции, которая меняет местами элементы матрицы;
  • Swap.cc – файл реализации функции которая меняет местами элементы матрицы;

Создал Makefile (см. Makefile  Приложение А).

Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения Мейкфайла.

Для компиляции программы использовал автосборку проекта с помощью Makefile(см. рис. 4).

Для тестирования работоспособности запустил программу и ввёл определённые данные (см. рис. 7.1).

В текстовом редакторе gedit набрал исходный код решения задания Cна языке программирования С и сохранил исходник с именем. Программа С состоит из следующих файлов(см. рис. 5):

  • fork.cс – файл, в котором описана главная функция main, из которой вызываются два независимых приложения;

 

Результаты выполнения лабораторной работы:                                                                         

Рисунок 1 – Содержимое папки 1 программы лабораторной работы № 8

 

Рисунок 2— Организация автосборки проекта А с помощью Makefile

 

Рисунок 3 – Содержимое папки 2 программы лабораторной работы № 8

 

Рисунок 4— Организация автосборки проекта B с помощью Makefile

 

Рисунок 5 – Содержимое папки OC8 программы лабораторной работы № 8

 

Рисунок 6— Организация сборки проекта C 

 

Рисунок 7.1— Запуск программы и выбор приложения 1

 

Рисунок 7.2— Ввод размера строки и самой строки

 

Рисунок 7.3— Перемещение строки по диагонали

 

 

Рисунок 7.4— Перемещение строки по диагонали

 

Рисунок 7.5— Перемещение строки по диагонали

 

Рисунок 7.6— Запуск программы и выбор приложения 2

 

Рисунок 7.7— Инициализация матрицы случайными числами

 

Рисунок 7.8 – Сортировка матрицы методом Шелла

 

Рисунок 7.9 – Сортировка матрицы методом Выбора

 

Рисунок 7.10 – Сортировка матрицы методом Пузырька
Рисунок 7.11 – Сортировка матрицы методом Шейкера
Рисунок 7.12 – Гномья сортировка матрицы 

 

Что я освоил в процессе выполнения лабораторной работы:

  1. Понятие многопоточного приложения;
  2. Закрепил основные принципы сортировкок;
  3. Команды управления курсором в консоли;
  4. Команды управления цвета в консоли;
  5. Команда, которая возвращает количество временных тактов;
  6. Команды создания, управления и завершения потоков;
  7. Команды предоставляющее информации о потоках;
  8. Компиляцию многопоточных приложений;

 

Выводы:

Под потоком подразумевается часть выполняемого кода в UNIX- или Linux-процессе, которая может быть регламентирована определенным образом. Затраты вычислительных ресурсов, связанные с созданием потока, его поддержкой и управлением, у операционной системы значительно ниже по сравнению с аналогичными затратами для процессов, поскольку объем информации отдельного потока гораздо меньше, чем у процесса. Каждый процесс имеет основной, или первичный, поток. Под основным потоком процесса понимается программный поток управления или поток выполнения. Процесс может иметь несколько потоков выполнения и, соответственно, столько же потоков управления. Каждый поток, имея собственную последовательность инструкций, выполняется независимо от других, а все они — параллельно друг другу. Процесс с несколькими потоками, называется многопоточным.

Использование функций библиотечных pthread:

  • pthread_create – создание потока;
  • pthread_exit – завершение потока;
  • pthread_join – ожидание выполнения потока;
  • pthread_cancel – отмена потока; 
  • pthread_t – структурный тип для хранения идентификатора потока;
  • pthread_sel – узнать идентификатор потока;
  • pthread_equal – определение идентичности идентификоторов потока

Функция clock() возвращает время, пройденное с момента запуска программы, вызвавшей функцию clock(). Если часы недоступны, то возвращается —1. Для преобразования возвращаемой ве­личины в секунды надо разделить ее на макрос CLOCKS_PER_SEC.

Управление положением курсора:
\033[#A – передвинуть курсор вверх на # строк;
\033[#B – передвинуть курсор вниз на # строк;
\033[#С – передвинуть курсор вправо на # столбцов;
\033[#D – передвинуть курсор влево на # столбцов;
\033[#E – передвинуть курсор вниз на # строк и поставить в  начало строки;
\033[#F – передвинуть курсор вверх на # строк и поставить в начало строки;
\033[#G – переместить курсор в указанный столбец текущей строки;
\033[#;#H – задает абсолютные координаты курсора (строка, столбец).

Управление цветом:
\033[30 – чёрный цвет знаков;
\033[31 – красный цвет знаков;
\033[32 – зелёный цвет знаков;
\033[33 – коричневый цвет знаков;
\033[34 – синий цвет знаков;
\033[35 – фиолетовый цвет знаков;

Для компиляции многопоточного приложения в средах UNIX или Linux с помощью компиляторов командной строки g++ или gcc необходимо скомпоновать его с библиотекой Pthreads. Для задания библиотеки используйте опцию -l. Так, команда – lpthread обеспечит компоновку вашего приложения с библиотекой, которая согласуется с многопоточным интерфейсом, определенным стандартом POSIX

.

139