Windows内存管理(2)--Lookaside结构 和 运行时函数
来源:互联网 发布:遗传算法实例 编辑:程序博客网 时间:2024/04/29 18:27
1. Lookaside结构
频繁的申请和回收内存,会导致在内存上产生大量的内存“空洞”,从而导致最终无法申请内存。DDK为程序员提供了Lookaside结构来解决这个问题。
我们可以将Lookaside对象看成是一个内存容器。在初始化的时候,它先向Windows申请了一块比较大的内存。以后程序员每次申请内存的时候,不是直接向Windows申请内存,而是想Lookaside对象申请内存。Looaside会智能的避免产生内存“空洞”。如果Lookaside对象内部内存不够用时,它会向操作系统申请更多的内存。
Lookaside一般会在以下情况下使用:
1. 程序员每次申请固定大小的内存。
2. 申请和回收的操作十分频繁。
要使用Looaside对象,首先要初始化Lookaside对象,有以下两个函数可以使用:
(1)VOID
ExInitializeNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST Lookaside,
IN PALLOCATE_FUNCTION Allocate OPTIONAL,
IN PFREE_FUNCTION Free OPTIONAL,
IN ULONG Flags,
IN SIZE_T Size,
IN ULONG Tag,
IN USHORT Depth
);
(2)VOID
ExInitializePagedLookasideList(
IN PPAGED_LOOKASIDE_LIST Lookaside,
IN PALLOCATE_FUNCTION Allocate OPTIONAL,
IN PFREE_FUNCTION Free OPTIONAL,
IN ULONG Flags,
IN SIZE_T Size,
IN ULONG Tag,
IN USHORT Depth
);
对Lookaside对象回收内存:
(1)VOID
ExFreeToNPagedLookasideList(
IN PNPAGED_LOOKASIDE_LIST Lookaside,
IN PVOID Entry
);
(2)VOID
ExFreeToPagedLookasideList(
IN PPAGED_LOOKASIDE_LIST Lookaside,
IN PVOID Entry
);
测试代码:
#pragma INITCODE
VOID LookasideTets()
{
KdPrint(("进入LookasideTest函数!\n"));
PAGED_LOOKASIDE_LIST Lookaside;
ExInitializePagedLookasideList(&Lookaside, NULL, NULL, 0, sizeof(MYDATASTRUCT), 'abcd', 0);
PMYDATASTRUCT pMyData[50];
for (int i=0; i<50; i++)
{
pMyData[i] = (PMYDATASTRUCT)ExAllocateFromPagedLookasideList(&Lookaside);
if ((i+1)%10 == 0)
{
KdPrint(("申请了 %d 个数据了!\n", ++i));
}
}
for (int i=0; i<50; i++)
{
ExFreeToPagedLookasideList(&Lookaside, pMyData[i]);
pMyData[i] = NULL;
if ((i+1)%10 == 0)
{
KdPrint(("释放了 %d 个数据的内存了!\n", ++i));
}
}
ExDeletePagedLookasideList(&Lookaside);
}
2.运行时函数
(1)内存间复制(非重叠)
VOID
RtlCopyMemory(
IN VOID UNALIGNED *Destination,
IN CONST VOID UNALIGNED *Source,
IN SIZE_T Length
);
(2)内存间复制(可重叠)
VOID
RtlMoveMemory(
IN VOID UNALIGNED *Destination,
IN CONST VOID UNALIGNED *Source,
IN SIZE_T Length
);
(4)内存比较
SIZE_T
RtlCompareMemory(
IN CONST VOID *Source1,
IN CONST VOID *Source2,
IN SIZE_T Length
);
ULONG
RtlEqualMemory(
CONST VOID *Source1,
CONST VOID *Source2,
SIZE_T Length
);
测试代码:
#define BUFFER_SIZE 1024
#pragma INITCODE
VOID RtlTest()
{
KdPrint(("进入RtlTest函数!\n"));
PUCHAR pBuffer1 = (PUCHAR)ExAllocatePool(PagedPool, BUFFER_SIZE);
RtlZeroMemory(pBuffer1, BUFFER_SIZE);
PUCHAR pBuffer2 = (PUCHAR)ExAllocatePool(PagedPool, BUFFER_SIZE);
RtlFillMemory(pBuffer2, BUFFER_SIZE, 0xAA);
RtlCopyMemory(pBuffer1, pBuffer2, BUFFER_SIZE);
if (RtlEqualMemory(pBuffer1, pBuffer2, BUFFER_SIZE))
{
KdPrint(("两块内存块数据一样!\n"));
for(int i=0; i<BUFFER_SIZE; i++)
{
KdPrint(("%02X", pBuffer1[i]));
}
}
else
{
KdPrint(("两块内存块数据不一样!\n"));
}
KdPrint(("离开RtlTest函数!\n"));
}
- Windows内存管理(2)--Lookaside结构 和 运行时函数
- Windows内存管理(2)--Lookaside结构 和 运行时函数
- Windows内存管理(2)--Lookaside结构 和 运行时函数
- Windows内存管理(2)--Lookaside结构 和 运行时函数
- Windows内存管理(2)--Lookaside结构 和 运行时函数
- windows内核驱动内存管理之Lookaside使用
- 使用Lookaside结构来申请和释放内存
- windows内存管理和API函数
- Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
- Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
- Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
- 软件安全学习笔记(3):Windows内存结构和管理
- LookaSide分配内存
- windows内存结构(2)
- Windows内存管理与结构体MEMORY_BASIC_INFORMATION
- Windows内存管理与结构体MEMORY_BASIC_INFORMATION
- 理解Java虚拟机(4)之JVM运行时内存分配管理和对象内存分布
- JVM运行时内存结构
- bug总结-ie7下两列布局,右侧不能设置width100%
- hrbustoj 1291 点在凸多边形内
- 用C#(Winform)的Timer控件让窗体左右飘动
- C++ 线程安全的 单实例 模式
- Caused by: java.lang.OutOfMemoryError: Java heap space
- Windows内存管理(2)--Lookaside结构 和 运行时函数
- Android 去掉ListView/GridView下拉出空白回弹的效果
- elasticsearch获取java client实例
- nginx中获取真实ip
- JAVA获取本机网卡IP地址
- dgsd
- 笔试/面试题_算法
- 最受欢迎android开源项目---收藏地址
- Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT