zoukankan      html  css  js  c++  java
  • Ring0

    由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
    这时使用Lookaside.
    1.每次申请固定大小的内存.
    2.申请和回收的操作十分频繁.
    实现原理:
    他先向windows申请了一块比较大的内存.而后以后申请内存都从Lookaside对象申请.这样就会避免内存"空洞",Lookaside对象内部的内存不够用时,他会向操作系统申请更多内存.当Lookaside内部有大量的未使用的内存时,他会自动让windows回收一部分内存.总之Lookaside是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向windows申请内存。


    初始化Lookaside

    //分页
    VOID
    ExInitializePagedLookasideList (
    _Out_ PPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
    _In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
    _In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
    _In_ ULONG Flags, //必须为0
    _In_ SIZE_T Size,
    _In_ ULONG Tag, //随便写
    _In_ USHORT Depth //保留.必须是零.

    );

    //不分页
    VOID
    ExInitializeNPagedLookasideList (
    _Out_ PNPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
    _In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
    _In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
    _In_ ULONG Flags, //必须为0
    _In_ SIZE_T Size, //每个非分页条目的大小,即字节的大小
    _In_ ULONG Tag,
    _In_ USHORT Depth //保留.必须是零
    );

      1 #include <ntifs.h>
      2 
      3 
      4 
      5 
      6 typedef struct _ITEM_
      7 {
      8     ULONG ItemData;
      9 }ITEM, *PITEM;
     10 
     11 
     12 void LookasideTest();
     13 
     14 
     15 VOID DriverUnload(PDRIVER_OBJECT DriverObject);
     16 
     17 
     18 
     19 
     20 
     21 
     22 
     23 
     24 
     25 
     26 
     27 #include "Lookaside.h"
     28 
     29 //bp Lookaside!DriverEntry
     30 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
     31 {
     32     NTSTATUS Status = STATUS_SUCCESS;
     33     PDEVICE_OBJECT  DeviceObject = NULL;
     34     
     35     DriverObject->DriverUnload = DriverUnload;
     36     
     37 
     38     LookasideTest();
     39 
     40 
     41     
     42     return Status;
     43 }
     44 
     45 
     46 void LookasideTest()
     47 {
     48     //初始化Lookaside对象
     49     int i = 0;
     50     PAGED_LOOKASIDE_LIST PagedLookasideList;
     51     
     52     ExInitializePagedLookasideList(
     53         &PagedLookasideList, 
     54         NULL, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
     55         NULL, 
     56         0, 
     57         sizeof(ITEM), 
     58         '8888',//ulong 4位数字
     59         0//保留.必须是零.
     60     );//分页
     61 
     62 #define ARRAY_NUMBER 50
     63     PITEM Item[ARRAY_NUMBER];
     64     //模拟频繁申请内存
     65     for (i = 0; i < ARRAY_NUMBER; i++)
     66     {
     67         Item[i] = (PITEM)ExAllocateFromPagedLookasideList(
     68             &PagedLookasideList);
     69     }
     70 
     71     for (i = 0; i < ARRAY_NUMBER; i++)
     72     {
     73         Item[i]->ItemData = i;
     74     }
     75 
     76     for (i = 0; i < ARRAY_NUMBER; i++)
     77     {
     78         DbgPrint("%d
    ", Item[i]->ItemData);
     79     }
     80     //模拟频繁回收内存
     81     for (i = 0; i < ARRAY_NUMBER; i++)
     82     {
     83         ExFreeToPagedLookasideList(
     84             &PagedLookasideList, 
     85             Item[i]
     86         );
     87 
     88         Item[i] = NULL;
     89     }
     90 
     91     ExDeletePagedLookasideList(&PagedLookasideList);
     92     //删除LookasidePagedLookasideList
     93 
     94 
     95 
     96 
     97 }
     98 
     99 VOID DriverUnload(PDRIVER_OBJECT DriverObject)
    100 {
    101     DbgPrint("DriverUnload()
    ");
    102 }
  • 相关阅读:
    Kettle使用kettle.properties
    kettle 获取文件名
    连接池的补充设置,应用到上面所有数据源中
    kettle 获取某个目录下所有的文件
    不小心删库了怎么办,用binlog可以恢复
    江北的KETTLE学习日志
    Python3 中,bytes 和 str
    kettle入门(四) 之kettle取昨天时间&设置任意时间变量案例
    30-Day Leetcoding Challenge Day17(构造并查集)
    30-Day Leetcoding Challenge Day16
  • 原文地址:https://www.cnblogs.com/1228073191Blog/p/7500598.html
Copyright © 2011-2022 走看看