Главная страница
Навигация по странице:

  • TSL RX.LOCK

  • Процессы. Процессы и потоки. Процессы и потоки


    Скачать 0.73 Mb.
    НазваниеПроцессы и потоки
    АнкорПроцессы
    Дата09.03.2023
    Размер0.73 Mb.
    Формат файлаppt
    Имя файлаПроцессы и потоки.ppt
    ТипПрограмма
    #975992
    страница7 из 8
    1   2   3   4   5   6   7   8

    Алгоритм Петерсона




    Команда TSL





    Рассмотрим решение, требующее участия аппаратного обеспечения. Многие компьютеры, особенно разработанные с расчетом на несколько процессоров, имеют команду
    TSL RX.LOCK (Test and Set Lock - проверить и заблокировать), которая действует следующим образом.
    В регистр RX считывается содержимое слова памяти lock, а в ячейке памяти lock сохраняется некоторое ненулевое значение. Гарантируется, что операция считывания слова и сохранения неделима - другой процесс не может обратиться к слову в памяти, пока команда не выполнена.

    Команда TSL








    Оба решения - Петерсона и с использованием команды TSL - корректны, но они обладают одним и тем же недостатком: использованием активного ожидания.
    В сущности, оба они реализуют следующий алгоритм: перед входом в критическую область процесс проверяет, можно ли это сделать. Если нельзя, процесс входит в тугой цикл, ожидая возможности войти в критическую область.

    Примитивы межпроцессного взаимодействия. Пример.





    Этот алгоритм не только бесцельно расходует время процессора, но, кроме этого, он может иметь некоторые неожиданные последствия.
    Рассмотрим два процесса: H, с высоким приоритетом, и L, с низким приоритетом. Правила планирования в этом случае таковы, что процесс H запускается немедленно, как только он оказывается в состоянии ожидания. В какой-то момент, когда процесс L находится в критической области, процесс H оказывается в состоянии ожидания. Процесс H попадает в состояние активного ожидания, но поскольку процессу L во время работающего процесса H никогда не будет предоставлено процессорное время, у процесса L не будет возможности выйти из критической области, и процесс H навсегда останется в цикле. Эту ситуацию иногда называют проблемой инверсии приоритета.





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

    Семафоры





    В 1965 году Дейкстра (Е. W. Dijkstra) предложил использовать целую переменную для подсчета сигналов запуска, сохраненных на будущее.
    Им был предложен новый тип переменных, так называемые семафоры, значение которых может быть нулем (в случае отсутствия сохраненных сигналов активизации) или некоторым положительным числом, соответствующим количеству отложенных активизирующих сигналов.

    Семафоры. Операции: down и up.





    Операция down сравнивает значение семафора с нулем.
    Если значение семафора больше нуля, операция down уменьшает его и просто возвращает управление. Если значение семафора равно нулю, процедура down не возвращает управление процессу, а процесс переводится в состояние ожидания.
    Все операции проверки значения семафора, его изменения и перевода процесса в состояние ожидания выполняются как единое и неделимое элементарное действие. Тем самым гарантируется, что после начала операции ни один процесс не получит доступа к семафору до окончания или блокирования операции.

    Мьютексы





    Иногда используется упрощенная версия семафора, называемая мьютексом (mutex, сокращение от mutual exclusion - взаимное исключение).
    Мьютекс не способен считать, он может лишь управлять взаимным исключением доступа к совместно используемым ресурсам или кодам.
    Реализация мьютекса проста и эффективна, что делает использование мьютексов особенно полезным в случае потоков, действующих только в пространстве пользователя.

    Мьютексы





    Мьютекс - переменная, которая может находиться в одном из двух состояний: блокированном или неблокированном.
    Для описания мьютекса требуется всего один бит, хотя чаще используется целая переменная, у которой 0 означает неблокированное состояние, а все остальные значения соответствуют блокированному состоянию.
    Значение мьютекса устанавливается двумя процедурами. Если поток собирается войти в критическую область, он вызывает процедуру mutex_lock. Если мьютекс не заблокирован, запрос выполняется и вызывающий поток может попасть в критическую область.

    1   2   3   4   5   6   7   8


    написать администратору сайта