
- •1 Свойства и классификация процессов
- •2. Управление процессами в ос. Граф существования и трасса процесса
- •3. С войства и классификация ресурсов. Критический ресурс.
- •4. Свойства и классификация ресурсов. Потребляемые и восстанавливаемые ресурсы
- •5. Типовые задачи синхронизации. Взаимное исключение
- •6. Типовые задачи синхронизации. Производитель-потребитель
- •7. Типовые задачи синхронизации. Читатели и писатели
- •8. Типовые задачи синхронизации. Обедающие философы
- •9. Механизмы синхронизации. Свойства и классификация
- •10. Механизмы синхронизации. Использование механизма прерываний
- •11. Механизмы синхронизации. Двухступенчатая схема
- •12. Механизмы синхронизации. Семафоры Дейкстры
- •13. Механизмы синхронизации. Решение задачи реактивации
- •14. Механизмы синхронизации. Модификации семафоров
- •15. Механизмы синхронизации. Семафороподобные средства
- •16. Организация и управление подпроцесами в Java
- •17. Решение задачи взаимного исключения в Java
- •18. Событийные переменные в java.
- •19. Семафоры в java.
- •20. Организация подзадач в Win
- •21. Организация подзадач в Win32. Класс tThread
- •22. Механизмы синхронизации Win32. Мьютексы
- •23. Механизмы синхронизации Win32. События
- •24. Механизмы синхронизации Win32. Семафоры
- •25. Монитороподобные средства синхронизации. Критическая область.
- •26. Критическая область. Основные модификации
- •27. Мониторы Хоара
- •28. Распределенное программирование. Основные понятия
- •Каналы и передача сообщений
- •Распределенное программирование. Фильтры и сети
- •Распределенное программирование. Схемы взаимодействия
- •Распределенное программирование. Сети и сокеты.
15. Механизмы синхронизации. Семафороподобные средства
В качестве примеров реализации семафорных механизмов рассмотрим специализированные команды на примере архитектуры Windows.
Семафор в данном случае ячейка памяти, обозначенная специальным тегом.
Закрыть — выполняется традиционно
открыть — реализует 2 варианта решения задачи реактивации (освобождаются все процессы и они обратно должны выполниться)
пропустить — работает аналогично операции открыть, но семафор не открывается.
Жужжать — процесс реализует активное ожидание для указанного семафора.
Отксем — открытие семафора без обработки очереди.
16. Организация и управление подпроцесами в Java
Программный поток предоставляет некоторую задачу или операцию, поэтому необходимы средства для её выполнения. В языке java существует интерфейс Runnable, содержащий метод run в котором и выполняются все действия. Обычно он содержит некоторый цикл, выполняющийся до выполнения какого-то условия. При реализации данного интерфейса поток, после окончания действий не может вернуть какое-либо значение. Если необходимо, что бы поток возвращал значение — нужно реализовать интерфейс Callable, который вместо метода run содержит метод call. Данный интерфейс параметризирован и после выполнения вернет значения указанного типа. Однако просто реализовав интерфейс выполнения потока не добьешься, поэтому традиционным способом преобразования интерфейса в задачу заключается в передаче его конструктору класса Thread и вызов метода start для потока. Так же можно упомянуть о том, что метод main() выполняется в отдельном потоке. Если создаваемый поток не должен выполнять каких-либо слажных операций — можно просто наследовать от класса Thread. Java так же предоставляет возможность создания потоков-демонов. Демоном называется поток, предоставляющий некоторый сервис, работая в фоновом режиме во время выполнения программы, но при этом не является её неотъемлемой частью. Таким образом при завершении всех основных потоков выполнение программы завершается независимо от тог, завершил ли демон свою работу. Все потоки, порождаемые потоками-демонами так же будут демонами.
Java предоставляет некоторые методы, управляющие выполнением потоков, например метод yield — явное освобождение процессора потоком, для передачи управления другому потоку, однако нет никакой гарантии, что другой поток будет выполняться в это время. Фактически вызов данного метода означает лишь, что очередная важная часть цикла была выполнена и теперь можно на время переключиться на другую задачу.
Другим способом управления вашими потоками является вызов метода sleep(), который переводит поток в состояние ожидания на заданное количество времени. (благодаря включению этого метода в класс TimeUnit его использование стало более удобно, так как можно указывать время не только в милисекундах). Данный метод может выбрасывать исключение InterruptedException.
Потокам можно назначить приоритет. Приоритет передает планировщику информацию об относительной важности потока. Хотя порядок обращения процессора к существующему набору потоков не детерминирован, если существует несколько приостановленных потоков, одновременно ожидающих запуска, планировщик сначала запустит поток с большим приоритетом. Использование приоритетов не означает, что поток с младшим приоритетом не будет выполняться вовсе, он лишь будет выполняться чуть реже. Использование приоритетов не слишком хорошо согласуется с большинством ОС, тк пакет JDK имеет 10 уровней приоритетов, в то время как планировщик Windows имеет 7, поэтому во время использования нестандартных приоритетов лучше использовать только универсальные константы класса Thread.