linu 同步机制分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
自旋锁最多只能被一个可执行线程持有。自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,自旋一词就是因此而得名。 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠, 因此只能在进程上下文使用(_trylock 的变种能够在中断上下文使用);而自旋锁适合于保持时间非常短的情况,因为一个被争用的自旋锁使得请求它的线程在等待重新可用时自旋,特别浪费处理时间,这是自旋锁的要害之处,所以自旋锁不应该被长时间持有。在实际应用中自旋锁代码只有几行,而持有自旋锁的时间也一般不会超过两次上下方切换,因线程一旦要进行切换,就至少花费切出切入两次,自旋锁的占用时间如果远远长于两次上下文切换,我们就可以让线程睡眠,这就失去了设计自旋锁的意义。 如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。 自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或 SMP 的情况下才真正需要,在单 CPU 且不可抢占的内核下,自旋锁的所有操作都是空操作。 一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁, 那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。 无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说, 在任何时刻最多只能有一个执行单元获得锁。自旋锁的实现和体系结构密切相 关,代码一般通过汇编实现,定义在文件,实际用到的接口定义在文件夹 中, 自旋锁的 API 有: CODE:spin_lock_init(x) CODE:spin_lock_init(x) 该宏用于初始化自旋锁 x。自旋锁在真正使用前必须先初始化。该宏用于动态初始化指定的。 CODE:DEFINE_SPINLOCK(x) CODE:DEFINE_SPINLOCK(x) 该宏声明一个自旋锁 x 并初始化它。该宏在 2.6.11 中第一次被定义,在先前的内核中并没有该宏。 CODE:SPIN_LOCK_UNLOCKED CODE:SPIN_LOCK_UNLOCKED 该宏用于静态初始化一个自旋锁。 CODE:DEFINE_SPINLOCK(x CODE:DEFINE_SPINLOCK(x)等同于 spinlock_t x = SPIN_LOCK_UNLOCKEDspin_is_locked(x) ) 该宏用于判断自旋锁 x 是否已经被某执行单元保持(即被锁),如果是,返回真,否则返回假。 CODE:spin_unlock_wait(x) CODE:spin_unlock_wait(x) 该宏用于等待自旋锁 x 变得没有被任何执行单元保持,如果没有任何执行单元保持该自旋锁,该宏立即返回,否则将循环在那里,直到该自旋锁被保持者释放。 CODE:spin_trylock(lock) CODE:spin_trylock(lock) 该宏尽力获得自旋锁 lock,如果能立即获得锁,它获得锁并返回真,否则不能立即获得锁,立即返回假。它不会自旋等待 lock 被释放。 CODE:spin_lock(lock) CODE:spin_lock(lock) 该宏用于获得自旋锁 lock,如果能够立即获得锁,它就马上返回,否则, 它将自旋在那里,直到该自旋锁的保持者释放,这时,它获得锁并返回。总之, 只有它获得锁才返回。 CODE:spin_lock_irqsave(lock, flags) CODE:spin_lock_irqsave(lock, flags) 该宏获得自旋锁的同时把标志寄存器的值保存到变量 flags 中并失效本地中断。 CODE:spin_lock_irq(lock) CODE:spin_lock_irq(lock) 该宏类似于 spin_lock_irqsave,只是该宏不保存标志寄存器的值。禁止本地中断并获取指定的锁 CODE:spin_lock_bh(lock) CODE:spin_lock_bh(lock) 该宏在得到自旋锁的同时失效本地软中断。 CODE:spin_unlock(lock) CODE:spin_unlock(lock) 该宏释放自旋锁 lock,它与 spin_trylock

文档评论(0)

hao187 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体武汉豪锦宏商务信息咨询服务有限公司
IP属地上海
统一社会信用代码/组织机构代码
91420100MA4F3KHG8Q

1亿VIP精品文档

相关文档