Программные модули, процессы, задачи


1. Обмен и сцепление программ
При недостатке адресного пространства для размещения большой программы возможны следующие действия:
• программа разбивается на несколько участков, каждый из которых – относительно-независимый программный код. Сначала в память загружается главный участок кода, задача которого – обеспечить управление остальными участками кода. Затем происходит обмен или сцепление.
Обмен – каждая подпрограмма вызывает другую как некоторую функцию. После окончания работы вызванной программы, управление передается вызвавшей программе.
Алгоритм обмена
• текущая программа записывается на диск
• загружается следующая, выполняет свои действия и возвращает управление предыдущей
Ограничение- объем диска(пространство диска). Обмен данными происходит через сегмент данных (ОЗУ)
Сцепление – каждая программа записывается в виде последовательных процессов. Каждый процесс используется один раз и записывается на место предыдущего. Реализуется при помощи командного языка. Взаимодействие процессов осуществляется через промежуточные файлы.
Частным случаем механизма обмена данными является оверлейная программа. Она делится на несколько сегментов, один из которых постоянно находится в памяти и называется корневым сегментом. В нем находятся функции, которые не могут быть вынесены в оверлейную часть, а также функции управления загрузкой других оверлейных сегментов. При создании оверлейной программы линковщик создает дерево межоверлейных вызовов. Каждый узел дерева – ссылка на номер оверлейного модуля и точку входа. Для повышения эффективности оверлейной программы, необходимо минимизировать межоверлейные вызовы и обеспечить, чтобы размер загружаемых и выгружаемых модулей был более менее одинаковым.

Динамически подключаемые библиотеки -DLL(Dynamic Link Library)
DLL – некоторый набор функций, которые являются автономными. В момент своей загрузки, с точки зрения прикладной программы, представляют собой дополнительный участок кода. Использует для своей работы стек и данные прикладной программы(не имеет собственного адресного пространства)
Для использования DLL ее необходимо спроецировать на адресное пространство процессора – неявная компоновка при загрузке.
При сборке приложения, к нему присоединяется список используемых DLL. При загрузке приложение ОС производит поиск указанных DLL, если библиотека не найдена, то процесс завершается. При использовании этого метода DLL остаются подключенными до конца сеанса приложения
Явная компоновка. Производится вызовом:
HINSTANCE LoadLibrary(
LPCSTR LibraryName); // имя библиотеки
HINSTANCE LoadLibraryEx(
LPCSTR LibraryName,
HANDLE hFile,
DOWRD Flags);
Flags – 0 –аналогия LoadLibrary
— DONT_RESOLVE_DLL_REFRENCES – исключение загрузки других DLL, которые используются данной DLL.
— LOAD_LIBRARY_AS_DATAFILE – загрузить DLL не обращаясь к функции DLL Main, если динамическая библиотека содержит только ресурсы
— LOAD_WITH_ALTERED_SEARCH_PATH – осуществляет поиск DLL в реестре.
Возвращает в случае успешной загрузки адрес спроецированной библиотеки или NULL в противном случае.
Отключение DLL:
BOOL FreeLibrary(HINSTANCE hLib)
В каждой DLL может существовать функция DLLMain.
BOOL DLLMain(HINSTANCE hInstDLL , //описатель экземпляра DLL
DWORD folwReason, // причина вызова
LPVOID lmpLoad)// не используется
{ switch (folwReason)
{ case DLL_PROCESS_ATTACH:…… break;
// когда DLL подключается к новому процессу имеет смысл возвратить значение
case DLL_THREAD_ATTACH:…… break;
//когда DLL используется новым потоком
case DLL_THREAD_DETACH:…… break;
//когда DLL отключается от потока
case DLL_PROCESS_DETACH:…… break;
//когда DLL отключается от процесса.
}
returt TRUE;
}
C флагом DLL_PROCESS_DETACH DLLMain вызывается всегда.

Загрузка...