关于Windows驱动中DPC同步的一些见解说明

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执行完成后才会执行,因为系统会使用锁来保护这些回调函数,确保它们在同一时间只有一个在执行。

相关推荐

  1. 关于Windows驱动DPC同步一些见解说明

    2024-05-12 13:56:03       9 阅读
  2. 关于windows脚本一些东西

    2024-05-12 13:56:03       10 阅读
  3. CSS transition一些见解

    2024-05-12 13:56:03       28 阅读
  4. 前端同步和异步任务详细说明

    2024-05-12 13:56:03       15 阅读
  5. 个人关于Vue2组成见解

    2024-05-12 13:56:03       5 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 13:56:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 13:56:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 13:56:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 13:56:03       18 阅读

热门阅读

  1. 页面静态化

    2024-05-12 13:56:03       8 阅读
  2. C#识别图片数字

    2024-05-12 13:56:03       8 阅读
  3. C++的数据结构(一)

    2024-05-12 13:56:03       6 阅读
  4. 【视频/图像数据格式】基本视频/图像数据格式

    2024-05-12 13:56:03       7 阅读
  5. 了解WebSocket

    2024-05-12 13:56:03       12 阅读
  6. MapReduce

    MapReduce

    2024-05-12 13:56:03      6 阅读
  7. js方法 Array.prototype.slice()

    2024-05-12 13:56:03       10 阅读