阅读:1569回复:13
关于内存问题(100分)
请教各位
在驱动里面我频繁地ExAllocatePool和ExFreePool会不会产生问题, 如果我的程序需要频繁分配和释放内存的话,用什么办法比较安全, 比较稳定??? 谢谢各位 |
|
|
沙发#
发布于:2004-08-23 23:10
用LOOKASIDELIST比较好T
|
|
|
板凳#
发布于:2004-08-24 01:46
谢谢兄弟回复 ,但是偶不懂什么叫LOOKASIDELIST
在DDK里也查不到,能够简单说说么? |
|
|
地板#
发布于:2004-08-24 08:21
LOOKASIDELIST
其实就是集中管理用ExAllocPool或ExAllocPoolWithTag的分配的分页或非分页内存,它还负责维护每一个内存的state等。要想使用它有如下: 1。ExInitializeNPagedLookasideList 或ExInitializePagedLookasideList 先初始化一个这样的LIST 2。用ExAllocateFrom(N)PagedLookasideList 分内存 3。用ExFreeTo(N)PagedLookasideList释放内存 详细情况请MSDN |
|
地下室#
发布于:2004-08-24 09:29
以前在非驱动的年代,我曾经做过频繁分配内存的事情。
NEW,或者HEAP,或者MALLOC之类的,运行结果(能够成功的次数)都会因为操作系统的不同,比如2000P,2000S,2000A不同而不同。 但是有一个函数绝对不会出错:VirtualAlloc,因为VirtualAlloc比较底层。但是这不是最好办法, 经过我长期的调试,关于频繁分配内存的解决办法只有1个: 1,分配以页为单位的内存,建议值8K,如果实在是非常频繁,分配值可以稍微再大点。 2,最好能定义一个结构记录内存的使用情况,不建议使用微软给的内存状态。 3,使用完毕之后,不要free之类的操作,将内存留着。 4,如果需要查询,请自写hash算法等。。。。。 根据你的驱动类型的不同,分配内存也有不同的办法来替换诸如VirtualAlloc的办法,不过频繁的分配,只能让你的驱动,效率差,而且容易出问题。 [编辑 - 8/24/04 by Evilly] |
|
5楼#
发布于:2004-08-24 17:18
果然是个不错的方法
|
|
|
6楼#
发布于:2004-08-24 19:25
再问问
ExFreeToNPagedLookasideList是不是用一次就可以释放所有用 ExAllocateFrom(N)PagedLookasideList 分的内存块呢? |
|
|
7楼#
发布于:2004-08-24 23:12
当然不是
|
|
8楼#
发布于:2004-08-25 08:21
以前在非驱动的年代,我曾经做过频繁分配内存的事情。 作成内存池,预先分配好固定的一块,这样就不需要太多的分配释放,形成内存碎片. |
|
9楼#
发布于:2004-08-25 08:58
[quote]以前在非驱动的年代,我曾经做过频繁分配内存的事情。 作成内存池,预先分配好固定的一块,这样就不需要太多的分配释放,形成内存碎片. [/quote] 对,只有在内存不够的时候再释放原来的,重新分配更大的. |
|
|
10楼#
发布于:2004-08-26 12:30
在app里面我知道怎么样用内存池,相应的操作也简单,例如MFC里面的
CArray, 但是在驱动里面相应的操作显得太繁琐,不知道有没有简单的方法,用了lookasside后感觉只不过是系统帮你处理一些内存管理方面的, 但是也没有达到真正的内存池管理(app里面的内存池的概念跟线程池的概念差不多) 也就是Sundsea兄说的那样,在驱动里面有没有简单的方法实现? |
|
|
11楼#
发布于:2004-08-26 17:54
在app里面我知道怎么样用内存池,相应的操作也简单,例如MFC里面的 其实很容易的,写一个环行缓冲区的数据结构(可以分配一大块内存,也可以连续分配多个小内存块),有两个指针,头和尾,头尾指针一直在兜圈. |
|
12楼#
发布于:2004-08-26 19:26
除非你自己在驱动实现STL.
|
|
|
13楼#
发布于:2004-08-27 00:12
除非你自己在驱动实现STL. 没这么复杂吧,STL可是比较高深的东东,能够用好、掌握其精华, 已属不易,不过实现一个缓冲池应该不是很难。 |
|