编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

选择锁定方案

在设计大多数设备驱动程序时,都应该确保锁定方案简单易懂。使用额外的锁允许更多并发,但会增加开销。使用的锁越少,占用的时间越短,但允许的并发会更少。通常,对每个数据结构使用一个互斥锁,对驱动程序必须等待的每个事件或条件使用一个条件变量,对驱动程序的每个主要全局数据集使用一个互斥锁。请避免长时间持有互斥锁。选择锁定方案时,请遵循以下指导原则:

  • 优先使用程序入口点的多线程语义。

  • 确保所有程序入口点可重入。可以通过将静态变量更改为自动变量来减少共享数据量。

  • 如果驱动程序获取了多个互斥锁,请在所有代码路径中按相同顺序获取和释放这些互斥锁。

  • 在相同的功能空间中持有锁和释放锁。

  • 调用可阻塞的 DDI 接口时请避免持有驱动程序互斥锁,例如使用 KM_SLEEP 调用 kmem_alloc(9F)

要查看锁的用法,请使用 lockstat(1M)lockstat(1M) 可监视所有内核锁定事件、收集有关事件的频率和计时数据,并显示这些数据。

有关多线程操作的更多详细信息,请参见Multithreaded Programming Guide