|
они не
содержат подпрограммы своей библиотеки, которые остались на диске
в другом файле. Последовательность событий, происходящих при вы-
полнении программ неполного времени работы RTL, показана в
блок-схеме 3-1.
____________________
| Загрузка |
| заголовков |
|____________________|
|
.--------------->|<---------------------------.
| __________V_________ |
| | | |
| | Прием запроса | |
| |____________________| |
| | |
| | |
| / \ |
| /Ко-\ |
| /манда\ __________|__________
| /освобо-\ ДА | Освобождение распре-|
| | ждения |----------->| деленной памяти |
| \памяти / |_____________________|
| \RTL ?/
| \ /
| \ /
| НЕТ |
| V
| / \
| / \
| / \ ____________________
| / RTL \ НЕТ |Распределение памяти|
| |установ- |------------>| для загрузки RTL |
| \ лена ?/ |____________________|
| \ / |
| \ / |
| \ / |
| | |
| ДА |<----------------------------
| __________V_________
| | |
-----| Функция выполнения |
|____________________|
Блок-схема 3-1. Последовательность загрузки RTL с неполным
временем работы
Когда одна из подпрограмм библиотеки доступна (через прерыва-
ние), то часть заголовков подпрограмм загружает файл библиотеки в
память, используя функцию 4Bh (AL=3) "Загрузить оверлей" и "запи-
рает" его в своей собственной памяти. Затем вызывается требуемая
подпрограмма библиотеки для выполнения запрашиваемой функции. Ли-
бо часть заголовков, либо конкретные подпрограммы библиотеки мо-
гут содержать инструкцию IRET для возврата в вызывающую програм-
му. С этого момента библиотеке доступен вызов всей последователь-
ности без ожидания времени на загрузку, поскольку RTL осталась
резидентной в памяти.
Когда главная программа завершается или требует пространство
памяти RTL, она передает в точку входа RTL код для освобождения
памяти, распределенной для RTL. Поскольку часть заголовков знает
адрес загрузки подпрограмм библиотеки после их загрузки, и пос-
- 3-57 -
кольку их блоком памяти владеет часть заголовков, освобождение
памяти не вызывает проблем. После этого выполняется перевод части
заголовков обратно в положение "спячки" для ожидания последующего
вызова.
Переключение контекста и переключение стека
В связи с тем, что большинство тем, обсужденных в этой главе,
относятся к операциям между отдельными программами с отдельными
стеками, процесс переключения заслуживает некоторого внимания.
Переключение стека, или переход от одного стека к другому являет-
ся частью большой темы, называемой переключением контекста
(context switching).
Если отобразить сегменты, в которых выполняется программа,
как ее контекст, то можно увидеть, что при многих обстоятельствах
бывает необходимо изменять полный контекст программы. Примерами
этого могут служить вызовы резидентных подпрограмм, вызывающих
библиотеки RTL и использующие некоторые типы оверлеев или сопрог-
рамм. (Сопрограмма является структурной единицей программы, кото-
рая используется для описания логически параллельных действий и
вызывается подобно подпрограмме.
|