- •Учбово - методичні матеріали Основна література
- •Додаткова література
- •Методичні вказівки
- •Методичні вказівки до виконання лабораторних робіт
- •Лабораторна робота №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-й вариант
Consumer считывает -1
Producer записывает 1
Consumer считывает 1
Consumer считывает 1
Consumer считывает 1
Consumer сумма прочитанных значений: 2
Завершение потока Consumer.
Producer записывает 2
Producer записывает 3
Producer записывает 4
Producer заканчивает генерирование.
Завершение потока Producer.
Результаты выполнения программы, 2-й вариант
Producer записывает 1
Producer записывает 2
Consumer считывает 2
Producer записывает 3
Consumer считывает 3
Producer записывает 4
Producer заканчивает генерирование.
Завершение потока Producer.
Consumer считывает 4
Consumer считывает 4
Consumer сумма прочитанных значений: 13
Завершение потока Consumer.
Результаты выполнения программы, 3-й вариант
Producer записывает 1
Consumer считывает 1
Producer записывает 2
Consumer считывает 2
Producer записывает 3
Consumer считывает 3
Producer записывает 4
Consumer считывает 4
Producer заканчивает генерирование.
Завершение потока Producer.
Consumer сумма прочитанных значений: 10
Завершение потока Consumer.
Вспомним, что по условию примера поток Producer должен генерировать значения до того, как поток Consumer захочет их прочесть, и что каждое значение должно быть прочитано потоком Consumer только один раз. Тем не менее, изучив выводимые на экран результаты 1-го варианта выполнения программы, мы увидим, что Потребитель извлекает из буфера -1, прежде чем Производитель успеет записать в буфер новое значение. В то же врема, первое значение (1) Потребитель прочтет три раза. Более того, Потребитель закончит свое выполнение до того, как Производитель сгенерирует значения 2, 3и 4, в результате чего все эти три значения будут потеряны. Соответственно, общая сумма (2) также не будет отвечать ожидаемому результату.
Во втором варианте поток потерял значение 1, поскольку значения 1 и 2 были сгенерированы, прежде чем поток Потребителя смог начать чтение 1. Кроме того, значение 4 было прочитано дважды. В последнем варианте показано, что при определенной доле везения можно получить правильный результат.
Данный пример доказывает, что доступ к разделяемым объектам со стороны параллельных потоков должен контролироваться весьма тщательно, иначе программа начнет выдавать некорректные результаты. О том, как можно решить данную проблему вы узнаете в дальнейшем, изучая взаимоисключающий монопольный доступ.
Вопросы для самопроверки
(Да/Нет). Правда ли, что в данном примере Производитель-Потребитель непротиворечивости и постоянства выходного результата можно достичь, если удалить из программного кода вызов функции sleep?
Какое самое маленькое и самое бльшое значение может принимать переменная sum в данном примере, и при каких условиях этого можно добиться?
Ответы
Нет. Вызов функции sleep всего лишь подчеркивает тот факт, что порядок и время выполнения тех или иных команд в системе определить невозможно. Кроме того, мы не можем предсказать скорость выполнения этих потоков, поэтому результаты могут оказаться некорректными.
Наименьшее значение (-4) переменная sum примет в том случае, если Потребитель выполнит все четыре итерации чтения из буфера, прежде чем Производитель успеет записать хотя бы одно значение. Самое большое значение (16) будет получено в том случае, если Производитель сгенерирует все четыре значения до того, как Потребитель успеет прочитать хотя бы одно из них.
