快查表

Lookaside(快查表):

快查表为了解决,频繁的申请和释放内存。因为频繁的申请和释放内存会造成大量的内存碎片。(例如:

内存就是一片海洋,然后用一个杯子装上一杯海水在杯子中去查找就更快一些
 

非分页内存

1 void ExInitializeNPagedLookasideList(
2   PNPAGED_LOOKASIDE_LIST Lookaside,
3   PALLOCATE_FUNCTION     Allocate,
4   PFREE_FUNCTION         Free,
5   ULONG                  Flags,
6   SIZE_T                 Size,
7   ULONG                  Tag,
8   USHORT                 Depth
9 );

 

分页内存

1 void ExInitializePagedLookasideList(  //初始化此结构体就可以分配内存了
2   PPAGED_LOOKASIDE_LIST Lookaside,
3   PALLOCATE_FUNCTION    Allocate,
4   PFREE_FUNCTION        Free,
5   ULONG                 Flags,
6   SIZE_T                Size,
7   ULONG                 Tag,
8   USHORT                Depth
9 );

 

非分页内存申请方式

1 PVOID ExAllocateFromNPagedLookasideList(
2   PNPAGED_LOOKASIDE_LIST Lookaside
3 );

 

分页内存申请方式

1 PVOID ExAllocateFromPagedLookasideList(
2   PPAGED_LOOKASIDE_LIST Lookaside
3 );

 

释放非分页内存方式

1 void ExFreeToNPagedLookasideList(
2   PNPAGED_LOOKASIDE_LIST Lookaside,
3   PVOID                  Entry
4 );

 

释放分页内存方式

1 void ExFreeToPagedLookasideList(
2   PPAGED_LOOKASIDE_LIST Lookaside,
3   PVOID                 Entry
4 );

 

删除非分页快查表(Lookaside)对象

1 void ExDeleteNPagedLookasideList(
2   PNPAGED_LOOKASIDE_LIST Lookaside
3 );

 

删除分页快查表(Lookaside)对象

1 void ExDeletePagedLookasideList(
2   PPAGED_LOOKASIDE_LIST Lookaside
3 );

 

非分页快查表代码实现

 1 VOID LookAsidePaging()  //非分页快查表
 2 {
 3     PMYDATA pData[100] = {NULL};
 4     int i = 0;
 5     NPAGED_LOOKASIDE_LIST LookAsideList;
 6     ExInitializeNPagedLookasideList(&LookAsideList,NULL,NULL,0,sizeof(MYDATA),"124233",0);
 7 
 8     //向内存中存入数据
 9     for (i = 0;i < 100;i++)
10     {
11         pdata[i] = (PMYDATA) ExAllocateFromNPagedLookasideList(&LookAsideList);
12         pData[i]->number = i;
13     }
14 
15     for (i = 0;i < 100;i++)
16     {
17         DbgPrint("%d\n",pData[i]->number);
18         ExFreeToNPagedLookasideList(&LookAsideList,pData[i]);
19     }
20 
21     ExDeleteNPagedLookasideList(&LookAsideList);
22 }
View Code

 

分页快查表代码实现

 1 VOID LookAsideTest()  //分页快查表
 2 {
 3     PMYDATA pData[100] = {NULL};
 4     int i = 0;
 5     PAGED_LOOKASIDE_LIST LookAsideList;
 6     ExInitializePagedLookasideList(&LookAsideList,NULL,NULL,0,sizeof(MYDATA),"124233",0);
 7 
 8     
 9     for (i = 0;i < 100;i++)
10     {
11         pData[i] = (PMYDATA) ExAllocateFromPagedLookasideList(&LookAsideList);
12         pdata[i]->number = i;
13     }
14 
15     for (i = 0;i < 100;i++)
16     {
17         DbgPrint("%d\n",pData[i]->number);
18         ExFreeToPagedLookasideList(&LookAsideList,pData[i]);
19     }
20 
21     ExDeletePagedLookasideList(&LookAsideList);
22 }
View Code

 

 

posted @ 2022-04-17 19:33  菜鸡拾光  阅读(92)  评论(0)    收藏  举报