分享

使用自旋锁注意事项

 悦光阴 2022-11-23 发布于北京

驱动工程师应当谨慎使用自旋锁,而且在使用中还要特别注意如下几个问题。

  1)自旋锁实际上是忙等待,当锁不可用时,CPU一直循环执行“测试并设置”该锁直到可用而取得该锁,CPU在等待自旋锁时不做任何有用的工作,仅仅是等待。因此,只有在占用锁的时间极短的情况下,使用自旋锁才是合理的。当临界区很大,或有共享设备的时候,需要较长时间占用锁,使用自旋锁会降低系统的性能。

  2)自旋锁可能导致系统死锁。引发这个问题最常见的情况是递归使用自旋锁,即一个已经拥有某个自旋锁的CPU想要第二次获得这个自旋锁,则该CPU将自锁。

  3)在自旋锁锁定期间不能调用可能引起进程调度的函数。如果进程获得自旋锁之后再阻塞,如调用copy_form_user()、copy_to_user()、kmalloc()和msleep()等函数,则可能导致内核崩溃,

  4)在单核情况下编程的时候,也应该认为自己的CPU是多核的,驱动特别强调跨平台的概念。比如,在单CPU的情况下,若中断和进程可能访问同一临界区,进程里调用spin_lock_irqsave()是安全的,在中断里其实不调用spin_lock()也没有问题,因为spIn_lock_irqsave()可以保证这个CPU的中断服务函数不可能执行。但是,若CPU变成多核,spin_lock_irqsave()不能屏蔽另外一个核的中断,所以另外一个核就可能造成并发问题。因此,无论如何,我们在中断服务程序里也应该调用spin_lock()。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多