chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1433回复:6

为什么内存使用量会不停地上涨?

楼主#
更多 发布于:2003-07-29 10:52
我的usb_bulk驱动是参照ddk里的一个例子写的,应用程序以异步的方式读写数据,我的usb设备提供2个可用端点,我用PIPE00来读数据,PIPE01来写数据,伪代码如下:

HANDLE hDev = CreateFile(
DevName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE,
NULL);

OVERLAPPED ol;
ol.hEvent = CreateEvent ( NULL,FALSE,FALSE,NULL );
ReadFile(hDevice,
data,
size,
(LPDWORD)&nBytesTransferred,
&ol);
if ( WaitForSingleObject ( ol.hEvent, 100 ) != WAIT_OBJECT_0 )
{
::CancelIO ( hDev );
}
GetOverlappedResult ( hDevice, &ol, (LPDWORD)&nBytesTransferred, FALSE );
.
.
.

按照这种方式分别写了一个读数据的函数,和一个写数据的函数,现在我有两个问题:
1、如果我在两个线程里分别进行读和写,系统很快就崩溃而重启。也就是说,读和写不能并行处理。当我改为一个线程里读写的时候就没问题了。
2、因为我的usb设备每10ms就送一次数据,所以我的上层程序也是每10ms就去读一次数据,如果在100ms内读到了数据就处理这些收到的数据,否则不做任何处理,继续下一次读数据。现在我发现,程序在运行过程中,内存的使用量不断的上涨,而且涨得很快,过不了几十分钟,系统就崩溃了。这是什么原因呢?是驱动的原因还是应用层的原因呢?驱动里的Read(Write)分发例程其实很简单的,当用户层的读或写的irp请求过来后,驱动就构造一个urb并传给下层驱动,urb是每次临时申请的,完成后在清除的,irp不需要申请的,因为在Read(Write)分发例程的参数里就有,麻烦你给找找原因好吗?

最新喜欢:

hewxhewx
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-29 11:10
你用过的内存有清除嘛?
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-29 21:20
我在应用层没有动态申请内存,驱动里除了urb申请了内存外,也没别的地方申请内存了,urb在irp的完成例程里给于清除的。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-02 12:50
你们有没有遇到这样的问题啊?我做的驱动实际上就是从ntddk的例子里照抄过来的,应该没什么问题吧?
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-02 15:05
你们有没有遇到这样的问题啊?我做的驱动实际上就是从ntddk的例子里照抄过来的,应该没什么问题吧?



没抄明白吧!
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-02 21:04
[quote]你们有没有遇到这样的问题啊?我做的驱动实际上就是从ntddk的例子里照抄过来的,应该没什么问题吧?



没抄明白吧! [/quote]应该不会啊,简直和例子一模一样的。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-04 10:42
好恐怖啊,非分页内存涨得太厉害了,10分钟左右由15M涨到了26M,这怎么行啊,救救我吧。

我的驱动只有在应用层ReadFile/WriteFile,我在Read/Write例程里构造urb时我才申请一个sizeof ( struct _URB_BULK_OR_INTERRUPT_TRANSFER )大小的非分页内存,而且在完成例程里就free掉了。

现在我已经将代码改为在设备启动的时候就申请这个urb,在read/write例程里根本不申请任何内存,可为何用windows2000的任务管理器查看的时候,内存仍然疯狂地上涨呢?是不是系统的irp没有及时释放啊?可这个irp我不能释放它啊?
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
游客

返回顶部