
- •Понятия «процесс» и «поток». Создание процессов и потоков. Состояния потока
- •Вытесняющие и невытесняющие алгоритмы планирования
- •Алгоритмы планирования, основанные на квантовании
- •Алгоритмы планирования, основанные на приоритетах
- •Системные вызовы
- •Цели и средства синхронизации. Необходимость синхронизации и гонки
- •Критическая секция
- •Блокирующие переменные
- •Семафоры
- •Функции ос по управлению памятью
- •Типы адресов
- •Алгоритмы распределения памяти
- •Распределение памяти с фиксированными разделами
- •Распределение памяти с динамическими разделами
- •Свопинг и виртуальная память
- •Страничное распределение
- •Сегментное распределение
- •Сегментно-страничное распределение
- •Иерархия запоминающих устройств
- •Задачи ос по управлению файлами и устройствами
- •Многослойная модель подсистемы ввода-вывода
- •Многоуровневые драйверы
- •Цели и задачи файловой системы
- •Файловая система unix. Общая структура. Монтирование фс.
- •Имена файлов. Атрибуты файлов.
- •Структура магнитного дискового накопителя. Блоки (кластеры).
- •Безопасность ос. Основные виды угроз и аспекты безопасности ос. Принцип адекватности защиты.
- •Безопасность ос. Понятие сервисов и механизмов защиты ос. Сервисы идентификации и автентификации пользователей. Маркер доступа
- •Понятия «процесс» и «поток». Создание процессов и потоков. Состояния потока
Блокирующие переменные
Для синхронизации потоков, программист может использовать глобальные блокирующие переменные. С этими переменными, к которым все потоки процесса имеют прямой доступ, программист работает, не обращаясь к системным вызовам.
Каждому набору критических данных, ставится в соответствие двоичная переменная, которой поток присваивает значение 0, когда он входит в критическую секцию и значение 1, когда он ее покидает. Блокирующие переменные могут использоваться не только при доступе к данным, но и к разделяемым ресурсам любого вида. При блокирующих переменных имеется ограничение на прерывания: нельзя прерывать поток выполнением операции проверки и установлением блокирующей переменной.
Реализация взаимного исключения ,способом блокирующих переменных, имеет существенный недостаток, а именно в течении времени, когда один поток находится в критической секции, другой поток, которому требуется этот же ресурс получив доступ к процессору, будет непрерывно опрашивать блокирующую переменную, бесполезно тратя свой квант времени.
Семафоры
Обобщение для блокирующие переменных, в которых вместо двоичных, используются переменные, которые могут принимать целые, не отрицательные значения. Для работы с семафорами вводится два примитива P и V, переменная S представляет собой семафор. Тогда действие V(S) и P(S) будут определены следующим образом:
V(S) переменная S увеличивается на единицу единым действием. Выборка наращивания и запоминания не могут быть прерваны.
P(S) уменьшение S на единицу, если это возможно. Если S = 0 и его невозможно уменьшить, оставаясь в области целых не отрицательных чисел, то в этом случае поток, вызывающий операцию P ждет пока уменьшение станет возможным. Успешная проверка и уменьшения является операциями не делимыми.
Рассмотрим классический пример использования семафора взаимодействия двух выполняющихся, в режиме мультипрограммирования, потоков, один из которых пишет данные, а другой их читает. Пусть буферный пункт состоит из N буферов, каждый из которых может содержать одну запись. В общем случае потоки читатели и писатели могут иметь разную скорость. Для правильной совместной работы, поток писатель должен останавливаться, когда все буферы заняты и активизироваться при освобождении хотя бы одного буфера. И наоборот, поток читатель должен приостанавливается, когда все буферы пусты и активизироваться, когда хоть 1 буфер занят.
Введем два семафора:
e – число пустых буферов
f – число заполненных буферов.
Поток писатель, прежде всего, выполняет операцию P(e) (уменьшаем значение). После этого происходит операция V(f) (увеличиваем кол-во записывающих потоков).
Семафор может использоваться также в качестве блокирующей переменной. То есть в примере с читателями/писателями, для того, чтобы исключить коллизии при работе с разделяемой общей областью памяти, будем считать, что запись в буфер и считывание из буфера – критическая секция. Взаимное исключение будем обеспечивать с помощью двоичного семафора b. Оба потока после проверки доступности буфера должны выполнять проверку к доступности критической секции.
Тупики
В зависимости от скорости потоков, они могут взаимно блокировать друг-друга, либо образовывать очереди к разделяемым ресурсам либо же совершенно независимо использовать разделяемые ресурсы.
Для исключения взаимной блокировки (тупика) не обязательно снимать с выполнения все запущенные потоки.
Существуют формальные программно реализованные методы распознавания тупиков, основаны на ведении таблиц распределения ресурсов и таблиц запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки. Зачастую необходимо завершить несколько потоков, для успешного завершения всей задачи.