Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лабораторная работа №3 (на укр.яз) - файл 1.doc


Лабораторная работа №3 (на укр.яз)
скачать (135 kb.)

Доступные файлы (1):

1.doc135kb.08.12.2011 17:14скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
Лабораторна робота 3

Використання потоків в Java

1. МЕТА РОБОТИ


Метою роботи є набуття навиків роботи з потоками при програмуванні на мові Java.

2. СКЛАД РОБОЧОГО МІСЦЯ


2.1. Обладнання: IBM-сумісний персональний комп'ютер (ПК).

2.2. Програмне забезпечення: операційна система Windows (Linux), Java 2 SDK версії 1.2.2 і вище, IntelliJ IDEA 5.0 (Eclipse) або вище.

3. КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

3.1. Реалізація потоків в Java


Мова Java є однією з небагатьох мов програмування, які містять засоби підтримки потоків. У мові Java потоки зазвичай використовуються для того, щоб аплети могли виконувати якісь дії в той час, як web-браузер продовжує свою роботу, проте потоки можна застосувати в будь-якій програмі при необхідності паралельного виконання декількох завдань.

Так, наприклад, при створенні колективом програмістів великого і складного програмного продукту, як правило, окремі модулі програми розробляються паралельно окремими програмістами або групами програмістів. В цьому випадку процес розробки кожного модуля програми можна представити як окремий потік.

Реалізація використання потоків в програмах може виконуватися двома способами:

  • розширенням класу ^ Thread;

  • реалізацією інтерфейсу Runnable.

При першому способі необхідно оголосити новий клас, який розширює клас Thread (пакет java.lang), наприклад:

public class Greatrace extends Thread

При цьому стають доступними всі методи даного класу. Новий клас, який розширює ^ Thread, повинен перевизначити метод метод run(), який є вхідною точкою для нового потоку. Також новий клас має викликати метод start() для запуску нового потоку.

Зазвичай, коли необхідно, щоб даний клас був розширенням деякого іншого класу і в нім необхідно реалізувати потоки, попередній підхід не можна застосувати, оскільки, як вже вказувалося, в мові Java немає множинного наслідування. Для вирішення цієї проблеми для даного класу потрібно реалізувати інтерфейс Runnable, наприклад:

public class Greatrace extends Applet implements Runnable

Інтерфейс Runnable має тільки один метод public void run(), який є невизначений. Коли створюється клас, що реалізовує інтерфейс Runnable, він повинен визначити метод run(). Саме в цьому методі міститься код, який виконує фактичну роботу, покладену на конкретний потік.

Створити потік можна за допомогою одного з наступних конструкторів:

public Thread()

  • створюється новий потік, який буде запускати потоки за допомогою виклику методу run() поточного об'єкту Thread.

public Thread(String name)

  • даний конструктор аналогічний попередньому, але створює новий потік з заданим іменем name.

public Thread(Runnable target)

  • даний конструктор створює новий потік, де в target вказується екземпляр класу, який реалізує інтерфейс Runnable. Він буде визначати де почнеться виконання потоку (буде викликатися метод run() вказаного цільового об'єкту).

public Thread(Runnable target, String name)

  • конструктор аналогічний попередньому, але задає ім’я нового потоку через name.

В наступних конструкторах:

public Thread(ThreadGroup group, String name)

public Thread(ThreadGroup group, Runnable target)

public Thread(ThreadGroup group, Runnable target, String name)

параметр group - призначений для переміщення нового об'єкту ^ Thread в дерево об'єктів даного класу. Якщо опустити даний параметр або привласнити йому значення null, новий об'єкт класу Thread стане членом поточної групи потоків Threadgroup.

Метод public String toString() повертає строкове представлення потоку, включаючи ім'я потоку, пріоритет і ім'я групи.

Наступні методи дозволяють отримати ім'я потоку або встановити ім'я потоку:

public final String getName()

public final void setName(String name)

Запуск потоку виконує метод:

public void start() throws IllegalThreadStateException

виключення спрацьовує, якщо робиться спроба запуску вже запущеного потоку.

Для зупинки потоку рекомендується потоку, що зупиняється, привласнити значення null, наприклад:

^ Thread mythread;



myThread.start(); // Запуск потоку



myThread = null; // Зупинка або завершення потоку

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

public final void join() throws InterruptedException

Методу join можна також передати значення тайм-ауту, використовуючи його варіанти:

public final syncronized void join(long millis) throws

InterruptedException
public final syncronized void join(long millis, int nanos)

throws InterruptedException.

Ці методи чекають протягом millis мілісекунд або millis мілісекунд плюс nanos наносекунд.

Якщо потрібно, щоб перед продовженням роботи потік чекав певний час, можна використовувати такі методи:

public static void sleep(long millis) throws

InterruptedException

public static void sleep(long millis, int nanos) throws

InterruptedException

де параметри millis і nanos мають те ж значення, що і для методу join. Метод sleep() дуже часто використовується в циклах, які керують анімацією.

Якщо в програмі є потік, який захоплює процесор, проводячи велику кількість обчислень, може з'явитися необхідність примушувати його час від часу "відпускати" процесор, даючи можливість виконуватися іншим потокам. Це досягається за допомогою методу

public static void yield().

Метод

public void destroy()

  • знищує потік без всякого очищення тих, що відносяться до нього даних, а метод

public final boolean isAlive()

  • дозволяє визначити, чи запущений потік і ще «живий».


Потоки в Java можуть переривати один одного. Механізм переривань реалізується за допомогою наступних методів:

public void interrupt()

  • перериває даний потік;

public static boolean interrupted()

  • перевіряє, чи був перерваний даний потік (цей метод очищає ознаку переривання для потоку, тобто при повторному виклику методу для цього ж перерваного потоку він поверне значення false);

public boolean isInterrupted()

- аналогічний попередньому методу, але не очищає ознаки переривання для потоку.

У класі ^ Thread є ряд статичних методів для вивчення поточного потоку і інших потоків з тієї ж групи. Метод

public static Thread currentThread()

  • повертає об'єкт, що відповідає виконуваному у момент виклику потоку.

Метод

public static void dumpStack()

  • виводить трасування стека для поточного потоку.

Метод

public final void checkAccess()

  • перевіряє, чи має право поточний потік модифікувати даний потік.

Зазвичай програма на Java працює до завершення всіх вхідних в неї потоків. Іноді, проте, зустрічаються потоки, що працюють у фоновому режимі, виконуючи допоміжні дії, які ніколи не закінчуються. Можна помітити такий потік як потік-демон (daemon thread), що говорить JVM про те, що цей потік не треба враховувати при визначенні, чи всі потоки даної програми завершилися. Іншими словами, програма на Java виконується до тих пір, поки не завершиться останній потік, що не є демоном. Потоки, не помічені як демони, називаються потоками користувача (user threads).

Щоб потік вважався демоном, треба скористатися методом

public final void setDaemon(boolean on) throws

IllegalThreadStateException

Якщо параметр on рівний true, потік отримує статус демона, якщо false – статус потоку користувача. Статус потоку може бути змінений в процесі його виконання. Метод

public final boolean isDaemon()

  • повертає true, якщо потік є демоном, і false, якщо це потік користувача.

Метод класу Thread:

public static int enumerate(Thread[] threadArray)

  • заповнює масив об'єктами ^ Thread, що представляють потоки в групі, до якої відноситься поточний потік. Оскільки перед таким викликом необхідно створити масив threadArray, треба знати, скільки елементів буде отримано.

Метод класу Thread:

public static int activeCount()

  • повідомляє, скільки активних потоків в групі, до якої відноситься даний потік.



^

3.2. Пріоритети і групи потоків


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

public final void setPriority(int newPriority) throws

IllegalArgumentException

Пріоритет потоку повинен бути числом в діапазоні від Thread.MIN_PRIORITY до Thread.MAX_PRIORITY. Будь-яке значення поза цими межами викликає виключення IllegalArgumentException. За замовчуванням потоку прзначається пріоритет Thread.NORM_PRIORITY. Значення пріоритету потоку можна з'ясувати за допомогою методу

public final int getPriority()

Клас ThreadGroup реалізує стратегію забезпечення безпеки, яка дозволяє впливати один на одного тільки потокам з однієї групи. Наприклад, потік може змінити пріоритет іншого потоку з тієї ж групи або перевести його в стан очікування. Якби не було розбиття потоків на групи, один потік міг би викликати хаос в середовищі Java, перевівши в стан очікування решту потоків, або, що ще гірше, завершивши їх. Групи потоків організовані в ієрархічну структуру, де у кожної групи є батьківська група. Потоки можуть впливати на потоки зі своєї групи і з дочірніх груп. Групу потоків можна створити, просто задавши її ім'я, за допомогою конструктора

public ThreadGroup(String groupName)

Можна також створити групу потоків, дочірню по відношенню до тієї, що існує, використовуючи конструктор

public ThreadGroup (ThreadGroup existingGroup, String groupName)

throws NullPointerException

Метод

public String toString()

  • повертає строкове представлення даної групи, а методи

public final String getName()

public final void setName(String name)

  • дозволяють отримати ім'я групи або встановити ім'я групи.

Інші методи класу ThreadGroup є аналогами відповідних методів класу Thread, але застосовуються до всієї групи:

public int activeCount()

  • повертає число активних потоків в даній групі;

public int activeGroupCount()

  • повертає число активних груп в даній групі;

public final void checkAccess()

  • перевіряє, чи може виконуваний в даний час потік модифікувати дану групу;

public final void destroy() throws IllegalThreadStateException,

SecurityException

public boolean isDestroyed()

  • відповідно знищує всі потоки даної групи і її підгруп (всі потоки в групі повинні бути заздалегідь зупинені) або перевіряє чи «жива» дана група;

public final void interrupt()

  • перериває всі потоки в даній групі;

public final boolean isDaemon()

public final void setDaemon(boolean daemon)

  • відповідно перевіряє і встановлює ознаку потоку-демона для всієї групи.

Можна обмежити пріоритет потоків з групи за допомогою виклику методу

public final synchronized void setMaxPriority (int priority)

а визначити максимальний пріоритет потоку в групі можна за допомогою методу

public final int getMaxPriority()

Батьківська група потоків доступна за допомогою виклику методу

public final ThreadGroup getParent()

а за допомогою методу

public final boolean parentOf(ThreadGroup g)

можна перевірити чи є група g батьківською для даної групи.
^

3.3. Синхронізація потоків


Як вже вказувалося, основна відмінність потоків від процесів полягає в тому, що потоки не захищені один від одного засобами операційної системи. Тому будь-який з потоків може дістати доступ і навіть внести зміни в дані, які інший потік вважає своїми. Вирішення цієї проблеми полягає в синхронізації потоків.

Синхронізація потоків полягає в гарантуванні надання доступу в кожен момент часу до даних тільки до одного потоку. Для цього використовується наступний оператор:

synchronized (вираз)

оператор

Взятий в дужки вираз повинен вказувати на дані, що блокуються, - зазвичай вони є посиланням на об'єкт. Найчастіше при блокуванні об'єкту необхідно виконати відразу декілька операторів, так що оператор, як правило, є блоком.

Якщо виявляється, що критична ділянка розповсюджується на весь метод, а ресурсом, що розділяється, є весь об'єкт в цілому, то можна просто вказати модифікатор synchronized в оголошенні методу, наприклад:

synchronized void mymethod() {

// Тіло методу

}

Гнучкіший і ефективніший спосіб координації виконання потоків забезпечують методи wait() і notify() класу Object.

Метод wait() переводить потік в стан очікування виконання певної умови і викликається за допомогою одного з наступних методів:

public final void wait() throws InterruptedException,

IllegalMonitorStateException

припинення виконання поточного потоку до отримання сповіщення;

public final void wait(long timeout) throws

InterruptedException, IllegalMonitorStateException,

IllegalArgumentException

припинення виконання поточного потоку до отримання сповіщення або до закінчення заданого інтервалу часу timeout (у мілісекундах);

public final void wait(long timeout, int nanos) throws

InterruptedException, IllegalMonitorStateException,

IllegAlargumentException

припинення виконання поточного потоку до отримання сповіщення або до закінчення заданого інтервалу часу timeout (у мілісекундах) і, додатково, в наносекундах (значення в діапазоні 0-999999).

Метод

public final void notify()

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

public final void notifyAll()

Методи можуть викликатися тільки потоком, який є власником монітора даного об'єкту. Якщо до виклику методів wait() або notify() не виконати захоплення монітора даного об'єкту, генерується виключення IllegalMonitorStateException. Потік стає власником даного об'єкту одним з трьох способів:

  • викликом методу, оголошеного як synchronized, який здійснює доступ до необхідного екземпляра об'єкту класу Object;

  • виконанням тіла оператора synchronized, призначеного для синхронізації доступ до необхідного екземпляра об'єкту класу Object;

  • виконанням, для об'єктів типу Class, синхронізованого статичного методу цього класу.
^

4. ПОРЯДОК ВИКОНАННЯ РОБОТИ


Напишіть на мові Java програму моделювання процесів з використанням потоків.

У програмах клас CPUQueue описує чергу, клас CPUProcess моделює потік процесів, а клас CPU - потік обслуговування процесу центральним процесором. Черги, потоки процесів і обслуговування процесу моделюються за допомогою об'єктів відповідного класу. Параметри черги моделюються за допомогою алгоритмів вставки і витягання процесу з черги. Параметром процесу є інтервал часу між двома послідовними генераціями процесів. Параметром процесора є час обслуговування процесу.

Випадковий час для інтервалів між моментами генерації процесів і для часу обслуговування розподілені за рівномірним законом розподілу із заданими верхньою і нижньою межами (див. метод random() у класі Math). Початковими даними для моделювання є кількість процесів, які повинні згенерувати (для кожного потоку процесів), а також нижні і верхні межі для потоків.
Варіант 1

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

Програма моделює обслуговування одного потоку процесів одним центральним процесором комп'ютера з чергами фіксованого розміру (буферними областями). Якщо розмір черги перевищує заданий розмір, вміст черги поступає на обробку в процесор. Якщо буферна область заповнюється до закінчення обробки процесором вмісту попередньої буферної області, створюється нова буферна область і так далі Визначити максимальну і середню кількість буферних областей.
Варіант 3

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

Програма моделює обслуговування одного потоку процесів декількома центральними процесорами комп'ютера з декількома чергами однакового розміру. Якщо процес згенерував в той момент, коли перша черга заповнена, процес поміщається в наступну чергу, для обробки якої запускається другий процесор. Якщо і ця черга заповнена, створюється третя черга і запускається третій процесор і так далі Визначити кількість задіяних процесорів, максимальну довжину останньої черги і відсоток від загальної кількості процесів, які були оброблені кожним процесором.
Варіант 5

Програма моделює обслуговування одного потоку процесів декількома центральними процесорами комп'ютера без черг. Якщо процес згенерував в той момент, коли перший процесор зайнятий, процес береться на обробку другим процесором, якщо і цей процесор зайнятий, запускається третій процесор і так далі Визначити кількість задіяних процесорів і відсоток від загальної кількості процесів, які були оброблені кожним процесором.
Варіант 6

Програма моделює обслуговування одного потоку процесів одним центральним процесором комп'ютера з двома чергами. Якщо розмір першої черги перевищує заданий, процес поміщається в другу чергу (буфер переповнювання), розмір якої не обмежений. Процесор бере на обробку процес з другої черги тільки в тому випадку, якщо розмір цієї черги перевищить деяку задану величину. Визначити максимальний розмір другої черги і відсоток процесів, які були вибрані на обробку з другої черги.
Варіант 7

Програма моделює обслуговування одного потоку процесів одним центральним процесором комп'ютера з двома чергами. Процес, що згенерував, поміщається в ту чергу, розмір якої менший. У свою чергу, процесор бере на обслуговування запит з тієї черги, розмір якої більший. Визначити відсоток запитів, які були вибрані на обробку з першої черги.
Варіант 8

Програма моделює обслуговування одного потоку процесів трьома центральними процесорами комп'ютера без черги. Перший процесор обробляє процеси один, другий і третій - послідовно, причому, якщо другий процесор звільняється, він може взяти на обробку наступний процес, який чекає, поки не закінчиться обробка на третьому процесорі. Процес, що згенерував, одночасно намагається почати обробку на першому і на другому процесорі. Якщо процесор зайнятий, то процес знищується. Визначити відсоток знищених процесів окремо на першому і окремо на другому процесорі.
Варіант 9

Програма моделює обслуговування двох потоків процесів з різними параметрами двома центральними процесорами комп'ютера з однією чергою. Якщо згенеровано процес другого потоку і другий процесор зайнятий, процес поступає в чергу. Якщо згенеровано процес першого потоку, то, якщо перший процесор зайнятий обробкою першого потоку, то процес поступає на обробку на другий процесор. Якщо і другий процесор зайнятий, то процес знищується. Якщо у момент генерації процесу першого потоку на першому процесорі обробляється процес другого потоку, то процес переривається і повертається в чергу. Визначити максимальну довжину черги, відсоток знищених процесів для першого потоку і відсоток перерваних запитів для другого потоку.
Варіант 10

Програма моделює обслуговування двох потоків процесів з різними параметрами двома центральними процесорами комп'ютера з однією чергою. Якщо згенеровано процес другого потоку і другий процесор зайнятий, процес поступає в чергу. Якщо згенеровано процес першого потоку, то, якщо перший процесор зайнятий обробкою першого потоку, то процес поступає на обробку на другий процесор. Якщо і другий процесор зайнятий, то процес знищується. Якщо у момент генерації процесу першого потоку на першому процесорі обробляється процес другого потоку, процес вважається втраченим. Визначити максимальну довжину черги і відсотки знищених процесів для першого і другого потоку.
Варіант 11

Програма моделює обслуговування одного потоку процесів одним центральним процесором комп'ютера з однією чергою. Якщо черговий процес генерується в момент, коли процесор вільний, процес поступає на обробку в процесор, інакше процес поступає в чергу. Якщо процесор вільний і в черзі є процеси, процес видаляється з черги. Визначити максимальну довжину черги.
Варіант 12

Програма моделює обслуговування одного потоку процесів одним центральним процесором комп'ютера без черги. Якщо черговий процес генерується в момент, коли процесор вільний, процес поступає на обробку в процесор, інакше процес знищується. Визначити відсоток знищених процесів.
Варіант 13

Програма моделює обслуговування одного потоку процесів двома центральними процесорами комп'ютера без черги. Якщо черговий процес генерується в момент, коли будь-який з процесорів вільний, процес поступає на обробку в даний процесор, інакше процес знищується. Визначити відсоток знищених процесів для двох однакових процесорів.
Варіант 14

Програма моделює обслуговування одного потоку процесів двома центральними процесорами комп'ютера із загальною чергою. Якщо черговий процес генерується в момент, коли будь-який з процесорів вільний, процес поступає на обробку, інакше процес стає в чергу. Якщо один з процесорів звільняється, і в черзі є процеси, процес видаляється з черги. Визначити максимальний розмір черги для двох однакових процесорів.
Варіант 15

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

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

Програма моделює обслуговування одного потоку процесів одним центральним процесором комп'ютера з однією чергою заданого розміру. Якщо черговий процес генерується в момент, коли процесор вільний, процес поступає на обробку в процесор, інакше процес поступає в чергу. Якщо процесор вільний і в черзі є процеси, процес видаляється з черги. Якщо розмір черги перевищує заданий розмір, процес знищується. Визначити відсоток знищених процесів.
Варіант 18

Програма моделює обслуговування одного потоку процесів двома центральними процесорами комп'ютера із загальною чергою заданого розміру. Якщо черговий процес генерується в момент, коли будь-який з процесорів вільний, процес поступає на обробку, інакше процес стає в чергу. Якщо розмір черги перевищує задане значення, процес знищується. Визначити максимальний розмір черги і відсоток знищених процесів для двох однакових процесорів.
Варіант 19

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

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

Програма моделює обслуговування одного потоку процесів двома центральними процесорами комп'ютера із загальною чергою. Якщо черговий процес генерується в момент, коли перший процесор вільний, процес поступає на обробку, інакше процес стає в чергу. Якщо розмір черги перевищує задане значення, процес поступає на обробку в другий процесор. Визначити загальну кількість процесів і відношення (у відсотках) оброблених процесів до загальної кількості процесів, що були згенеровані, для обох процесорів.
Варіант 22

Програма моделює обслуговування двох потоків процесів з різними параметрами двома центральними процесором комп'ютера. Для кожного потоку задається своя черга. Процес з кожного потоку поступає на перший процесор, і лише у тому випадку, коли довжина однієї з черг перевищує задану для неї величину. Визначити загальну кількість процесів і відношення (у відсотках) оброблених процесів до загальної кількості процесів, що були згенеровані, для обох процесорів.
Варіант 23

Програма моделює обслуговування двох потоків процесів з різними параметрами одним центральним процесором комп'ютера без черги. Процес з кожного потоку поступає на процесор, але якщо при обробці процесу генерується процес з того ж потоку, оброблюваний процес вважається втраченим. Проте, якщо при обслуговуванні процесу з другого потоку генерується процес першого потоку, то процес знищується і починається обробка процесу з першого потоку. Визначити відсоток знищених процесів для першого і другого потоків.
Варіант 24

Програма моделює обслуговування одного потоку процесів двома центральними процесорами з однією чергою. Коли процес віддаляється з черги, він спочатку поступає на обробку в перший процесор. Як тільки процес обробки закінчується, процес обробляється на другому процесорі, а на перший процесор поступає черговий процес з черги (якщо черга не порожня). Процес на першому процесорі чекає закінчення обробки попереднього процесу на другому процесорі (якщо обробка попереднього процесу ще не закінчилася). Визначити максимальну довжину черги.
Варіант 25

Програма моделює обслуговування двох потоків процесів з різними параметрами одним центральним процесором і однією чергою. Якщо згенорований процес другого потоку і процесор зайнятий, процес поступає в чергу. Якщо згенорований процес першого потоку, то, якщо процесор обробляє процес першого потоку, то процес знищується. Якщо ж процесор обробляє процес другого потоку, то процес уривається і повертається в чергу. Визначити максимальну довжину черги, відсоток знищених процесів першого потоку і кількість перерваних процесів другого потоку.
Варіант 26

Програма моделює обслуговування двох потоків процесів з різними параметрами одним центральним процесором і трьома чергами. Якщо згенорований процес другого потоку і процесор зайнятий, процес поступає в другу чергу. Якщо згенорований процес першого потоку, то, якщо процесор обробляє процес другого потоку, процес другого потоку припиняється і поміщається в третю чергу (з часом обробки, що залишився). Якщо процесор обробляє процес першого потоку, то процес поступає в першу чергу. При звільненні процесора, черги є видимими в наступному порядку: перша черга, третя черга, друга черга. Визначити максимальні довжини черг і кількість перерваних процесів другого потоку.
Варіант 27

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

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

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

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

5. ЗМІСТ ЗВІТУ


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

6. ПИТАННЯ ДЛЯ САМОКОНТРОЛЮ


1. Які два способи використовуються для реалізації потоків в Java?

2. Як виконується зупинка або завершення потоку?

3. Які операції над потоками визначені в Java?

4. Як виконується переривання потоку і перевірка стану переривання?

5. Що таке потоки-демони і чим вони відрізняються від звичайних потоків?

6. Як задати і набути значення пріоритету для потоку?

7. Як можна створити групу потоків і які операції визначені для групи потоків в Java?

8. Які засоби синхронізації потоків є в Java?

9. Як виконується синхронізація потоків за допомогою оператора synchronized?

10. Як виконується синхронізація потоків за допомогою методів wait() і notify()?


Скачать файл (135 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru