- •Лабораторна робота №2.
- •Приклад документованого тексту програми.
- •Виклик утiлiти Javadoc з командного рядка.
- •Завдання:
- •Лабораторна робота №3.
- •Теоретичнi вiдомостi.
- •Завдання
- •Iндивiдуальнi завдання до захисту роботи
- •Лабораторна робота №4.
- •Теоретичнi вiдомостi.
- •Завдання
- •Iндивiдуальнi завдання до захисту роботи
- •Рекурсивна версiя засувки
- •Завдання
- •Iндивiдуальнi завдання до захисту роботи
- •Використання семафорiв для сигналiзацiї
- •Рахуючий семафор
- •Обмежуючий семафор
- •Потоки стандартного вводу / виводу
- •Стандартний поток виводу System.Out
- •Стандартний поток вводу System.In
- •Стандартний поток помилок System.Err
- •Потоки вводу / виводу пакету java.Io
- •Файловий ввод / вивід
- •Рядковий ввод / вивід
- •Завдання:
- •Опанувати методику створення розподiлених програм з використанням часової синхронiзацiї паральних потокiв.
- •Приклад використання класу CountDownLatch
- •Опанувати методику створення розподiлених програм з використанням часової синхронiзацiї паральних потокiв.
- •Приклад вiдстеження моменту закiнчення роботи декiлькох потокiв
- •Завдання:
- •Опанувати методику створення розподiлених програм з використанням обмiнникiв.
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Мережі і сокети
- •Приклад: віддалене читання файлу
- •Сервер читання файлів мовою Java
- •Клієнт читання файлів мовою Java
- •Порядок компіляції та запуску програм
- •Завдання:
- •Контрольні питання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику створення розподiлених програм з використанням конвейеру команд.
- •Опанувати методику побудови моделi обчислень у виглядi графа "операцiї-операнди".
- •Приклад паралельного алгоритму для обчислення площi прямокутника
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику створення розподiлених програм з використанням портфеля задач.
- •Приклад використання портфеля задач за допомогою ExecutorService.
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику створення розподiлених програм з використанням бар'єрної синхронiзацiї.
- •Приклад використання бар'ера
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Опанувати методику синхронiзацiї паральних процесiв з використанням блокуючої черги.
- •Приклад реалiзацiї блокуючої черги
- •Приклад використання блокуючої черги
- •Завдання:
- •Iндивiдуальнi завдання до захисту роботи
- •Вимоги до звiту
- •Iндивiдуальнi завдання для самостiйної роботи
- •Вимоги до звiту
- •Iндивiдуальнi завдання для самостiйної роботи
- •Вимоги до звiту
- •Iндивiдуальнi завдання для самостiйної роботи
- •Додатковi завдання для пiдвищення балiв з курсу “Паралельне програмування”
Опанувати методику створення розподiлених програм з використанням портфеля задач.
Теоретичнi вiдомостi.
Портфель задач - неупорядковане сховище задач, що чекають на виконання. Задачi кладуться у портфель, що розподiлений мiж декiлькома робочими процесами.
Кожен робочий процес виконує такий основний код:
while (true) { отримати задачу з портфеля; if (задач бiльш нема) break; #вихiд з циклу while виконати задачу, можливо, породжуючи новi задачи; } |
Цей пiдхiд можна використовувати для:
реалiзацiї рекурсивного паралелизму;
вирiшення iтеративних проблем з фiксованою кiлькiстью незалежних задач.
Парадигма портфелю має такi кориснi властивостi:
Вона дуже проста у використаннi. Достатньо визначити представлення задачi, реалiзувати портфель, запрограмувати виконання задачи i визначити умови завершення роботи алгоритму.
Програми, що використовують портфель задач є масштабуємими у тому сенсi, що їх можна використовувати з будь-яким числом процесорiв. Для цього достатньо просто змiнити число робочих процесiв.
Спрощується реалiзацiя балансування навантаження. Якщо час виконання рiзних задач рiзний, то деякi з задач будуть виконуватися довше iнших. Але поки задач бiльше нiж робочих процесiв (у 2 - 3 рази), загальнi об'єми обчислень, що виконуються робочими процесорами, будуть приблизно однаковими.
Приклад використання портфеля задач за допомогою ExecutorService.
За допомогою виклику Executors.newFixedThreadPool було створено пул на 5 потокiв.
Тепер, у разi появи великої кiлькостi задач, вони будуть виконуватися вже iснуючими потоками.
Тим самим, буде економитись час на створення нових потокiв за рахунок бiльш ефективного використання вже iснуючих потоков з цього пулу.
Виклик методу get у об'екта типу Future змушує текучий потiк очикувати результат виконання вiдповiдним потоком призначеної йому задачi.
import java.util.concurrent.*; import java.util.Random; class CallableImpl implements Callable <Integer> { private static final Random rand = new Random(); int threadNumber = 0; public void setThreadNumber( int num) { threadNumber = num; } public Integer call() { System.out.println( "Callable task(" + threadNumber + ") begin"); busy(); System.out.println( "Callable task(" + threadNumber + ") end"); return new Integer( threadNumber); } private void busy() { try { Thread.sleep( rand.nextInt( 500)); } catch (InterruptedException e) {} } } public class ExecutorServiceDemo { public static void main( String args[]) { CallableImpl callable[] = new CallableImpl[10]; Future future[] = new Future[10]; ExecutorService executor = Executors.newFixedThreadPool( 5); for (int i = 0; i < 10; ++i) { callable[i] = new CallableImpl(); callable[i].setThreadNumber( i + 1); future[i] = executor.submit( callable[i]); } for (int i = 0; i < 10; ++i) { try { System.out.println( "Future value: " + future[i].get()); } catch (Exception e) { e.printStackTrace(); } } executor.shutdown(); } } |
