在我回答我的问题之前,我将回顾一下我目前正在做的事情,这样你就会对我已经做过的事情有一个很好的了解。
我有一个多线程用户模式Windows应用程序,它向KMDF驱动程序发出DeviceIOControl调用(纯软件,没有硬件)。有5个独立的线程,它们都不断地对驱动程序进行相同的定制IOCTL调用。这一请求包括:
驱动程序目前正在按顺序执行此操作,我的用户模式应用程序中的主要瓶颈是等待内存读取完成,并且在场景“呈现”之前需要完成所有操作。
我已经尽可能地减少了DeviceIOControl请求的数量,所以现在我一直在研究重叠的IO,允许每个线程异步发送请求。我的问题是,这是否值得一试,因为我不知道是否可以在驱动程序中使用多个线程同时读取不同的地址。
发布于 2017-02-09 00:36:14
首先,非常重要的是用户模式如何在同步或异步模式中打开文件?(FILE_FLAG_OVERLAPPED用于CreateFile,FILE_SYNCHRONOUS_IO_[NO]NALERT用于ZwOpenFile或ZwCreateFile)
如果在同步模式下打开的文件(FO_SYNCHRONOUS_IO将处于FILE_OBJECT.Flags中),则I/O子系统将所有请求序列化为文件--因此在完成之前它不会向您的设备发送新的请求。使用异步文件对象-没有这样的限制-请求(IRP)将只发送到您的设备。
如果你这么说
然而,线程本身是相互独立的。
如果线程共享单个文件句柄( FILE_FLAG_OVERLAPPED),或者每个线程必须在设备上分离打开自己的私有文件,则需要以异步方式打开文件(使用FILE_OBJECT)。考虑更好的共享异步文件。
在驱动端,您必须使用WdfIoQueueDispatchParallel队列分派类型。因此,只需接受request (IRP)处理它并完成它(我知道您没有将这个请求发送给另一个驱动程序,或者放到另一个队列中)。
本质上,我要问的是,对于重叠的IO,它是相当于我的驱动程序处理每个线程的一个实例,还是仍然是一个驱动程序从5个线程获得大量请求,并且难以跟上?
您总是有一个驱动程序的一个实例,以及确切的设备创建数量。如果您只创建一个设备,并且将只创建此一个设备。所有文件都将在此设备上打开。所有请求(来自任何进程/线程)都将发送到这个单个设备实例。
如果您对所有线程使用相同的文件,并且它将是同步文件-- I/O子系统将所有请求序列化到驱动程序--这对您是不利的。驱动程序(设备)的客户端必须以异步方式打开文件(或者每个客户端都打开自己的私有文件)。在驱动程序端,您需要WdfIoQueueDispatchParallel队列调度类型,因为我如何理解所有请求是独立的,并且不需要请求之间的同步。
https://stackoverflow.com/questions/42080855
复制相似问题