Задать вопрос
Ninjacoder
@Ninjacoder
Познающий

Где хранятся переменные к которым обращаются процессы прежде чем войти в критическую секцию?

У меня сегодня довольно сумбурный вопрос, господа.

Нахожусь в процессе чтения Таненбаума "Современные ОС", в разделе "Взаимодействие процессов" автор рассуждает о метода достижениях взаимного исключения процессов (запрет прерываний, блокирующие переменные, строгое чередование). Если с идеей запрета прерываний все более менее понятно, то с использование переменных начинается путаница.

Выдержка из книги:
В качестве второй попытки рассмотрим программное решение, в котором используется
одна общая (блокирующая) переменная, исходное значение которой равно нулю. Когда
процессу требуется войти в свою критическую область, сначала он проверяет значение
блокирующей переменной. Если оно равно 0, процесс устанавливает его в 1 и входит
в критическую область. Если значение уже равно 1, процесс просто ждет, пока оно не
станет равно нулю. Таким образом, нулевое значение показывает, что ни один из про-
цессов не находится в своей критической области, а единица — что какой-то процесс
находится в своей критической области.


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

Как пишет автор: Если процесс 1 хочет работать в критической секции, то он считывает значение переменной X на предмет 0 или 1. И на основании этого входит в свою критическую область, допустим X=0, тогда процесс 1 устанавливает X=1 и начинает свою работу.

А как процессу 2, считать значение переменной X первого процесса? Откуда он её должен считывать? Если я правильно понимаю, ОС защищает память процесса от вторжения других процессов. Получается процесс 2 не может считать чужое адресное пространство процесса 1.

Заранее благодарю, коллеги
  • Вопрос задан
  • 446 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
Olej
@Olej
инженер, программист, преподаватель
Нахожусь в процессе чтения Таненбаума "Современные ОС",

Не читайте эту книгу Э.Таненбаума.

автор рассуждает о метода достижениях взаимного исключения процессов

Всё, что касается синхронизации, рассматривайте только в POSIX (Linux), не в Windows (до тех пор, пока вы будете взаимодействия рассматривать в рамках ограничений Windows, вы так и будете оставаться инвалидом).

Можете смотреть здесь: QNX/UNIX: анатомия параллелизма

Откуда он её должен считывать?

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

Если у процессов разобщенные адресные пространства, о чем мы неизменно упоминали, то как они
будут совместно использовать переменную turn в алгоритме Петерсона, или семафоры, или общий буфер?
На этот вопрос есть два ответа. Во-первых, некоторые общие структуры данных, на-
пример семафоры, могут храниться в ядре и быть доступны только через системные
вызовы. Такой подход позволяет устранить проблему. Во-вторых, большинство со-
временных операционных систем (включая UNIX и Windows) предлагают процессам
способ, позволяющий использовать некоторую часть их адресного пространства со-
вместно с другими процессами. В этом случае допускается совместное использование
буферов
и других структур данных. В худшем случае, когда нет доступа ни к чему
другому, можно воспользоваться общим файлом.


Еще раз спасибо всем ответившим
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Ниже речь о винде.
Немного терминологии: CriticalSection - объект, который можно использовать только внутри одного процесса. Mutex - именованный объект и может применяться для взаимодействия процессов.

Далее, для работы с секцией и с Mutex'ом существуют специальные API, которые скрывают детали реализации, так что проблемы доступа в чужой процесс нет. Секция же точно может храниться в памяти своего процесса: на стеке или в "обычном" адресном пространстве.
Ответ написан
Комментировать
rutaka_n
@rutaka_n
softwere engineer
Как вариант между процессами может быть разделяемая память. Там речь идет о простой ситуации.

Если говорить о коком-то сложном ресурсе, то им управляет ОС или соответствующий драйвер и процесс спрашивает возможность получения ресурса у него через API или системный вызов.

Надеюсь я правильно понял вопрос и смог на него ответить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы