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结构 和 运行时函数的更多相关文章

  1. 你必须了解的java内存管理机制(一)-运行时数据区

    前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了四遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from 你必须了解的java内存 ...

  2. windows内核驱动内存管理之Lookaside使用

    Windows内存管理中使用了类似于容器的东西,叫做Lookaside对象,每次程序员申请内存都会从Lookaside里面申请,只有不足的时候,Lookaside才会向内存又一次申请内存空间,这样减少 ...

  3. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  4. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

  5. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  6. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  7. Windows内存管理的方式

    一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导 ...

  8. windows 内存管理的几种方式及其优缺点

    windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地 ...

  9. 20140919 进程间通信 系统栈 用户栈 多级反馈队列 windows 内存管理

    1.进程间通信 共享内存(剪切板) 匿名管道只能实现父子进程间的通信(以文件系统为基础): 匿名管道是什么,有什么用,怎么用 1.创建父进程,也就是在解决方案中建立一个parent的工程 2.在par ...

随机推荐

  1. Java类的成员之四:代码块.

    3.2类的成员之四:代码块 ①初始化块(代码块)作用:对Java对象进行初始化 ②程序的执行顺序: ③一个类中初始化块若有修饰符,则只能被static修饰,称为静态代码块(static block ) ...

  2. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶

    一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...

  3. thinkphp 配置参考

    惯例配置 应用设定 'APP_USE_NAMESPACE' => true, // 应用类库是否使用命名空间 3.2.1新增 'APP_SUB_DOMAIN_DEPLOY' => fals ...

  4. 导出EXCEL(带数据)

    /* * 导出EXCEL * @param req * @param resp * @param model * @param info * @return */ @RequestMapping(va ...

  5. Android中ViewPgae中的Fragment如何确认当前页面可见的问题

    由于在ViewPage中PageAdapter来管理所有的Fragment.在加载一个Fragment的时候,会自动缓存左右几个(默认是一个)页面,此时也会调用到正常的生命周期函数,onCreate, ...

  6. 预处理+状态压缩+剪枝——codefoece 1209E

    那一步剪枝实在是没想到 #include<bits/stdc++.h> using namespace std; #define N 2005 struct Col{ ],Max[< ...

  7. robotium学习

    20140424 控件种类:spinner:下拉菜单,可以选择:TabHost:可以左右滑动,比如电话本:Gallery:rogressbar进度条;DatePicker;CheckBox,Radio ...

  8. [SCOI2014]方伯伯的玉米田 题解(树状数组优化dp)

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  9. php开发面试题---php高级程序员需要掌握的一些知识

    php开发面试题---php高级程序员需要掌握的一些知识 一.总结 一句话总结: 还是需要多多接触架构师的知识,比如这里说的微服务,还有需要php服务端的知识来解决web端的不足,比如Swoole 1 ...

  10. Invoking destroy method 'close' on bean with name 'dataSource'

    Invoking destroy method 'close' on bean with name 'dataSource' Spring与Mybatis整合时出现的问题,找了一晚上结果是一个属性写错 ...