You are on page 1of 14

Національний педагогічний університет імені М.П.

Драгоманова Факультет математики,


інформатики та фізики Кафедра комп’ютерної
та програмної інженерії

КУРСОВИЙ ПРОЕКТ
з дисципліни «Комп'ютерні системи »

на тему: «Парадигми паралельного програмування »

Студента(ки) курсу, групи


ПІБ Нестеренко Іван
Спеціальність
(шифр, назва спеціальності)
Керівник
(вчене звання, науковий ступінь, прізвище та
ініціали)

Національна оцінка
Кількість балів: оцінка: ЕСТS

Члени комісії:
(вчене звання, науковий ступінь, прізвище та ініціали)

(вчене звання, науковий ступінь, прізвище та ініціали)

Засвідчую, що у цьому курсовому проекті немає запозичень


праць інших авторів без відповідних посилань

Студент ПІБ

Зміст
Вступ…………………………………………………………………………..3
Огляд тематичних напрямків………………………………………………..5
Парадигми паралельного програмування "Клієнт і сервер"………………6
Парадигма паралельного програмування "Виробники та споживачі"……8
Парадигма паралельного програмування "Взаємодіючі однорангові
системи"……………………………………………………………………………..9
Мови програмування та бібліотеки для паралельного програмування…11
Висновки……………………………………………………………………13
Список використаних джерел………………………………………………14

ВСТУП

Парадигма паралельного програмування - важливий науковий напрям в


інформатиці, який розробляє і вивчає різні підходи до розподілу роботи між
процесами, організації та синхронізації обміну даними в паралельних системах.
Паралельне програмування в даний час займає важливе місце в розвитку
комп'ютерних наук, оскільки дозволяє підвищити продуктивність обчислень і
скоротити час виконання програм.
У цій курсовій роботі ви дізнаєтесь про різні парадигми паралельного
програмування, включаючи ітеративний паралелізм, рекурсивний паралелізм,
клієнт-сервер, виробник-споживач та взаємодіючі однорангові системи. Ви
дізнаєтесь про їх основні особливості, переваги та недоліки, а також приклади
їх реалізації на різних мовах програмування.
Курс також аналізує різні методи і техніки, що використовуються в
паралельних системах, такі як розподіл міжпроцесної роботи, обмін даними і
синхронізація. Розглядаються приклади реальних систем і додатків, що
використовують ці технології, та обговорюється їх практичне застосування.
Курс має на меті дати студентам розуміння основних концепцій, переваг
та недоліків паралельного програмування, а також розвинути навички аналізу
та розробки паралельних програм. Наприкінці курсу надаються рекомендації
щодо вибору методів паралельного програмування відповідно до конкретних
завдань та системних вимог.
Вступ до парадигм паралельного програмування
Парадигми паралельного програмування характеризуються різними
підходами до розподілу роботи між процесами, організації обміну даними та
синхронізації. До таких парадигм відносяться однорангові системи, клієнт-
сервер, виробник-споживач, ітеративний паралелізм та рекурсивний
паралелізм. Кожен з цих підходів має свої переваги та недоліки, і вибір
залежить від конкретної задачі та системних вимог.
Взаємодіючі однорангові процеси організовуються у вигляді конвеєрів,
які забезпечують обмін даними між процесами. Парадигма клієнт-сервер
розділяє роботу на клієнтів, які звертаються до сервера з проханням виконати
певні завдання. Виробники і споживачі є взаємодіючими процесами, часто
організованими у вигляді конвеєрів, через які проходять потоки інформації.
При ітеративній паралельній обробці робота розбивається на кілька ітерацій,
кожна з яких виконується паралельно. При рекурсивній паралельній обробці
робота розбивається на кілька підзадач, кожна з яких виконується паралельно.
У цьому курсі ми дізнаємося більше про ці парадигми паралельного
програмування і побачимо приклади їх реалізації на різних мовах
програмування. Також описані методи і прийоми, що використовуються для
розділення роботи, обміну даними і синхронізації процесів в паралельних
системах.

1 Огляд предметної області


Щоб зрозуміти різні типи парадигм паралельного програмування,
необхідно почати з введення поняття парадигми програмування.
Парадигма програмування - це спосіб концептуалізації того, як
виконуються обчислення, і визначає, як структурувати та організувати роботу,
що виконується комп'ютером. [1, c. 15].
У цій статті розглядається парадигма паралельного програмування, тобто
організація роботи, яку комп'ютери виконують паралельно.
Парадигми паралельного програмування можна розділити на такі основні
типи:
ітераційна паралельна
рекурсивний паралельний
"Клієнт і сервер
"Виробник і споживач
Взаємодіючі однорангові
Ітеративний паралельний - процес, що багаторазово виконує обчислення
для вирішення однієї задачі (одна ітерація циклу) [2, с. 3]. Зазвичай
зустрічається в обчисленнях, що виконуються на декількох процесорах.
Рекурсивний паралелізм можна використовувати, коли в програмі є одна
або декілька рекурсивних процедур (функцій) і їх виклики є незалежними,
тобто кожна з них маніпулює частиною спільних даних. Рекурсивний
паралелізм використовується для розв'язання комбінаторних задач, таких як
сортування, планування (задачі комівояжера) та ігри (наприклад, шахи) [3, с. 9].
Інші типи описані в цій статті.

2 Клієнт-серверна парадигма паралельного


програмування
Клієнт-сервер є найпоширенішою моделлю взаємодії в розподілених
системах, від локальних мереж до всесвітньої павутини [3, с. 9]. Ця модель
складається з двох частин: клієнтів та серверів.
У більшості випадків вони розташовані на різних машинах і зазвичай
один сервер обслуговує багато клієнтів [4, с. 32]. Клієнт надсилає запит на
сервер і чекає на відповідь. Сервер чекає на запит від клієнта, виконує його і
повертає відповідь клієнту. Клієнт сам може "виступати" в ролі сервера,
отримуючи запити. Аналогічно, сервер виступає в ролі клієнта, коли йому
потрібно зробити запит до іншого додатку [4].
Наприклад, розглянемо запит до всесвітньої павутини, який виникає, коли
користувач відкриває нову URL-адресу у вікні браузера. Веб-браузер - це
клієнтський процес, запущений на комп'ютері користувача; URL-адреса
опосередковано посилається на інший комп'ютер, на якому розміщена веб-
сторінка URL-адреса опосередковано посилається на інший комп'ютер, на
якому розміщена веб-сторінка. Доступ до самої веб-сторінки може отримати
серверний процес, запущений на іншому комп'ютері. Цей серверний процес
читає веб-сторінку, зазначену в URL, і повертає її клієнтській машині [3, с. 17].
Програмні відносини між клієнтом і сервером подібні до паралельних
відносин у послідовному програмуванні між програмою, яка викликає
підпрограму, і самою підпрограмою. Крім того, так само, як підпрограму можна
викликати з кількох місць у програмі, сервер зазвичай має багато клієнтів. Хоча
кожен клієнтський запит повинен оброблятися незалежно, декілька запитів
можуть оброблятися паралельно.
Як і у випадку з декількома процедурними викликами, декілька запитів
можуть оброблятися паралельно [3, с. 18].
Сервер може бути реалізований як єдиний процес, який не може
обробляти декілька клієнтських запитів одночасно, або (якщо необхідна
паралельна обробка запитів) як багатопотокова програма.

Клієнти зазвичай представлені декількома потоками.


Одна з класичних "проблем сплячого перукаря" описує взаємовідносини в
системі клієнт-сервер. У перукарні є одне робоче місце і стійка адміністратора з
кількома стільцями. Коли перукар закінчує стригти клієнта, він відпускає його
додому, а потім йде до стійки реєстрації, щоб перевірити, чи не чекають на
нього інші клієнти. Якщо є, він запрошує одного з них до перукарні і стриже
його. Якщо клієнтів немає, він повертається до свого крісла і лягає спати.
Клієнти, які приходять до перукарні, бачать, що робить барбер. Якщо
барбер спить, клієнт будить барбера і сідає в його крісло. Якщо барбер на
роботі, клієнт йде на рецепцію. Якщо на рецепції є вільне крісло, клієнт сідає і
чекає своєї черги. Якщо стільця немає, клієнт йде [5].
Отже, клієнта можна інтерпретувати як покупця, який відвідує салон, а
перукаря - як сервер. Клієнт надсилає запит про наявність вільного крісла на
сервер, який отримує та обробляє цей запит. Іншими словами, сервер повертає
відповідь, в якій вказує, чи зайнятий ресурс (крісло), чи готовий обробити
наступний запит клієнта.
Клієнти утворюють чергу, але вона обмежена. Якщо в черзі немає вільних
стільців, відвідувач залишає чергу. Це означає, що новий потік (потік клієнта)
має бути створений і відправлений на виконання, що не є перевагою [6, с. 90].

3 Парадигма паралельного програмування


"Виробник і споживач"
Виробники та споживачі є взаємодіючими процесами. Ці процеси часто
організовуються у конвеєр, через який протікає інформація.
Перш ніж перейти до організації конвеєра, визначимо, що процес-
виробник генерує інформацію у деякому буфері, яка потім використовується
процесом-споживачем.
Тут ми стикаємося з проблемою переповнення та виснаження буфера.
Якщо буфер переповнюється, виробник повинен чекати, поки в буфері не
звільниться хоча б один елемент.
Як згадувалося вище, виробники і споживачі часто об'єднані в конвеєр.
Конвеєр - це послідовність процесів, де кожен процес споживає дані з
попереднього процесу і надає дані наступному процесу.
Типовим прикладом є конвеєр в ОС Unix. Розглянемо взаємодію команд:
Тобто, вихід однієї команди перепризначається на вхід іншої команди.
Так, у наведеному вище прикладі результат виконання ps -Af передається
команді grep, яка перетворює вхідний потік відповідно до маски (в даному
випадку на виході всі рядки, включаючи підрядок 'mc') [8, с. 22].
Потоки можуть бути пов'язані зі спеціальним типом файлів, який
називається каналом. Канали - це буфери (черги типу FIFO) між процесами-
виробниками та процесами-споживачами. Процес-виробник записує дані в
кінець черги, а процес-споживач зчитує дані з початку черги. Загалом, оскільки
канали є одним і тим же обмеженим буфером, виробник чекає, поки в буфері не
з'явиться вільне місце для наступної порції даних, якщо це необхідно, а
споживач чекає, поки дані не з'являться в буфері, якщо це необхідно [8, с. 23].
Недоліки моделі взаємодії цього процесу: оскільки буфер обмежений,
розмір буфера доводиться постійно перевіряти, інакше існує ризик
переповнення або виснаження буфера.

4 Парадигма паралельного програмування з


одноранговими процесами
Однорангова модель - це модель, яка виключає потоки керування, що не
беруть безпосередньої участі в обчисленнях.
Розподіл роботи в таких додатках або фіксується заздалегідь, або
визначається динамічно під час виконання [8, с. 16]. Одним з поширених
методів динамічного розподілу роботи є "портфель завдань". Портфелі завдань
зазвичай реалізуються за допомогою спільних змінних і можуть бути доступні
лише одному процесу одночасно [3, с. 26].
Обчислювальні задачі поділяються на скінченну кількість підзадач. Як
правило, кожна підзадача повинна виконувати однотипні дії над різними
даними. Підзадачі нумеруються, і кожному номеру присвоюється функція, яка
однозначно відображає номер задачі на відповідному наборі даних. Потім
створюються змінні, які будуть виконуватися. Кожен потік спочатку
звертається до портфеля завдань, щоб знайти поточний номер завдання,
збільшує його, отримує відповідні дані і виконує завдання, потім звертається до
портфеля завдань, щоб знайти наступний номер завдання [8, с. 28].
Природно, потрібен механізм зупинки процесу, коли весь набір завдань
вичерпано, як у випадку з "виробниками і споживачами".
Тобто, потік отримує завдання з портфеля, завдання залишається
невиконаним, потік вирішує завдання і знову отримує завдання з портфеля.
Розглянемо задачу, яка обчислює добуток матриць. Підзадача - це
обчислення рядків результуючої матриці, а портфель завдань - це змінна, яка
зчитує рядки. При отриманні завдання значення лічильника зчитується і
збільшується на 1. Коли лічильник дорівнює розмірності матриці, обчислення
завершується. Іншими словами, потік отримує завдання, не перериваючи інші
процеси на час виконання приросту лічильника.
Таким чином, кожен процес працює зі своєю незалежною швидкістю, а
синхронізація відбувається за допомогою портфелів завдань.

Проблема з реалізацією цього алгоритму полягає в тому, що доступ до


портфеля завдань повинен бути безпечним. Якщо робота потоків, що їх
виконують, переривається між виконанням нових завдань і збільшенням
лічильника, то над деякими завданнями може працювати більше одного потоку.
[8, c. 29].

5. Мови та бібліотеки для паралельного


програмування
Існує ряд мов і бібліотек для паралельного програмування. Деякі з
найпопулярніших мов паралельного програмування включають C++, Java,
Python і Go.
Бібліотеки, які полегшують розробку паралельних додатків, включають
OpenMP, MPI, CUDA і OpenCL. Кожен з цих інструментів має свої особливості,
переваги та недоліки і повинен обиратися відповідно до конкретних потреб
проекту. Наприклад, OpenMP полегшує паралельне програмування на
багатопроцесорних системах, тоді як CUDA і OpenCL оптимізовані для
використання на графічних процесорах.
Порівняйте їхні можливості та варіанти використання в таблиці нижче:

Мова/
Бібліотека Особливості Приклади використання

Розроблення системного програмного


забезпечення, створення додатків для
Висока продуктивність, наукових обчислень, оброблення даних
C/C++ низькорівневе програмування у реальному часі

Високий рівень абстракції, Розробка додатків для інтернету речей,


Java спрощений синтаксис хмарних обчислень, веб-додатків

Простота і зручність Обробка даних, машинне навчання,


Python використання, багата бібліотека наукові обчислення, веб-додатки

Розпаралелювання циклів,
підтримка багатопроцесорних Обробка великих обсягів даних, наукові
OpenMP систем обчислення

Розподілене програмування,
підтримка багатопроцесорних Обчислення на кластерах, паралельне
MPI систем опрацювання даних

Використання графічного
процесора для прискорення Машинне навчання, графічні додатки,
CUDA роботи з обчисленнями наукові обчислення

Використання різних пристроїв


для прискорення роботи з Обчислення на кластерах, обробка
OpenCL обчисленнями великих обсягів даних

Приклади використання кожної мови та бібліотеки можуть


варіюватисязалежно від конкретного завдання, однак загалом усі вони надають
інструменти для паралельного програмування та прискорення обчислень на
багатопроцесорних системах.
Висновок.
В даному дослідженні були розглянуті такі парадигми паралельного
програмування, як "клієнт-сервер", "виробник-споживач" та "взаємодія-
одноранговий".
Кожна з цих моделей взаємодії процесів має свої недоліки та переваги, а
також схожість між собою. Розглядаючи модель "клієнт-сервер", можна
побачити, що кожному клієнту виділяється потік, що дозволяє швидко
виконувати завдання.
У моделі "виробник-споживач" виникають проблеми переповнення та
вичерпання буферів, які вимагають переривання процесу. Однак за допомогою
цієї моделі організовуються конвеєри і вирішується невелика кількість завдань.
У моделі "взаємодіючих однолітків" проблема схожа на проблему
"виробників і споживачів". Крім того, доступ до портфеля завдань повинен
бути захищеним, щоб різні потоки не виконували однакові обчислення.
Перевагою цієї моделі, однак, є те, що кожен процес працює незалежно і з
власною швидкістю.

СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ


1. Роганов Е.А. Основы информатики и программирования: Учебное
пособие — М.: МГИУ, 2001. — 315 с.
2. Парадигмы параллельного программирования [Электронный ресурс]
: лекционный материал. – Режим
доступа: http://staff.mmcs.sfedu.ru/~dubrov/files/sl_parallel_05_paradig
m.pdf
3. Востокин С.В. Обзор области параллельных вычислений
[Электронный ресурс]: учебное пособие. – Режим
доступа: http://www.williamspublishing.com/PDF/5-8459-0388-2/part.p
df
4. Хьюз К., Хьюз Т. Параллельное и распределенное
программирование с использованием С++: Пер. с англ. – М.
Издательский дом «Вильямс», 2004. – 672 с. : ил. – Парал. тит. англ.
5. Проблема спящего парикмахера [Электронный ресурс] : Википедия
– свободная энциклопедия – Режим
доступа: https://ru.wikipedia.org/wiki/Проблема_спящего_парикмахер
а.html
6. Гергель В.П. Высокопроизводительные вычисления для
многопроцессорных многоядерных систем [Электронный ресурс] :
курс лекций. – Нижегородский государственный университет им.
Ломоносова. – Режим
доступа: http://www.unn.ru/pages/e-library/methodmaterial/2010/7.pdf
7. Методы взаимодействия процессов [Электронный ресурс] : курс
«Основы современных операционных систем. – НОУ «ИНТУИТ» –
Режим
доступа: http://www.intuit.ru/studies/courses/641/497/lecture/11282?
page=1
8. Карепова Е.Д., Кузьмин Д.А., Легалов А.И., Редькин А.В., Удалова
Ю.В., Федоров Г.А. Средства разработки параллельных программ.
Учебное пособие. Красноярск 2007
9. Лавріщева К. М. Програмна інженерія [ 4 березня 2016 у Wayback
Machine .] — К.: Академперіодика, 2008.- 319 с.
10.Peter Van Roy (12 травня 2009). Programming Paradigms: What Every
Programmer Should Know . info.ucl.ac.be. Процитовано 27 січня 2014.
11.Peter Van-Roy; Seif Haridi (2004). Concepts, Techniques, and Models of
Computer Programming . MIT Press. ISBN 978-0-262-22069-9.

You might also like