我一直想知道它们是什么:每当我听说它们时,未来飞轮般的设备的图像就会起舞(滚动?)在我的脑海里。
他们是什么?
发布于 2009-12-24 16:55:46
当您使用常规锁(互斥、临界区等)时,操作系统会将您的线程置于等待状态,并通过在同一核心上调度其他线程来preempts它。如果等待时间真的很短,这会造成性能损失,因为线程现在必须等待抢占才能再次接收CPU时间。
此外,内核对象并不是在内核的每种状态下都可用,例如在中断处理程序中或在分页不可用时等等。
自旋锁不会导致抢占,而是在循环中等待(“旋转”),直到另一个核心释放锁。这可以防止线程丢失其quantum,并在锁释放后立即继续。自旋锁的简单机制允许内核在几乎任何状态下使用它。
这就是为什么在单核机器上,自旋锁只是一个“禁用中断”或“提升IRQL”,它会完全阻止线程调度。
自旋锁最终允许内核避免“大内核锁”(当内核进入内核并在退出时释放时获得的锁),并对内核原语进行粒度锁定,从而在多核机器上实现更好的多处理,从而获得更好的性能。
编辑:出现了一个问题:“这是不是意味着我应该尽可能地使用旋转锁?”我会试着回答这个问题:
正如我所提到的,只有在预期等待时间小于一个量程(读取:毫秒)并且抢占没有多大意义(例如内核对象不可用)的地方,自旋锁才有用。
如果等待时间未知,或者处于用户模式,则自旋锁的效率很低。在检查自旋锁是否可用时,您在等待的核心上消耗了100%的CPU时间。您可以防止其他线程在该核心上运行,直到您的量程到期。此场景仅适用于内核级的短突发,而不太可能是用户模式应用程序的选项。
这里有一个关于解决这个问题的问题:Spinlocks, How Useful Are They?
发布于 2009-12-24 16:40:03
假设资源受锁保护,想要访问该资源的线程需要首先获取锁。如果锁不可用,线程可能会重复检查锁是否已被释放。在此期间,线程忙着等待,检查锁,使用CPU,但不做任何有用的工作。这样的锁被称为旋转锁。
发布于 2009-12-24 16:38:37
这是一个循环,它会一直循环,直到满足某个条件:
while(cantGoOn) {};https://stackoverflow.com/questions/1957398
复制相似问题