DPC会被分配到不停的CPU核心上,如果分配到同一个核心,那么DPC是串行的,如果分配到不同的CPU核心上,那么DPC是并行的,但如果设置WDF_OBJECT_ATTRIBUTES的SynchronizationScope属性为WdfSynchronizationScopeDevice,那么即便CPU有多核,DPC也不会在不同的核心上并发,因为系统加锁进行同步保护了,也就是说设置 WdfSynchronizationScopeDevice后,那些回调函数不会并发执行,只会串行执行。当一个CPU在执行DPC时,另一个CPU中的DPC是拿不到锁的,因此不会被执行。
// Initialize FDO Attributes and create our device object
WDF_OBJECT_ATTRIBUTES fdo_attr;
WDF_OBJECT_ATTRIBUTES_INIT(&fdo_attr);
WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(&fdo_attr, your_device_extension); // Specify a context for DeviceObject.
// Set the Synchronization scope to device so that only one event callback for this is executing at anytime.
// This eliminates the need to hold any lock to synchronize access to device extension.
fdo_attr.SynchronizationScope = WdfSynchronizationScopeDevice;
// Context Cleanup will be called by the framework when it deletes the device.
fdo_attr.EvtCleanupCallback = xxxx_port_evt_dev_cleanup;
总结:
在Windows系统中,DPC可以在不同的CPU核心上并行执行,这取决于系统的调度和负载情况。如果系统调度一个DPC到另一个CPU核心上执行,那么这两个DPC可能会并行执行。
然而,通过设置WdfSynchronizationScopeDevice
属性,可以确保同一设备对象下的回调函数在并发情况下是串行执行的。这意味着,如果一个CPU核心正在执行设备对象相关的DPC,另一个CPU核心上的相同设备对象相关的DPC会等待前一个DPC执行完成后才会执行,因为系统会使用锁来保护这些回调函数,确保它们在同一时间只有一个在执行。