You are on page 1of 7

Екзамен

ст. групи ІТ-02


Котляра Олександра
Білет №2

Завдання №1

Класифікація паралельних обчислювальних систем.


Класифікацію паралельних обчислювальних систем я взяв за Таксономією
Фліна. За нею ми можемо поділити їх на такі типи:

● SISD (Single Instruction, Single Data): Система, що виконує одну


інструкцію на одних даних за один цикл. Це найпростіша
архітектура, що не включає паралелізм.
Приклад: мінікомп’ютери, робочі станції, одноядерний ПК.

● SIMD (Single Instruction, Multiple Data): Одна інструкція виконується


одночасно на багатьох даних. Це типовий підхід для векторних
процесорів.
Приклад: обчислення з використанням графічного процесора
(GPUs); обробка мультимедійної інформації

● MISD (Multiple Instruction, Single Data): Багато інструкцій


виконуються на одних даних. Цей тип рідко використовується в
практиці.
Приклад: криптографічні алгоритми, що розшифровують одне
повідомлення

● MIMD (Multiple Instruction, Multiple Data): Багато інструкцій


виконуються на багатьох даних. Це найбільш загальний тип
архітектури для паралельних систем.
Приклад: кластери, багатоядерні ПК

Завдання №2
Розробка високоефективних паралельних програм з
використанням ForkJoinFramework.

Фреймворк, що розміщує задачі в пул потоків ForkJoinPool extends


AbstractExecutorService

Забезпечує більшу швидкість за рахунок використання work-stealing алгоритму:


потоки, які вільні, можуть здійснювати «крадіжку» роботи у потоків, які є зайнятими.
(В звичайному пулі, задача кидається в чергу будь-якого з потоків, тобто у кожного
потоку своя черга задач. Через це може статись ситуація, коли в одного потоку стоїть
дуже велика черга, в той час як в іншого вона пуста. У ForkJoinPool передбачений
механізм перекидання задач з однієї черги в іншу.)

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

Основні класи фреймворку:

● ForkJoinPool (implements ExecutorService),


● ForkJoinTask (implements Future)
● RecursiveTask (implements Future)
● RecursiveAction (implements Future)

Етапи розробки паралельного алгоритму

● Задача поділяється на підзадачі, які можуть виконуватись незалежно. Підзадачі


можуть розроблятись як такі, що створюють нові підзадачі.
● Для підзадач розробляються ForkJoinTask класи
● Підзадачі додаються в пул потоків і пул запускається на виконання
● З розв’язків підзадач складається розв’язок задачі

Технологія крадіжки роботи

ForkJoinPool є пулом потоків, який використовується для паралельного виконання


задач. У цьому пулі потоків кожен воркер може виконувати кілька задач одночасно. За
замовчуванням кількість воркерів відповідає кількості доступних процесорів у вашій
системі.

Кожен воркер має двосторонню чергу задач, в яку можна додавати нові задачі і з якої
можна вибирати задачі для виконання. Коли надходить нова задача, вона ставиться у
верхівку черги (LIFO - останній прийшов, перший вийшов).

Однак основна особливість ForkJoinPool полягає в технології "крадіжки роботи". Якщо


воркер має порожню чергу задач інших воркерів, він може "украсти" одну з цих задач і
виконати її. Це здійснюється в порядку черги задач (FIFO - перший прийшов, перший
вийшов).
Таким чином, завдяки цій технології кожен воркер може виконувати багато задач
одночасно, і якщо воркер не має власних задач, він може "украсти" задачу з черги
іншого воркера для продовження роботи. Це дозволяє пулу потоків ефективно
розподіляти завдання між воркерами та забезпечувати швидке виконання задач.

Застосування класів ForkJoinFramework

Клас ForkJoinTask є базовим класом для задач, які можна виконувати в ForkJoinPool.
Ваші задачі повинні успадковувати цей клас.

Коли ви створюєте задачу, ви маєте виконати перевірку, чи ваша частка роботи є досить
малою для того, щоб виконати її безпосередньо. Якщо так, то ви виконуєте цю частку
роботи безпосередньо у поточному виконавці.

У випадку, якщо ваша робота є достатньо великою, ви розділяєте її на дві частини.


Потім ви викликаєте ці дві частини як окремі задачі і чекаєте на їхні результати.

ForkJoinPool є пулом потоків, який дозволяє виконувати ForkJoinTask-задачі. Коли ви


маєте всі свої задачі готові, ви викликаєте метод invoke() на ForkJoinPool і передаєте
йому ваші задачі. Це запускає виконання всіх задач у пулі потоків ForkJoinPool.

Завдання №3

Клас А, який робить ЕмптіЕкшн


Клас В, який робить ФуллЕкшн
Клас СамСтейт, в який я запихнув boolean і передав обом потокам
Ну і метод Мейн

Результати роботи
Завдання №4

You might also like