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

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Системи автоматизованого проектуваня

Інформація про роботу

Рік:
2007
Тип роботи:
Методичні вказівки до лабораторної роботи
Предмет:
Об’єктно-орієнтоване програмування

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”  Кафедра САП Використання потоків в Java Методичні матеріали до лабораторної роботи № 3 з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки” Затверджено на засіданні кафедри “Системи автоматизованого проектування” Протокол № від Львів 2007 Використання потоків в Java. Методичні матеріали до лабораторної роботи № 3 з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”. Укладачі: Макар В.М., доцент, к.т.н. Загарюк Р.В., асистент. Відповідальний за випуск: Рецензенти: 1. МЕТА РОБОТИ Метою роботи є придбання навиків роботи з потоками при програмуванні на мові Java. 2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ 2.1. РEАЛІЗАЦІЯ ПОТОКІВ В JAVA Мова Java є однією з небагатьох мов програмування, які містять засоби підтримки потоків. У мові Java потоки звичайно використовуються для того, щоб аплети могли виконувати якісь дії в той час, як Web-браузер продовжує свою роботу, проте потоки можна застосувати в будь-якій програмі при необхідності паралельного виконання декількох завдань. Так, наприклад, при створенні колективом програмістів великого і складного програмного продукту, як правило, окремі модулі програми розробляються паралельно окремими програмістами або групами програмістів. В цьому випадку процес розробки кожного модуля програми можна представити як окремий потік. Реалізація використання потоків в програмах на мові може виконуватися двома способами: - розширенням класу Thread; - реалізацією інтерфейсу Runnable. При першому способі клас стає потоковим, якщо він створений як розширення класу Thread, який визначений в пакеті java.lang, наприклад: public class GreatRace extends Thread При цьому стають доступними всі методи потоків. Звичайно, коли необхідно, щоб даний клас є розширенням деякого іншого класу і в ньому необхідно реалізувати потоки, попередній підхід не можна використовувати, оскільки, як вже указувалося, мові Java немає множинного спадкоємства. Для вирішення цієї проблеми для даного класу потрібно реалізувати інтерфейс Runnable, наприклад: · public class GreatRace extends Applet implements Runnable · Інтерфейс Runnable має тільки один метод public void run(). Насправді клас Thread також реалізує цей інтерфейс, проте стандартна реалізація run() у класі Thread не виконує ніяких операцій. Необхідно або розширити клас Thread, щоб включити в нього новий метод run(), або створити об'єкт Runnnable і передати його конструктору потоку. Коли створюється клас, що реалізовує інтерфейс Runnable, цей клас повинен перевизначити метод run(). Саме цей метод виконує фактичну роботу, покладену на конкретний потік. · Створити потік можна за допомогою одного з наступних конструкторів: · public Thread() · public Thread(String name) public Thread(Runnable target) · public Thread(Runnable target, String name) public Thread(ThreadGroup group, String name) · public Thread(ThreadGroup group, Runnable target) · public Thread(ThreadGroup group, Runnable target, String name) У першому конструкторі створюється потік, який використовує самого себе як такий інтерфейс Runnable. У решті конструкторів використовувані параметри мають наступний сенс: name - ім'я, яке привласнюється новому потоку; · target - визначення цільового об'єкту, який використовуватиметься новим об'єктом Thread при запуску потоків. Якщо опустити цей параметр або привласнити йому значення null, новий об'єкт Thread запускатиме потоки за допомогою виклику методу run() поточного об'єкту Thread. Якщо при створенні нового об'єкту Thread указується цільовий об'єкт, то для запуску нових процесів він викликатиме метод run() вказаного цільового об'єкту; · 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, якщо це призначений для користувача потік. · Метод public static int enumerate(Thread[] threadArray) класу Thread заповнює масив об'єктами Thread, що представляють потоки в групі, до якої відноситься поточний потік. Оскільки перед таким викликом необхідно створити масив threadArray, треба знати, скільки елементів буде одержано. Метод public static int activeCount() класу Thread повідомляє, скільки активних потоків в групі, до якої відноситься даний потік. 2.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 батьківської для даної групи. 2.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, синхронізованого статичного методу цього класу. 3.КОНТРОЛЬНІ ЗАПИТАННЯ Які два способи використовуються для реалізації потоків в Java? Як виконується зупинка або завершення потоку? Які операції над потоками визначені в Java? Як виконується переривання потоку і перевірка стану переривання? Що таке потоки-демони і чим вони відрізняються від звичайних потоків? Як задати і набути значення пріоритету для потоку? Як можна створити групу потоків і які операції визначені для групи потоків в Java? Які засоби синхронізація потоків є в Java? Як виконується синхронізація потоків за допомогою оператора synchronized? Як виконується синхронізація потоків за допомогою методів wait() і notify()? 4.ЛАБОРАТОРНЕ ЗАВДАННЯ Напишіть програму моделювання з використанням на мові Java по одному з приведених нижче варіантів. У програмах клас CPUQueue описує чергу, клас CPUProcess моделює потік процесів, а клас CPU - потік обслуговування процесу центральним процесором. Черги, потоки процесів і обслуговування процесу моделюються за допомогою об'єктів відповідного класу. Параметри черги моделюються за допомогою алгоритмів вставки і витягання процесу з черги. Параметром процесу є інтервал часу між двома послідовними генераціями процесів. Параметром процесора є час обслуговування процесу. Випадкові часи для інтервалів між моментами генерації процесів і для часів обслуговування розподілені по рівномірному закону із заданими верхньою і нижньою межами (див. метод random() у класі Math). Початковими даними для моделювання є кількість процесів, які повинні згенерувати (для кожного потоку процесів), а також нижні і верхні межі для потоків. 5.ЗМІСТ ЗВІТУ Мета роботи. Короткі теоретичні відомості. Постановка задачі індивідуального завдання. Файли проекту. Аналіз результатів результати виконання програми при різних початкових даних. Висновки. 6. СПИСОК РЕКОМЕНДОВАНОЇ ЛІТЕРАТУРИ Bruce Eckel, Thinking in Java, 2nd Edition, 2000. ДОДАТОК Варіант 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. Програма моделює обслуговування трьох потоків процесів з різними параметрами двома центральними процесорами і трьома чергами. Кожен процес поступає в свою чергу. Процеси першого і другого потоків обслуговуються кожен своїм процесором. Якщо перший або другий процесор звільняються, вони спочатку проглядають чергу процесорів третього потоку і, якщо вона порожня, черги процесів свого потоку. Визначте максимальні довжини черг і відсотки процесів третього потоку, обслужені першим і другим процесором.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

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

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!