Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Контрольная работа Никитина Дарья ПИН 31Д

.docx
Скачиваний:
7
Добавлен:
16.07.2021
Размер:
285.05 Кб
Скачать

Контрольная работа

Вариант 1

никитина дарья пин 31д

Задания

Решение

Задание 1.

Для систем разделяемого времени наиболее важной характеристикой является общение с пользователем. Пользователь может в любой момент времени запустить неопределенное количество приложений, и иметь возможность со всеми из них работать. Поэтому самым важным критерием эффективности для таких систем является реактивность системы, время отклика на действия пользователя.

Задание 2.

Процесс может находится в следующих состояниях: активен, блокирован, готовый, завершающийся, новый. Процесс является блокированным, если он ждет наступления какого-либо события, например, операции ввода-вывода. Из состояния «блокированный» он может перейти только в «состояние готов к выполнению», ни в какие другие состояния он перейти напрямую не может.

Задание 3.

STCF – это невытесняющий алгоритм планирования, при котором планировщик выбирает первой самую короткую задачу.

  1. Первым выполнится процесс А, так как в момент времени 0, он единственный. Выполняться будет в течение 5 тактов.

  2. Далее выполнится процесс с наименьшим временем работы, то есть D. Выполняться будет в течение 2 тактов. Значит, в системе он будет в течение: 5+2-3=4 такта.

  3. Следующим процессом с наименьшим временем работы будет В. Выполняться он будет в течение 3 тактов. Значит, в системе он будет в течение: 5+2+3-1=9 тактов.

  4. Последним будет выполнен процесс С. Выполняться он будет в течение 6 тактов. Значит, в системе он будет в течение: 5+2+3+6-2=14 тактов.

  5. Все процессы выполнятся за 14 тактов, всего их 4, значит среднее время выполнения 14 / 4 = 3.5

Задание 4.

(б) STCF – по наименьшему времени выполнения

Задание 5.

Это решение в принципе является неверным, т.к. производитель захватывает один мьютекс - P(full), а освобождает совсем другой - V(empty). Потребитель аналогично.

Задание 6.

(а) одновременный вход в КС

Задание 7.

Инверсия приоритета происходит тогда, когда два или несколько потоков с различными приоритетами находятся в споре, который из них должен быть обслужен процессором. Рассмотрим простой случай с тремя потоками: поток 1, поток 2 и поток 3. Поток 1 - высокоприоритетный и становится готовым быть допущенным к процессору для исполнения кода. Поток 2, поток с низким приоритетом, выполняет код в критической секции программы. Поток 1, высокоприоритетный поток, начинает ожидать совместно используемый ресурс от потока 2. Поток 3 имеет средний приоритет. Поток 3 получает все процессорное время, потому что высокоприоритетный поток (поток 1) ожидает совместно используемые ресурсы от потока с низким приоритетом (поток 2). Поток 2 не оставит критическую секцию программы, потому что не имеет самого высокого приоритета и не будет допущен к процессору для исполнения кода.

Эта проблема решается повышением приоритета потока 2, который захватил мьютекс. Или пониженим потока ожидающего вход в критическую секцию.

Задание 8.

В данный момент времени используется 3+5+1=9 единиц ресурса X и 2+6+2+5=15 единиц ресурса Y. Если мы выделим процессу P2 по единице свободных ресурсов, то не останется свободных ресурсов X, и никто из процессов не сможет завершить свою работу. Иными словами, система перейдет не в безопасное состояние, значит выделить процессу P2 единицу ресурса X по алгоритму банкира нельзя.

Задание 9.

Тут возникает следующая проблема. Строка s1->lock.Acquire(); включает блокировку на стек, а освобождение этого стека происходит только если срабатывают оба условия. Аналогично со вторым стеком, происходит его блокировка, а освобождение только по условию. В итоге, если хоть одно из этих условий не выполнится, то стеки останутся заблокированными для следующей работы с ними.

Задание 10.

Void AtomicSwap(Stack *s1, Stack *s2) {

  Int v1, v2, rez;

  s1->lock.Acquire();

  rez=s1->Pop(&v1);

  if (rez==OK) {

       s2->lock.Acquire();

       rez=s2->Pop(&v2);

       if (rez==OK) {

              s2->Push(v1);

              s1->Push(v2);

        }

s2->lock.Release();

  }

s1->lock.Release();

}