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\r\n", 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()\r\n");
}

  

时间: 2024-10-13 11:56:53

Lookaside的相关文章

Translation Lookaside Buffer

COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In principle, then, every virtual memory reference can cause two physical mem-ory accesses: one to fetch the appropriate page table entry, and one to fetch the desired dat

[转载]使用 Lookaside List 分配内存

1. 概述 windows 提供了一种基于 lookaside list 的快速内存分配方案,区别于一般的使用 ExAllocatePoolWithTag() 系列函数的内存分配方式.每次从 lookaside list 里分配 fixed size 的内存. 系统构建两个条 lookaside 链表:ExNPagedLookasideListHead 和 ExPagedLookasideListHead,分别用于 Non-paged 内存和 paged 内存. lookaside list 链

PatentTips - Virtual translation lookaside buffer

BACKGROUND OF THE INVENTION A conventional virtual-machine monitor (VM monitor) typically runs on a computer and presents to other software the abstraction of one or more virtual machines. Each virtual machine may function as a self-contained platfor

Ring0 - Lookaside结构

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

【转】TLB(Translation Lookaside Buffers,TLB)的作用

原文网址:http://sdnydubing.blog.163.com/blog/static/137470570201122810503396/ 从虚拟地址到物理地址的转换过程可知:使用一级页表进行地址转换时,每次读/写数据需要访问两次内存,第一次访问一级页表获得物理地址,第二次才是真正的读/写数据:使用两级页表时,每次读/写数据需要访问三次内存,访问两次页表(一级页表和二级页表)获得物理地址,第三次才是真正的读/写数据. 上述的地址转换过程打打降低了CPU的性能,有没有办法改进呢?程序执行过

Windows驱动开发基础(八)内存管理

Windows驱动开发基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38826159 就32位的计算机来说,他有4G的真实的物理内存.但是这样是不够的,于是引入了虚拟内存的概念.使得每一个进程都有4G的虚拟内存. 虚拟内存实际上就是采用了一种映射的方式.4G的内存实际上被分页.一般来说一个页的大小是4K.也是说它被分为了1M个页.在这么多的页里面,有一部分是对应于物理内存的(可以是多对一的):有一部分是对应于磁盘上的空间,但

Mobile Push Notification

In one embodiment, a method includes sending to a mobile client computing device a first notification through a real-time push service, the first notification including content and being associated with a stateful object; the method also includes, in

Chapter 5 MySQL Server Administration_1

Chapter 5 MySQL Server Administration Table of Contents 5.1 The MySQL Server 5.1.1 Configuring the Server 5.1.2 Server Configuration Defaults 5.1.3 Server Option and Variable Reference 5.1.4 Server Command Options 5.1.5 Server System Variables 5.1.6

单线程你别阻塞,Redis时延问题分析及应对

单线程你别阻塞,Redis时延问题分析及应对 Redis的事件循环在一个线程中处理,作为一个单线程程序,重要的是要保证事件处理的时延短,这样,事件循环中的后续任务才不会阻塞: 当redis的数据量达到一定级别后(比如20G),阻塞操作对性能的影响尤为严重: 下面我们总结下在redis中有哪些耗时的场景及应对方法: 耗时长的命令造成阻塞 keys.sort等命令 keys命令用于查找所有符合给定模式 pattern 的 key,时间复杂度为O(N), N 为数据库中 key 的数量.当数据库中的个