在我的应用程序中,线程需要暂停一小段时间(100个时钟周期)。暂停的一种方法是调用nanosleep,但我想它需要对内核进行系统调用。现在我想暂停而不去内核。
请注意,我有足够的内核来运行我的线程,并且我将每个线程绑定到一个单独的内核,因此即使是可以暂停内核一段时间的指令也会很好。我正在使用x86。我只是希望线程在暂停时暂停。我不希望繁忙的循环或系统调用内核。是否有可能做到这一点?我可以暂停一个帖子的最短时间是多少?
答案 0 :(得分:7)
_mm_pause
是可行的方法。
不幸的是,它提供的延迟可能随每个处理器系列而变化:
http://siyobik.info/main/reference/instruction/PAUSE
Linux上GCC的示例用法:
#include <xmmintrin.h>
int main (void) {
_mm_pause();
return 0;
}
在启用MMX的情况下编译:
gcc -o moo moo.c -march=native
此外,您始终可以使用内联汇编程序:
__asm volatile ("pause" ::: "memory");
对于某些英特尔工程师,您可能会发现这对确定暂停成本非常有用:
NOP指令可以在0.4-0.5时钟和PAUSE指令之间 可以消耗38-40个时钟。
http://software.intel.com/en-us/forums/showthread.php?t=48371
答案 1 :(得分:1)
你为什么不旋转等自己?您可以在循环中重复调用rdtsc指令以获取时钟周期计数,然后在差值超过100个时钟周期时停止。
我认为这是一个交易系统,这是一种常见的技术
答案 2 :(得分:0)
这取决于你的暂停意味着什么。如果暂停您希望在短时间内停止线程,则只有操作系统可以执行此操作。
但是,如果暂停需要非常短的延迟,可以使用繁忙循环执行此操作。使用这样一个循环的问题是你不知道它真正运行了多长时间。你可以估计它,但中断可以使它更长。
答案 3 :(得分:0)
一般来说,对于这么短的延迟,我认为系统调用是不切实际的,因为系统调用+调度+上下文切换的开销再次返回会比你的停顿时间长,因为你似乎已经意识到了。
你剩下的就是旋转(忙等待)来产生延迟。例如,您可以循环读取TSC值以了解旋转量(或其他处理器的适用循环计数器寄存器)
是的,像这样的旋转确实会浪费电力,如果你在具有多个硬件线程的CPU上运行,就像多核通常所暗示的那样,你也不必要地从其他线程中获取执行槽,但除非你有一个非常非常的非常低的开销系统调用和调度机制以及高分辨率计时器,我想说这是不可能的。
答案 4 :(得分:-1)
sleep
或select
- 内核;或者有一个循环有浪费时间。
答案 5 :(得分:-2)
我认为你唯一的希望是获得准确的时间使用timer_create
并且通过信号传递计时器到期时间。使用实时调度。
我不确定它可能有什么用处,因为你不能在如此小的时间窗口内执行任何IO,因此如果你的代码运行1000次并且每次运行之间有100ns的差距就没关系,或1000次,最后100ms的间隙。