1.7. Динамическая организация программ

Изначально, проблема, которая решается такими программами – это проблема выполнения программ в ограниченной физической памяти. Однако, позже выяснилось, что динамическая организация программ позволяет достичь других результатов: открытость систем. Это свойство важно для обеспечения развития и модификации сложных программ.

Программист, создавая динамические программы, указывает, что модуль, на который он ссылается, подключается динамически. Динамическое подключение осуществляется командой LINK <имя модуля> [параметры ], которая помещает вызываемый модуль в ОП. В отличии от оверлейных программ, программа не собирается полностью (т.е. она редактируется, но не собирается).

В прошлом динамическая и статическая форма вызова была разной.

CALL< имя модуля >< параметры > - ДУ с возвратом

LINK< имя модуля >< параметры > - ПУ с возвратом

Программист может часть модулей вызывать с помощью функции CALL, а часть подключать динамически (LINK).

В некоторых системах программирования вызовы могут иметь одинаковую форму. Программисту дается возможность указать, какие из вызовов обрабатываются статически, а какие следует подключать динамически. Появляются библиотечные модули (динамически подключаемые библиотеки - DLL).

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

Функции LINK

  1. прерывание к ОС

  2. сохранение состояния программы и перевод в состояние ожидания

  3. загрузка компонент

  4. выполнение модуля

  5. отключение

1.7.1. Загрузка модуля

Это функция возлагается на ОС. В качестве параметра передается имя модуля.

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

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

а) из общей системной библиотеки динамического подключения

б) пользовательские библиотеки

в) поиск модуля в ОП.

  1. Затем необходимо загрузить модуль в память, что требует сначала выделения этой памяти (GETMEM).

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

  3. Когда модуль выполнен, память которую он занимал надо объявить свободной (FREEMEM), тем самым предоставив ее для дальнейшего использования

1.7.2. Выделение памяти под загружаемый модуль

Существует два подхода:

  1. исполняемая программа сама выбирает область, в которую модуль будет загружен

  2. область памяти выделяется не внутри адресного пространства программы, как для другой программы при мультизадачном режиме работы.

В первом случае программист должен резервировать память. Это дает контроль над использованием памяти и обеспечивает защиту.

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

Режим совместного использования одной копии модуля разными процессами - высокоэффективный режим.

Чтобы модуль мог обслуживать многие программы, он должен быть реентерабельным.