在设计大多数设备驱动程序时,都应该确保锁定方案简单易懂。使用额外的锁允许更多并发,但会增加开销。使用的锁越少,占用的时间越短,但允许的并发会更少。通常,对每个数据结构使用一个互斥锁,对驱动程序必须等待的每个事件或条件使用一个条件变量,对驱动程序的每个主要全局数据集使用一个互斥锁。请避免长时间持有互斥锁。选择锁定方案时,请遵循以下指导原则:
优先使用程序入口点的多线程语义。
确保所有程序入口点可重入。可以通过将静态变量更改为自动变量来减少共享数据量。
如果驱动程序获取了多个互斥锁,请在所有代码路径中按相同顺序获取和释放这些互斥锁。
在相同的功能空间中持有锁和释放锁。
调用可阻塞的 DDI 接口时请避免持有驱动程序互斥锁,例如使用 KM_SLEEP 调用 kmem_alloc(9F)。
要查看锁的用法,请使用 lockstat(1M)。lockstat(1M) 可监视所有内核锁定事件、收集有关事件的频率和计时数据,并显示这些数据。
有关多线程操作的更多详细信息,请参见Multithreaded Programming Guide。