rust 线程休眠时间比预期长

z9ju0rcb  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(140)

我有这个代码:

let k = time::Instant::now();
    thread::sleep(time::Duration::from_micros(10));
    let elapsed = k.elapsed().as_micros();
    println!("{}", elapsed);

字符串
我的输出总是在70到90之间。我希望它是10,为什么这个数字是7倍?

bpzcxfmw

bpzcxfmw1#

这实际上与Rust没有任何关系。
在一个典型的多处理、用户交互式操作系统(即,您使用过的每个消费者操作系统)上,您的线程并不特殊。它是众多中的一个,CPU需要共享。
你的操作系统有一个叫做调度程序的组件,它的工作是共享硬件资源。它会经常从CPU上 Boot 你的线程。这通常发生在:
1.每次系统调用时
1.每次中断命中CPU时
1.当调度程序将您踢出以给予其他进程/线程一个机会时(这称为抢占,通常每秒发生10次)
因此,您的用户态进程不可能以如此高的精度执行任何与时间相关的操作。
您可以探索以下几种解决方案:

  • 增加操作系统提供给您的CPU数量。一些想法:
  • 提高流程的优先级
  • 将线程固定到一个特定的CPU核心,以给予其独占使用(这意味着您会损失吞吐量,因为如果您的线程空闲,则没有其他线程的工作可以借用该CPU)
  • 切换到real-time operating system,它可以保证延迟和定时。
  • 将工作卸载到一些专门的硬件上,而不涉及您的进程。
  • 例如,将正弦波生成卸载到硬件声卡,将WiFi无线电处理卸载到WiFi控制器等。
  • 使用您自己的微控制器来执行实时操作,并通过I2C或SPI之类的东西与之通信。

如果您在userland进程上运行一些简单的代码,我认为最简单的方法就是固定您的进程。您现有的代码将按原样工作,您只会失去其中一个核心的吞吐量(但幸运的是,您有多个核心)。

相关问题