ТЕОРЕТИЧЕСКОЕ ОПИСАНИЕ
При многозадачной работе часто возникает необходимость производить обмен данными между взаимодействующими задачами. Один из механизмов реализации такого взаимодействия заключается в совместном использовании динамически распределяемых областей памяти (далее просто динамической памяти). Такое использование предполагает наличие средств управления этой памятью.
Стандартные средства языков программирования (С++, Delphi и др.) предусматривают возможность создания динамических переменных в области динамической памяти. С помощью этих средств возможна работа с такими структурами данных, как списки, деревья и т. п. Однако часто возникают задачи, требующие иного использования динамической памяти, например, загрузка ресурсов, обмен данными между процессами и потоками. Для решения задач такого сорта в составе современных операционных систем имеются средства управления динамической памятью.
В операционной системе Windows эти средства базируются на системе виртуальной памяти, встроенной в ядро ОС. Эта система позволяет приложениям использовать области памяти, размер которых значительно превышает объем реальной (физической) памяти, имеющейся в компьютере. Для создания виртуальной памяти в Windows используется дисковое пространство. Однако для работы приложения часто необходимо располагать сравнительно небольшим объемом динамической памяти. Поэтому в составе Windows предусмотрены функции, предназначенные для создания и управления динамической памятью. Такая память называется пулом.
Адресные пространства в Windows разделены, поэтому в этой ОС нет глобальных пулов памяти. Вместо этого каждому приложению по умолчанию выделяется один стандартный пул памяти в его адресном пространстве. При необходимости приложение может создать (только в своем адресном пространстве!!!) произвольное количество так называемых динамических пулов памяти. Причины, по которым возникает необходимость создания дополнительных динамических пулов памяти, могут быть следующими:
- Защита компонентов;
- Более эффективное управление памятью;
- Локальный доступ.
Защита компонентов заключается в размещении различных динамических в разные пулы памяти. Такое размещение может предотвратить влияние функций доступа к этим структурам на их целостность в случае, например, ошибок в программном обеспечении.
Эффективное управление памятью заключается, например, в выделении внутри динамических пулов объектов одинакового размера. Пусть, например, имеется некоторая структура данных размером в N1 байт, и другая структура, имеющая размер N2 > N1 байт. Пусть память для объектов структур указанного типа выделяется в одном динамическом пуле, и в результате работы программы весь динамический пул будет занят. Если в дальнейшем два объекта размером N1 и N2 соответственно будут удалены, то попытка вновь создать два объекта размером N2 вызовет ошибку, хотя свободное место в динамической памяти, вообще говоря, имеется. Выход заключается в размещении объектов различного размера в различных динамических пулах.
Локальный доступ заключается в том, что объекты, к которым необходим частый доступ, целесообразно размещать как можно плотнее друг к другу. Это, возможно, позволит разместить их в пределах одной виртуальной страницы, что, в свою очередь, не приведет к подкачке - откачке различных виртуальных страниц.
Стандартный пул доступен для функций типа malloc, free, GetMem, FreeMem и пр. Для работы с дополнительными пулами памяти их использование невозможно. Изучаемые в данной лабораторной работе функции позволяют организовать работу, как со стандартным, так и с дополнительными пулами.
ОПИСАНИЕ ЛАБОРАТОРНОЙ РАБОТЫ