zoukankan      html  css  js  c++  java
  • Lookaside

      频繁申请和回收内存,会导致在内存上产生大量的内存碎片,从而导致最终无法申请内存。DDK提供了Lookaside结构来解决这个问题。可以将Lookaside结构想象成一个内存容器。在初始的时候,它先向Windows申请了比较大的内存。以后每次申请内存的时候,不是直接向Windows申请内存,而是向Lookaside对象申请内存

      

      Lookaside一般会在以下情况下使用:

    1. 程序员每次申请固定大小的内存
    2. 申请和回收的操作十分频繁

      初始化Lookaside:

      1VOID 
        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
          );

     

      (2VOID 
        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
          );

      申请内存

      ExInitializeNPagedLookasideList()

      ExInitializePagedLookasideList()

      回收内存

      ExFreeToNPagedLookasideList()

      ExFreeToPagedLookasideList()

      删除Lookaside对象

      ExDeleteNPagedLookasideList()

      ExDeletePagedLookasideList()

    //bp Lookaside!DriverEntry
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
    {
    	NTSTATUS Status = STATUS_SUCCESS;
    	PDEVICE_OBJECT  DeviceObject = NULL;
    	DriverObject->DriverUnload = DriverUnload;
    	SeLookaside();
    	return Status;
    }
    VOID SeLookaside()
    {
    	//初始化Lookaside对象
    	int i = 0;
    	PAGED_LOOKASIDE_LIST PagedLookasideList;
    	ExInitializePagedLookasideList(&PagedLookasideList, NULL, NULL, 0, sizeof(ITEM), '8888', 0);
    
    #define ARRAY_NUMBER 50
    	PITEM Item[ARRAY_NUMBER];
    	//模拟频繁申请内存
    	for (i = 0; i < ARRAY_NUMBER; i++)
    	{
    		Item[i] = (PITEM)ExAllocateFromPagedLookasideList(&PagedLookasideList);
    	}
    
    	for (i = 0;i<ARRAY_NUMBER;i++)
    	{
    		Item[i]->ItemData = i;
    	}
    
    	for (i = 0; i < ARRAY_NUMBER; i++)
    	{
    		DbgPrint("%d
    ", Item[i]->ItemData);
    	}
    	//模拟频繁回收内存
    	for (i = 0; i < ARRAY_NUMBER; i++)
    	{
    		ExFreeToPagedLookasideList(&PagedLookasideList, Item[i]);
    		Item[i] = NULL;
    	}
    
    	ExDeletePagedLookasideList(&PagedLookasideList);
    	//删除LookasidePagedLookasideList
    }
    
    VOID DriverUnload(PDRIVER_OBJECT DriverObject)
    {
    	DbgPrint("DriverUnload()
    ");
    }
    

      

  • 相关阅读:
    Scrapy 扩展中间件: 针对特定响应状态码,使用代理重新请求
    Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL
    Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误
    Scrapyd 改进第二步: Web Interface 添加 STOP 和 START 超链接, 一键调用 Scrapyd API
    简单示例理解神闭包
    ejs 模板使用方法
    我使用的开源组件汇总,以备学习使用
    了不起的Node.js--之五 TCP连接
    Windows7下Java运行时环境搭建
    了不起的Node.js--之四
  • 原文地址:https://www.cnblogs.com/lsh123/p/7372962.html
Copyright © 2011-2022 走看看