0

我有一个非常简单的 hello world 程序,它打印 hello world,然后使用一对 gettimeofday() 将 usleep(50) 调用括起来。如果两次 gettimeofday() 调用之间经过的时间大于 5ms,我将 printf。

在 Linux Vmware VM 上运行时,甚至在本机 Linux 笔记本电脑上运行时,我注意到有时我会从 5ms 到 10ms 获得经过的时间。与 VMware 相比,我在本机 Linux 笔记本电脑上看到的 printf 少得多,但它仍然出现。在本机 Linux 笔记本电脑上,经过的时间甚至高达 20 毫秒,但我看到的 printf 比在 VMWare 上要少得多。

为什么会这样?VMware 或本机 Linux 笔记本电脑都不是很忙。

如何减轻这种情况?

感谢任何见解。

4

1 回答 1

0

如果您的目标是编写具有确定执行时间的软件,我会建议以下内容(按照猜测影响的粗略顺序):

  1. 确保您有一个运行 Linux on-the-metal 的测试环境。即没有 VM 设置,因为 Linux 将始终受主机操作系统调度程序的支配。

  2. 请注意,任何打印都意味着执行某种 I/O。根据驱动程序的不同,I/O 可能会在完成之前阻塞内核线程或其他进程(例如,由于锁争用),因此调用类似内容的时间puts("Hello, World!")会有很大差异。

  3. 阅读 Linux 提供的不同调度策略;手册页sched_setscheduler是一个很好的起点。注意:nice不是您要寻找的机器人

  4. 如果您的系统使用交换,通过将应用程序的内存锁定在 RAM 中来消除由页面错误引起的延迟;请参阅mlock和朋友的手册页。

  5. 将您的内核换成一个配置了CONFIG_PREEMPT_RT相关设置的内核,例如线程 IRQ、优先级反转安全互斥锁等。

  6. 阅读Real-Time Linux Wiki上的所有内容,然后再阅读一遍。

于 2020-09-26T16:44:09.460 回答