阅读:1433回复:6
为什么内存使用量会不停地上涨?
我的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)分发例程的参数里就有,麻烦你给找找原因好吗? |
|
最新喜欢:hewx
|
沙发#
发布于:2003-07-29 11:10
你用过的内存有清除嘛?
|
|
板凳#
发布于:2003-07-29 21:20
我在应用层没有动态申请内存,驱动里除了urb申请了内存外,也没别的地方申请内存了,urb在irp的完成例程里给于清除的。
|
|
|
地板#
发布于:2003-08-02 12:50
你们有没有遇到这样的问题啊?我做的驱动实际上就是从ntddk的例子里照抄过来的,应该没什么问题吧?
|
|
|
地下室#
发布于:2003-08-02 15:05
你们有没有遇到这样的问题啊?我做的驱动实际上就是从ntddk的例子里照抄过来的,应该没什么问题吧? 没抄明白吧! |
|
5楼#
发布于:2003-08-02 21:04
[quote]你们有没有遇到这样的问题啊?我做的驱动实际上就是从ntddk的例子里照抄过来的,应该没什么问题吧? 没抄明白吧! [/quote]应该不会啊,简直和例子一模一样的。 |
|
|
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我不能释放它啊? |
|
|