- •Учбово - методичні матеріали Основна література
- •Додаткова література
- •Методичні вказівки
- •Методичні вказівки до виконання лабораторних робіт
- •Лабораторна робота №1
- •1.2. Кешування даних
- •1.2.2. Принцип дії кеш-пам'яті
- •1.3. Вступ до мови програмування Java
- •1.3.1. Виконання Java-програми
- •1.3.2. Що таке jdk
- •1.3.3. Як використовувати jdk
- •1.3.4. Проста програма на Java
- •1.4. Завдання до лабораторної роботи
- •Лабораторна робота № 2
- •2. Створення програм моделювання кількох процесів, що конкурують за спільні ресурси
- •2.1. Понятие процесса
- •2.2. Понятие ресурса
- •2.3. Модель процесса
- •2.4. Создание процесса
- •2.5. Завершение процесса
- •2.6. Состояние процессов
- •2.7. Описание процессов
- •2.8. Управляющие структуры ос
- •2.9. Структуры управления процессами
- •2.9.1. Местоположение процесса
- •2.9.2. Атрибуты процессов
- •Идентификация процессов
- •Информация о состоянии процесса
- •Управляющая информация процесса
- •2.10. Управление процессами
- •2.11. Потоки. Симметричная многопроцессорная обработка
- •2.11.1. Понятие потока
- •2.11.2. Модель потока
- •2.11.3. Использование потоков
- •2.12. Потоки на уровне пользователя и на уровне ядра
- •2.12.1. Потоки на уровне пользователя (ult)
- •2.12.2. Потоки на уровне ядра (klt)
- •2.12.3. Комбинированные подходы
- •2.12.4. Всплывающие потоки
- •Многозадачность в Java. Учебный пример создания и запуска потоков в Java, часть 1
- •Вопросы для самопроверки
- •2.14. Принципы параллельных вычислений
- •2.14.1. Участие операционной системы
- •2.14.2. Взаимодействие процессов
- •2.14.3. Требования к взаимным исключениям
- •2.14.4. Многозадачность в Java. Учебный пример Производитель-Потребитель, часть 2
- •Результаты выполнения программы, 1-й вариант
- •Результаты выполнения программы, 2-й вариант
- •Результаты выполнения программы, 3-й вариант
- •Вопросы для самопроверки
- •2.15. Взаимоисключения: программный подход
- •2.15.1. Алгоритм Деккера
- •2.15.2. Алгоритм Петерсона
- •2.16. Семафоры
- •2.17. Взаимные исключения
- •Листинг 2.8. Взаимоисключения с использованием семафоров
- •2.18. Задача “Производителя-Потребителя” ("Писатель-Читатель")
- •2.19. Мониторы
- •2.19.1. Мониторы с сигналами (мониторы Хоара)
- •2.19.2. Мониторы с оповещением и широковещанием
- •2.19.3. Многозадачность в Java. Учебный пример Производитель-Потребитель, часть 3
- •Результаты выполнения программы, 1-й вариант
- •Результаты выполнения программы, 2-й вариант
- •Вопросы для самопроверки
- •2.20. Завдання на виконання роботи
- •Таб. 2.1. Варіанти завдань
- •Лабораторна робота № 3
- •3. Створення програм моделювання кількох процесів-виробників та процесів-споживачів, що обмінюються інформацією через буферний пул
- •3.1. Теоретичні відомості
- •3.2. Завдання на виконання роботи
- •Лабораторна робота № 4
- •4. Моделювання процесів, що конкурують за спільні ресурси з використанням методів планування
- •4.1. Призупинені процеси
- •4.2. Завдання на виконання роботи
- •Лабораторна робота № 5
- •5. Моделювання Управління процесами та потоками в ос linux Мета роботи. Засвоєння методу планування процесів ос linux, основаному на керуванні пріоритетами та їхнього моделювання засобами мови java.
- •5.1. Процеси у linux
- •5.2. Потоки у linux
- •5.3. Завдання на виконання роботи
1.3.2. Що таке jdk
Набір програм і класів JDK містить:
компілятор javac з початкового тексту в байт-коды;
інтерпретатор java, що містить реалізацію JVM;
відладчик jdt>;
дизасемблер javap;
програму збору документації javadoc;
бібліотеку класів Java API (Application Programming Interface).
У 1996 р. була випущена перша версія JDK 1.0, яка модифікувалася до версії з номером 1.0.2. У 1997 р. з'явилася версія JDK 1.1, остання її модифікація, 1.1.8, випущена в 1998 р. Версія JDK 1.2 вийшла в грудні 1998 р.
1.3.3. Як використовувати jdk
Не дивлячись на те, що набір JDK призначений для створення програм, що працюють в графічних середовищах, таких як MS Windows, він орієнтований на виконання з командного рядка вікна MS-DOS Prompt в Windows 95/98/ME або вікна Command Prompt в Windows NT/2000/XP.
Написати програму на Java можна в будь-якому текстовому редакторові, наприклад, Notepad, WordPad в MS Windows. Треба тільки зберегти файл в текстовому форматі і дати йому розширення Java. Хай для прикладу, ім'ям файлу буде MyProgram.java, а сам файл збережений в поточному каталозі.
Після створення цього файлу з командного рядка викликається компілятор javac і йому передається початковий файл як параметр:
javac MyProgram.java
Компілятор створює в тому ж каталозі по одному файлу на кожен клас, описаний в програмі, називаючи кожен файл ім'ям класу з розширенням class. Допустимо, в нашому прикладу є тільки один клас, названий MyProgram, тоді отримуємо файл з ім'ям MyProgram.class, що містить байт-коди.
Компілятор мовчазний — якщо компіляція пройшла успішно, він нічого не повідомить, на екрані з'явиться тільки запрошення операційної системи. Якщо ж компілятор відмітить помилки, то він виведе, на екран повідомлення про них.
Далі з командного рядка викликається інтерпретатор байт-кодів java, якому передається файл з байт-кодами, причому його ім'я записується без розширення:
Java MyProgram
На екрані з'явиться виведення результатів роботи програми або повідомлення про помилки часу виконання.
Якщо робота з командного рядка, здається вам декілька застарілою, використовуйте для розробки інтегроване середовище (наприклад, Eclipse-SDK).
1.3.4. Проста програма на Java
Відповідно до давно сталої традиції розглянемо як перше завдання наступну.
Листинг 1.1. Програма, що виводить на екран текст “Здравствуй, мир!”
public class Hello {
public static void main(String[] args) {
System.out.println("Здравствуй, мир!");
}
}
Приведений вище текст обов'язково повинен міститися у файлі з ім'ям Hello.java. Зверніть увагу на те, що перша буква в імені є прописною, а останні - рядковими. Аби на екран видати російський текст, набирайте вашу програму в редакторові NotePad (або AkelPad), та Сохраните как … с кодировкой 866 (ОЕМ-русский).
Як і більшість інших мов, Java допускає довільне форматування тексту програми. Це означає, що будь-яку програму в принципі можна записати в один довгий рядок або, навпаки, максимально розтягнути по вертикалі, розміщуючи на кожному рядку лише по одній лексемі - мінімальній неділимій одиниці мови. Приведена вище програма складається з наступного ланцюжка лексем: ключові слова public, class, ідентифікатор Hello, роздільник {, ключові слова public, static і void, ідентифікатор main, роздільник (, ідентифікатор String, роздільники [ і ], ідентифікатор args, роздільники ) і {, ідентифікатор System, роздільник ., ідентифікатор out, роздільник ., ідентифікатор println, роздільник (, строковий літерал "Здрастуйте, світ!", роздільники ) ;, і двічі }. Дана програма не містить лексем лише ще одного типа, що існує в мові, - констант, прикладом якої є, скажімо, число 5.
Людина, проте, не машина, і їй далеко не байдуже, як відформатований текст програми. Невдале форматування істотно ускладнює правильне сприйняття тексту і породжує потенційні помилки.
Запам'ятаєте, що в мові Java існує близько шести десятків зарезервованих ключових слів, які мають сповна певне значення і не можуть бути використані, як і в інших мовах, для інших цілей, окрім тих, для яких вони призначені.
Послідовне виконання двох команд javac Hello.java і java Hello повинне привести до того, що на екрані з'явиться результат роботи програми - рядок Здрастуйте, світ!
Ми не наводитимемо детальний розбір того, який сенс окремих частин розглянутої програми, а зробимо це поступово у міру наведення прикладів. Повний коментар можна знайти в будь-якій книзі по мові Java.
У лістингу 1.2 приведена програма в найпростішому вигляді, записана на мові Java, яка виводить на екран середнє значення двох чисел.
Лістинг 1.2. Проста програма на мові Java.
/* Програма обчислення середнього значення двох чисел */
class SredZnach {
public static void main(String args[]) { // опис методу
double a=5, b=20, SredZ; // опис змінних
SredZ = (a+b)/2;
System.out.println("(a+b)/2 = " + SredZ);
}
}
Або з введенням чисел а i b:
/* Програма обчислення середнього значення двох чисел */
import java.io.*; //подключаем библиотеку ввода\вывода
class SredZna {
public static void main(String args[]) { // опис методу
double a=5, b=20, SredZ; // опис змiнних
String line = null; //обьявляем переменные
try {
BufferedReader is = new BufferedReader( //обьявляем
new InputStreamReader(System.in)); //буффер ввода
System.out.println("Введiть значення для а = ");
line = is.readLine(); //читаем строку
//a = Integer.parseInt(line); //берём с нее переменную(указываем тип Integer)
a = Double.parseDouble(line);//берём с нее переменную(указываем тип Double)
System.out.println("Введiть значення для b = ");
line = is.readLine(); //читаем строку
b = Double.parseDouble(line);//берём с нее переменную(указываем тип Double)
}
catch (NumberFormatException ex) { //"ловим" ошибки ввода
System.err.println("Not a valid number: " + line); //"ловим" ошибки ввода
}
catch (IOException e) { //"ловим" ошибки ввода
System.err.println("Unexpected IO ERROR: " + e);//"ловим" ошибки ввода
}
SredZ = (a+b)/2;
System.out.println("(a+b)/2 = " + SredZ);
}
}
Всяка програма складається з одного або декількох класів, в цьому простому прикладі тільки один клас (class).
Початок класу наголошується службовим словом class, за яким слідує ім'я класу, вибране довільно, в даному випадку SredZnach. Все, що міститься в класі, записується у фігурних дужках ({ }) і складає тіло класу (class body).
Всі дії проводяться за допомогою методів обробки інформації, коротко говорять просто метод (method). Ця назва уживається в мові Java замість назви "функція", вживаної в інших мовах.
Методи розрізняються по іменах. Один з методів обов'язково повинен називатися main, з нього починається виконання програми. У наший простій програмі тільки один метод, а значить, ім'я йому main.
Як і належить функції, метод завжди видає в результаті (частіше говорять, повертає (returns)) тільки одне значення, тип якого обов'язково указується перед ім'ям методу. Метод може і не повертати ніякого значення, граючи роль процедури, як в нашому випадку. Тоді замість типу повертаного значення записується слово void, як це і зроблено в прикладі.
Після імені методу в дужках, через кому, перераховуються аргументи (arguments) - або параметри методу. Для кожного аргументу указується його тип і, через пропуск, ім'я. У прикладі тільки один аргумент, його тип — масив, що складається з рядків символів. Рядок символів — це вбудований в Java API тип string, а квадратні дужки — ознака масиву. Ім'я масиву може бути довільним, в прикладі вибрано ім'я args .
Перед типом поверненого методом значення можуть бути записані модифікатори доступу. У прикладі їх два. Ключове слово public дозволяє програмістові управляти видимістю будь-якого методу і будь-якої змінної. В даному випадку модифікатор доступу public означає, що метод main видно і доступно будь-якому класу. Існують ще 2 покажчики рівня доступу — private і protected, з якими ви детальніше можете познайомитися у відповідній літературі.
Наступне ключове слово static забезпечує можливість виклику методу main () на самому початку виконання програми. За допомогою цього слова оголошуються методи і змінні класу, використовувані для роботи з класом в цілому. Методи, в оголошенні яких використано ключове слово static, можуть безпосередньо працювати тільки з локальними і статичними змінними. Модифікатори взагалі необов'язкові, але для методу main () вони необхідні.
Після імені методу ставляться дужки, щоб підкреслити, що це ім'я саме методу, а не простої змінної. Все, що містить метод, тіло методу (method body), також записується у фігурних дужках ({ }).
Блок також записується у фігурних дужках ({ }). Блок містить в собі нуль або декілька операторів з метою використовувати їх як один оператор в тих місцях, де по правилах мови можна записати тільки один оператора.
Єдина дія, яка виконує метод main () у прикладі, полягає у обчисленні виразу (SredZ = (a+b)/2) і виклику іншого методу з складним ім'ям System.out.println і передачі йому на обробку одного аргументу: текстова константа "(a+b)/2 = " з’єднана операцією конкатенації (+) із змінною SredZ. Текстові константи записуються в лапках, які є тільки обмежувачами і не входять до складу тексту. Як бачимо, оператор + є поліморфним і виконується різним чином для чисел і рядків:
2 + 2 // 4
"i = " + "c" // "i = c"
2 + "i = " // Помилка!
Складене ім'я System.out.println означає, що в класі System, що входить в Java API, визначається змінна з ім'ям out, що містить екземпляри одного з класів Java API, класу PrintStream, в якому є метод println() . Все це стане ясно пізніше, коли ви будете вивчати мову Java, а поки просто писатимемо це довге ім'я.
Дія методу println () полягає у виведенні свого аргументу у вихідний потік, пов'язаний зазвичай з виводом на екран текстового терміналу, у вікно MS-DOS Prompt або Command Prompt. Після виводу курсор переходить на початок наступного рядка екрану. У складі Java API є і метод print (), курсор, що залишається, в кінці виведеного рядка. Зрозуміло, що це прямий вплив мови Pascal.
Зробимо відразу важливе зауваження. Мова Java розрізняє строчні і прописні букви. Імена main, Main, MAIN різні з погляду компілятора Java. У прикладі важливо писати String, System із заголовної букви, а main з маленькою. Але усередині текстової константи неважливо, писати Century або century, компілятор взагалі не "дивиться" на неї, різниця буде видна тільки на екрані.
Мова Java розрізняє прописні і строчні букви. Свої імена можна записувати як завгодно, можна було б дати класу ім'я Sredznach або sredznach, але між Java-програмистами складена угода - "Code Conventions for the Java Programming Language". Ось декілька пунктів цієї угоди:
імена класів починаються з прописної букви; якщо ім'я містить декілька слів, то кожне слово починається з прописної букви;
імена методів і змінних починаються з строчної букви; якщо ім'я містить декілька слів, то кожне наступне слово починається з строчної букви;
імена констант записуються повністю прописними буквами; якщо ім'я складається з декількох слів, то між ними ставиться знак підкреслення.
Звичайно, ці правила необов'язкові, але сильно полегшують розуміння коду і додають програмі характерний для Java стиль.
Стиль визначають не тільки імена, але і розміщення тексту програми по рядкам, наприклад, розташування фігурних дужок: чи залишати відкриваючу фігурну дужку в кінці рядка із заголовком класу або методу або переносити на наступний рядок?
У текст програми можна вставляти коментарі, які компілятор не враховуватиме. Вони дуже корисні для пояснень по ходу програми. В період відладки можна вимикати з дій один або декілька операторів, помітивши їх символами коментаря, як говорять програмісти, "закомментарив" їх. Коментарі вводяться таким чином:
за двома підряд символами //, без пропуску між ними, починається коментар, що продовжується до кінця рядка;
за символами /* починається коментар, який може займати декілька рядків, до двох символів */ (без пропусків між цими знаками).
При використанні дійсних констант в кінці константи можна поставити букву F або f, тоді константа зберігатиметься у форматі типу float: 3.5f, -45.67F, 4.7e-5f . Можна приписати і букву D (або d ): 0.045D, -456.77889d, що означає тип double, але це зайве, оскільки дійсні константи і так зберігаються у форматі типу double.
Отже, програма написана в якому-небудь текстовому редакторові, наприклад, Notepad. Тепер її треба зберегти у файлі, ім'я якого співпадає з ім'ям класу, що містить метод main(), і дати імені файлу розширення Java. Це правило дуже бажано виконувати. При цьому система виконання Java швидко знаходитиме метод main() для початку роботи, просто відшукуючи клас, співпадаючий з ім'ям файлу.
Називайте файл з програмою ім'ям класу, що містить метод main (), дотримуючи регістр букв. У нашому прикладі, збережемо програму у файлі з ім'ям SredZnach.java у поточному каталозі. Потім викличемо компілятор, передаючи йому ім'я файлу як аргумент: javac SredZnach.java
Компілятор створить файл з байт-кодами, дасть йому ім'я SredZnach.class і запише цей файл в поточний каталог. Залишилося викликати інтерпретатор, передавши йому як аргумент ім'я класу (а не файлу): Java SredZnach
Ще раз нагадуємо, не указуйте розширення class при виклику інтерпретатора.
Щоб не “засмічувати” директорію, де знаходитися компілятор і інтерпретатор Java, своїми програмами, складіть bat-файл для запуску компілятора і інтерпретатора, якщо не прописаний шлях до Java в ОС. Наприклад:
ZAPUSK_Javaс.bat: ZAPUSK_Java.bat:
rem zapusk kompilytora rem zapusk interpretatora
c:\jdk1.3.1_04\bin\javac.exe lab1.java c:\jdk1.3.1_04\bin\java.exe lab1
pause pause
