IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1569回复:13

关于内存问题(100分)

楼主#
更多 发布于:2004-08-23 19:57
请教各位
在驱动里面我频繁地ExAllocatePool和ExFreePool会不会产生问题,
如果我的程序需要频繁分配和释放内存的话,用什么办法比较安全,
比较稳定???
谢谢各位
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-08-23 23:10
用LOOKASIDELIST比较好T
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-24 01:46
谢谢兄弟回复 ,但是偶不懂什么叫LOOKASIDELIST
在DDK里也查不到,能够简单说说么?
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
zhiyuan19840428
驱动小牛
驱动小牛
  • 注册日期2004-05-11
  • 最后登录2005-06-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-24 08:21
LOOKASIDELIST
其实就是集中管理用ExAllocPool或ExAllocPoolWithTag的分配的分页或非分页内存,它还负责维护每一个内存的state等。要想使用它有如下:
 1。ExInitializeNPagedLookasideList 或ExInitializePagedLookasideList 先初始化一个这样的LIST
 2。用ExAllocateFrom(N)PagedLookasideList 分内存
 3。用ExFreeTo(N)PagedLookasideList释放内存
 详细情况请MSDN
Evilly
驱动牛犊
驱动牛犊
  • 注册日期2004-07-09
  • 最后登录2005-04-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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]
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-24 17:18
果然是个不错的方法
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-24 19:25
再问问
ExFreeToNPagedLookasideList是不是用一次就可以释放所有用
ExAllocateFrom(N)PagedLookasideList 分的内存块呢?
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2004-08-24 23:12
当然不是
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-25 08:21
以前在非驱动的年代,我曾经做过频繁分配内存的事情。
NEW,或者HEAP,或者MALLOC之类的,运行结果(能够成功的次数)都会因为操作系统的不同,比如2000P,2000S,2000A不同而不同。
但是有一个函数绝对不会出错:VirtualAlloc,因为VirtualAlloc比较底层。但是这不是最好办法,
经过我长期的调试,关于频繁分配内存的解决办法只有1个:
1,分配以页为单位的内存,建议值8K,如果实在是非常频繁,分配值可以稍微再大点。
2,最好能定义一个结构记录内存的使用情况,不建议使用微软给的内存状态。
3,使用完毕之后,不要free之类的操作,将内存留着。
4,如果需要查询,请自写hash算法等。。。。。


根据你的驱动类型的不同,分配内存也有不同的办法来替换诸如VirtualAlloc的办法,不过频繁的分配,只能让你的驱动,效率差,而且容易出问题。

[编辑 -  8/24/04 by  Evilly]


作成内存池,预先分配好固定的一块,这样就不需要太多的分配释放,形成内存碎片.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2004-08-25 08:58
[quote]以前在非驱动的年代,我曾经做过频繁分配内存的事情。
NEW,或者HEAP,或者MALLOC之类的,运行结果(能够成功的次数)都会因为操作系统的不同,比如2000P,2000S,2000A不同而不同。
但是有一个函数绝对不会出错:VirtualAlloc,因为VirtualAlloc比较底层。但是这不是最好办法,
经过我长期的调试,关于频繁分配内存的解决办法只有1个:
1,分配以页为单位的内存,建议值8K,如果实在是非常频繁,分配值可以稍微再大点。
2,最好能定义一个结构记录内存的使用情况,不建议使用微软给的内存状态。
3,使用完毕之后,不要free之类的操作,将内存留着。
4,如果需要查询,请自写hash算法等。。。。。


根据你的驱动类型的不同,分配内存也有不同的办法来替换诸如VirtualAlloc的办法,不过频繁的分配,只能让你的驱动,效率差,而且容易出问题。

[编辑 -  8/24/04 by  Evilly]


作成内存池,预先分配好固定的一块,这样就不需要太多的分配释放,形成内存碎片. [/quote]
对,只有在内存不够的时候再释放原来的,重新分配更大的.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-26 12:30
在app里面我知道怎么样用内存池,相应的操作也简单,例如MFC里面的
CArray,
但是在驱动里面相应的操作显得太繁琐,不知道有没有简单的方法,用了lookasside后感觉只不过是系统帮你处理一些内存管理方面的,
但是也没有达到真正的内存池管理(app里面的内存池的概念跟线程池的概念差不多)
也就是Sundsea兄说的那样,在驱动里面有没有简单的方法实现?
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-26 17:54
在app里面我知道怎么样用内存池,相应的操作也简单,例如MFC里面的
CArray,
但是在驱动里面相应的操作显得太繁琐,不知道有没有简单的方法,用了lookasside后感觉只不过是系统帮你处理一些内存管理方面的,
但是也没有达到真正的内存池管理(app里面的内存池的概念跟线程池的概念差不多)
也就是Sundsea兄说的那样,在驱动里面有没有简单的方法实现?



其实很容易的,写一个环行缓冲区的数据结构(可以分配一大块内存,也可以连续分配多个小内存块),有两个指针,头和尾,头尾指针一直在兜圈.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2004-08-26 19:26
除非你自己在驱动实现STL.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
Sundsea
驱动老牛
驱动老牛
  • 注册日期2003-05-06
  • 最后登录2012-06-05
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望35点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-27 00:12
除非你自己在驱动实现STL.



没这么复杂吧,STL可是比较高深的东东,能够用好、掌握其精华,
已属不易,不过实现一个缓冲池应该不是很难。
游客

返回顶部