Связывание подпрограмм

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

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

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

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

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

Какой бы метод ни использовался для передачи параметров, для всех, кроме самых простых подпрограмм, необходимо запоминать их состояние при вызове другой подпрограмм и восстанавливать его при возврате. Информация о состоянии программы включает: (1) содержимое ее регистров; 2) ее счетчик команд, биты условий, запрос к таймеру и состояние прерывания; (3) ее области оперативной памяти, и если используется сегментация или страничная организация, соответствующие таблицы и внешняя память; (4) логически связанная с ней память операционной системы, такая как элементы в очередях работ и процессов; (5) невыполненные запросы на ввод/вывод и положение нециклических устройств ввода/вывода и носителей.

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

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

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

Далее...

   Обложка   Учебник   Экзамен   Глоссарий   Информация 
Hosted by uCoz