Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС 2.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
110.72 Кб
Скачать

Строгое чередование

while(TRUE) { while (turn != 0) critical_region(); turn=l; noncritical _region(); }

while(TRUE) { while (turn != 0) critical_region(); turn=0; noncritical _region(); }

  1. целая переменная turn, изначально равная 0, отслеживает, чья очередь входить в критическую область.

  2. Вначале процесс 0 проверяет значение turn, считывает 0 и входит в критическую область(*см. примечание ниже)

  3. Процесс 1 также считывает значение turn, считывает 0 и после этого входит в цикл, непрерывно проверяя, когда значение turn будет равно 1.

Постоянная проверка значения переменной в ожидании некоторого значения называется активным ожиданием. Данный способ является бесцельной тратой времени процессора. Активное ожидание используется только в случае, когда есть уверенность в небольшом времени ожидания.

  1. Что такое примитивы взаимодействия процессов, и для чего они применяются? в чем заключается проблема переполненного буфера?

Вводится понятия двух примитивов. Sleep - системный запрос, в результате которого вызывающий процесс блокируется, пока его не запустит другой процесс. Wakeup - системный запрос, в результате которого блокированный процесс будет запущен.

Основное преимущество - это отсутствие активного ожидания. Проблема заключается в следующем, если спулер пуст, то wakeup срабатывает в пустую.

Проблема переполненного буфера (проблема производителя и потребителя)

Рассмотрим два процесса, которые совместно используют буфер ограниченного размера, один процесс пишет в буфер, другой считывает данные.

Чтобы первый процесс не писал, когда буфер полный, а второй не считывал, когда он пуст, вводится переменная count ля подсчета количества элементов в буфере.

Проблема переполненного буфера

В этой ситуации оба процесса могут попасть в состояние ожидания, если пропадет сигнал активации.

Алгоритм такой ситуации:

  1. Процесс В, считал count=0 (заблокироваться он еще не успел)

  2. Планировщик передал управление процессу А

  3. Процесс А, выполнил все вплоть до wakeup, пытаясь разблокировать процесс В (но он не заблокирован, wakeup срабатывает впустую)

  4. Планировщик передал управление процессу В

  5. И он заблокировался, и больше сигнала на разблокировку не получит

  6. Процесс А в конце концов заполнит буфер и заблокируется, но сигнала на разблокировку не получит.

  1. Что такое семафор? Для чего применяются операции up и down?

Концепция семафоров. Семафор представляет собой целую переменную, доступ любого процесса к которой, за исключением момента ее инициализации, может осуществляться только через две атомарные операции: P (от датского слова proberen – проверять) и V (от verhogen – увеличивать). Классическое определение этих операций выглядит следующим образом:

P(S): пока S == 0 процесс блокируется;

S = S – 1;

V(S): S = S + 1;

при выполнении операции P над семафором S сначала проверяется его значение. Если оно больше 0, то из S вычитается 1. Если оно меньше или равно 0, то процесс блокируется до тех пор, пока S не станет больше 0, после чего из S вычитается 1. При выполнении операции V над семафором S к его значению просто прибавляется 1. В момент создания семафор может быть инициализирован любым неотрицательным значением.

переменная располагается внутри адресного пространства ядра операционной системы. Операционная система обеспечивает атомарность операций P и V. Если при выполнении операции P заблокированными оказались несколько процессов, то порядок их разблокирования может быть произвольным, например, FIFO.