Sed*_*glu 111
当您使用常规锁(互斥锁,关键部分等)时,操作系统会将您的线程置于WAIT状态,并通过调度同一核心上的其他线程来抢占它.如果等待时间非常短,则性能会受到影响,因为您的线程现在必须等待抢占才能再次接收CPU时间.
此外,内核对象在内核的每个状态中都不可用,例如在中断处理程序中或者在分页不可用时等.
自旋锁不会导致抢占,而是在循环中等待("旋转"),直到另一个核心释放锁定.这可以防止线程丢失其量程并在锁释放后立即继续.自旋锁的简单机制允许内核在几乎任何状态下使用它.
这就是为什么在单核心机器上,自旋锁只是一个"禁用中断"或"引发IRQL",这完全阻止了线程调度.
自旋锁最终允许内核避免"大内核锁定"(当核心进入内核并在出口处释放时获得锁定)并且对内核基元进行粒度锁定,从而在多核机器上实现更好的多处理,从而提高性能.
编辑:提出了一个问题:"这是否意味着我应该尽可能使用自旋锁?" 我会尽力回答:
正如我所提到的,Spinlocks仅在预期等待时间短于量子(读取:毫秒)的地方有用,并且抢占没有多大意义(例如,内核对象不可用).
如果等待时间未知,或者您处于用户模式,则Spinlocks效率不高.在检查自旋锁是否可用时,您在等待核心上消耗100%的CPU时间.在量程到期之前,您可以阻止其他线程在该核心上运行.此方案仅适用于内核级别的短突发,并且不太可能是用户模式应用程序的选项.
这是一个在SO处理的问题:Spinlocks,它们有用吗?
cod*_*ict 23
假设资源受锁保护,想要访问资源的线程需要首先获取锁.如果锁不可用,则线程可能会反复检查是否已释放锁.在此期间线程忙等待,检查锁,使用CPU,但没有做任何有用的工作.这种锁被称为旋转锁.
Ode*_*ded 17
这是一个循环,一直持续到满足某个条件:
while(cantGoOn) {};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
60103 次 |
最近记录: |