- •2. Операционная система как расширенная машина
- •3. Операционная система как менеджер ресурсов
- •4. Обзор современных ос Операционные системы мэйнфреймов
- •Серверные операционные системы
- •Операционные системы для персональных компьютеров
- •Операционные системы реального времени
- •Встроенные операционные системы
- •Операционные системы для смарт-карт
- •5. Аппаратный состав персонального компьютера
- •6. Процессоры
- •7. Память
- •8. Устройства ввода-вывода
- •9. Шины
- •10. Понятия операционной системы
- •11. Процессы
- •12. Взаимоболокировка
- •13. Управление памятью.
- •14. Ввод-вывод данных
- •15. Файлы
- •16 Безопасность
- •17 . Оболочка.
- •18. Системный вызов
- •19. Windows Win32 api
- •20. Структура операционной системы
- •21 Монолитные системы
- •22 Многоуровневые системы
- •23. Виртуальные машины.
- •24. Экзоядро.
- •25. Модель клиент-сервис.
- •26. Модель процесса.
- •27 Создание процесса
- •28 Завершение процесса
- •29. Иерархия процессов
- •30. Состояние процессов
- •31. Реализация процессов
- •32. Потоки
- •33. Модель потока.
- •34. Использование потоков.
- •35. Реализация потоков в пространстве пользователя.
- •36. Реализация потоков в пространстве ядра.
- •37 Смешанная реализация
- •38 Активация планировщика
- •39 Всплывающие потоки
- •40 Состояние состязания
- •41. Критические области
- •42. Взаимное исключение с активным ожиданием
- •43. Примитивы межпроцессного взаимодействия
- •Проблема производителя и потребителя
- •44. Семафоры
- •45 Мьютексы
- •46 Монитор
- •47 .Передача сообщений
- •48. Барьеры
- •49. Сокеты
- •50. Планирование
- •52. Планирование в интерактивных системах
- •53. Планирование в системах реального времени
- •54.Политика и мезанизм.
- •57 Условие взаимоблокировки
- •58 Моделирование взаимоблокировок
- •59. Страусовский алгоритм
- •60. Обнаружение и устранение взаимоблокировок и обнаружение взаимоблокировки при наличии одного ресурса каждого типа
- •61. Обнаружение взаимоблокировок при наличии нескольких ресурсов каждого типа
- •1)Восстановление при помощи принудительной выгрузки ресурса
- •2) Восстановление путем уничтожения процессов
- •63. Избежание взаимоблокировок
- •64 Алгоритм банкира
- •65 Алгоритм банкира для несколько видов ресурсов
- •66. Предотвращение взаимоблокировок
- •67 Двухфазовое блокирование, тупики без ресурсов и голодание
- •68 Программный ввод-вывод
- •69: Управляемый прерываниями ввод-вывод
- •70: Ввод-вывод с использованием dma(Direct Memory Access).
- •71. Программные уровни ввода-вывода
- •72. Обработчики прерываний
- •73. Драйверы устройств
- •74. Аппаратная часть таймеров
- •75 Программное обеспечение таймеров
- •76 Мягкие таймеры
- •77. Транслятор
- •78. Компилятор
- •79 Понятие прохода. Многопроходный и однопроходные компиляторы
- •80 Интерпретаторы. Особенности построения интерпретаторов
- •81. Трансляторы с языка ассемблера („ассемблеры“ )
- •82.Макроопределения и макрокоманды
- •83. Отладчики
- •84. Компоновщик. Его назначение и функции
45 Мьютексы
Метода Сергеева:
Определение 2.6 Мьютекс - это переменная, которая может находится в одном из двух состояний: блокированном или неблокированном.
Реализация мьютекса проста и эффективна, что делает их использование особенно в случае потоков, действующих только в пространстве пользователя.
Межпроцессорное взаимодействие с применением семафоров выглядит весьма просто, но это кажущаяся простота. Изменим порядок следования двух процедур down в листинге 4 программы производителя. В результате значение mutex уменьшится раньше, чем empty. Если буфер был заполнен, производитель блокируется, установив mutex на ноль. Соответственно, в следующий раз, когда потребитель обратиться к буферу, он выполнит down с переменной, равной нулю, и тоже заблокируется. Вышеизложенная ситуация показывает, с какой аккуратностью нужно обращаться с семафорами. Чтобы упростить написание программ, в 1974 году Хоар и Бринч Хансен предложили примитив синхронизации более высокого уровня, который называется монитором.
Листинг 4. Проблема производителя и потребителя с семафорами
#define N 100 /*Количество сегментов в буфере*/
typedef int semaphore; /*Семафоры --- особый вид целочисленных переменных*/
semaphore mutex = 1; /*Контроль доступа в критическую область*/
semaphore empty = N; /*Число пустых сегментов буфера*/
semaphore full = 0; /*Число полных сегментов буфера*/
void procedur (void)
{
int item;
while (TRUE){ /* TRUE = 1 */
item = produce_item(); /*Сформировать данные, помещаемые в буфер*/
down(&empty); /*Уменьшить счетчик пустых сегментов буфера*/
down(&mutex); /*Вход в критическую область*/
insert_item(item); /*Поместить в буфер новый элемент*/
up(&mutex); /*Выход из критической области*/
up(&full); /*Увеличить счетчик полных сегментов буфера*/
}
}
void consumer(void)
{
int item;
while (TRUE){ /*Повторять вечно*/
down(&full); /*Уменьшить числа пустых сегментов буфера*/
down(&mutex); /*Вход в критическую область*/
item = remove_item(); /*Удалить элемент из буфера*/
up(&mutex); /*Выход из критической области*/
up(&empty); /*Увеличить счетчик пустых сегментов буфера*/
consume_item(item); /*Обработка элемента*/
}
}
Таненбаум:
Иногда, если не нужно применять семафор как счетчик, используется его упрощенный вариант, называемый мьютексом (mutex). Мьютексы способны лишь обеспечивать взаимное исключение для общего ресурса или фрагмента кода. Их реализация отличается простотой и эффективностью, что делает мьютексы исключительно полезными в программных потоках, реализуемых исключительно в пространстве пользователя.
Мьютекс представляет собой переменную, способную находиться в одном из двух состояний: блокированном и разблокированном. Для хранения такой переменной достаточно одного бита, хотя на практике мьютекс имеет целочисленный тип: нулевое значение соответствует разблокированному состоянию, а любое ненулевое — блокированному. Мьютексы управляются двумя процедурами. Когда процессу (или программному потоку) необходимо войти в критическую секцию, он вызывает процедуру mutex_lock. Если мьютекс в этот момент разблокирован (то есть критическая область свободна), вызов завершается успешно и вызывающий поток получает возможность входа в критическую секцию.
Если же мьютекс находится в блокированном состоянии, вызвавший процесс блокируется до тех пор, пока процесс, находящийся в критической секции, не завершит работу с ней и не вызовет процедуру mutex_unlock. В случае блокирования мьютексом нескольких процессов из них случайным образом выбирается один, которому разрешается вход в критическую секцию.