什么是多线程环境中的忙旋转?
什么是多线程环境中的“忙碌旋转”?
它是如何有用的,如何在多线程环境中用java实现它?
它以何种方式可用于提高应用程序的性能?
什么是多线程环境中的“忙碌旋转”?
它是如何有用的,如何在多线程环境中用java实现它?
它以何种方式可用于提高应用程序的性能?
其他一些答案错过了忙于等待的真正问题。
除非您谈论的是担心节省电力的应用程序,否则消耗CPU时间本身并不是一件坏事。只有当有其他线程或进程已准备好运行时,它才是坏的。当其中一个准备运行的线程是忙等待循环正在等待的线程时,这真的很糟糕。
这才是真正的问题所在。在正常操作系统上运行的正常用户模式程序无法控制哪些线程在哪些处理器上运行,正常操作系统无法区分忙于等待的线程和正在工作的线程之间的区别,即使操作系统知道线程正在忙于等待, 它无法知道线程正在等待什么。
因此,忙碌的服务员完全有可能等待许多毫秒(实际上是永恒的),等待事件,而唯一可能使事件发生的线程位于场边(即在运行队列中),等待轮到它使用CPU。
忙等待通常用于严格控制哪些线程在哪些处理器上运行的系统。当您知道将导致事件的线程实际上正在其他处理器上运行时,忙于等待可能是等待事件的最有效方法。当您为操作系统本身编写代码时,或者当您编写在实时操作系统下运行的嵌入式实时应用程序时,通常就是这种情况。
凯文·沃尔特斯(Kevin Walters)写了一篇关于等待时间非常短的案例。在普通操作系统上运行的CPU密集型普通程序可以被允许在每个时间片中执行数百万条指令。因此,如果程序使用自旋锁来保护仅由几条指令组成的关键部分,那么任何线程在关键部分时都不太可能丢失其时间片。这意味着,如果线程 A 发现自旋锁已锁定,则持有该锁的线程 B 实际上很可能在不同的 CPU 上运行。这就是为什么在普通程序中使用自旋锁是可以的,因为您知道它将在多处理器主机上运行。
忙等待或旋转是一种技术,其中进程重复检查条件是否为真,而不是调用等待或睡眠方法并释放 CPU。
1.It 主要在多核处理器中有用,其中条件将很快实现,即在毫秒或微秒内
2.不释放CPU的优点是,所有缓存的数据和指令都不受影响,如果此线程在一个内核上挂起并带回另一个线程,则可能会丢失