Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
os8.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
122 Кб
Скачать
☆

8.5.3. Механизмы динамического связывания

Представленное описание поверхностное, на самом деле все гораздо сложнее. При этом акцент делается не столько на загрузку по запросу во время выполнения, сколько на разделение процедур и данных несколькими процессами.

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

По этой причине часто разделяется единственная копия ресурса в основной памяти.

Вопросы разделения данных мы с вами подробно рассматривали в разделе “Параллельное выполнение программ”. Критические секции – это и есть решение проблемы разделения данных.

Здесь рассмотрим вопросы разделения процедур.

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

В современной практике модификация команд не является хорошим стилем. Этому существуют две причины:

  1. Логика программы становится чрезвычайно запутанной

  2. Самоизменения не дают возможности разделять программу.

По этим причинам желательно устранить операции запоминания в пределах областей программы.

Вопрос (

Появился термин “чистые процедуры”.

  1. Чистые процедуры не модифицируют свои собственные команды и локальные данные.

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

  3. Чистые процедуры могут разделяться более чем одним процессом.

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

)Вопрос

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

Пример.

Пусть ARG – символическое имя ячейки, содержащей некоторую переменную. [ARG] означает содержимое ARG.

Чтобы запомнить содержимое регистра Ri в ARG, можно использовать команду:

STO Ri, ARG; [ARG] := [Ri];

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

Выходом из положения будет вариант, при котором ARG является смещением внутри собственной области любого процесса. А базовый адрес этой области хранится в регистре Rb. При переходе от процесса к процессу базовый регистр перегружается, а смещение остается неизменным.

Правильная команда будет выглядеть так:

STO Ri, ARG(Rb); [[Rb] + ARG] := [Ri];

Таким образом, регистры процессора, которые запоминаются как часть вектора состояния процесса, обеспечивают простые средства связывания чистых процедур с данными.

Развитием использования базового регистра является понятие секции связи. Каждая разделяемая процедура содержит:

  1. код - чистую программу

  2. секцию связи.

Схема взаимодействия процедуры с процессами через секции связи

Вопрос (

Секция связи представляет собой таблицу со строками, соответствующими передаваемым параметрам чистой процедуры.

Чистая процедура для доступа к передаваемым параметрам работает со смещениями секции связи.

Каждый процесс формирует собственную копию секции связи и передает в нее параметры, когда обращается к процедуре.

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

)Вопрос

15

Раздел 8

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]