如何在 XXX 毫秒内阻止 Linux 机器上的所有其他进程?
Posted
技术标签:
【中文标题】如何在 XXX 毫秒内阻止 Linux 机器上的所有其他进程?【英文标题】:How do I block all other processes on a Linux machine for XXX milliseconds? 【发布时间】:2015-08-01 01:03:02 【问题描述】:我正在使用 Linux 嵌入式 SMP 系统,该系统使用 ALSA 和外部 USB 音频设备进行音频 I/O,使用 3.6.6。核心。问题:导致音频流中断的系统故障很少(每几周一次)。虽然很难确定,但这些故障看起来像是将整个系统锁定了几十毫秒。
我可以编写 ALSA 代码来在这些故障之一之后恢复,但由于它是 ALSA,因此需要一些试验和错误。再加上必须等待数周才能再次发生,我会用撬棍在小溪上。我真的需要一种方法来按需引发问题。
我想编写一个 C 程序,它以 root 身份运行并在给定的毫秒数内阻塞系统上的所有其他进程。我想这将涉及禁用中断,执行延迟循环(因为计时器可能会失败),然后恢复中断。但是,我必须这样做,以免整个系统崩溃。
关于如何编写这样的程序有什么想法吗?
【问题讨论】:
在尝试修复或解决方法之前了解根本原因会很好。音频流“死”的本质是什么?它只发生在您自己的应用程序中,还是也发生在标准 ALSA 实用程序中,例如aplay
?如果是后者,那么可能存在值得修复的驱动程序错误(或提请其他人注意修复它)。
问题是它每隔一周发生一次,或者在八周后发生一次。这意味着通常的“观察问题、分析、迭代”方法只是无用的这一面。而且,它发生在 ALSA 的深处,这是一个臭名昭著的(至少在我的工程团队中)令人困惑且记录不充分的系统。这意味着仔细检查系统也是没有回报的。 (顺便说一句,我们猜测这是 ALSA 错误 bugzilla.redhat.com/show_bug.cgi?id=798844,据称已在内核 3.6.2 中修复,但仍在报告中。)
该问题可能是某些设备驱动程序禁用中断时间过长造成的。无论如何,在 x86 上,您可以获得使用 iopl()
禁用中断的权限。
【参考方案1】:
您可以尝试提高进程的优先级,然后使用“实时”调度算法之一(例如 SCHED_FIFO)。这将有助于确保您的进程得到更一致的调度,即使其他进程正在运行。
【讨论】:
该应用程序以 root 身份运行,在 -20 之前很好。我们的一些(不是全部)线程作为 SCHED_FIFO 运行。仍然发生在所有线程上。【参考方案2】:好吧,根据CL的提示,以及来自http://www.tldp.org/HOWTO/text/IO-Port-Programming的信息,我写了以下代码:
#include <stdio.h>
int main(int argc, char *argv[])
long i, j;
printf("About to lock system!\n");
// Boost I/O privilege level
iopl(3);
// Clear interrupt flag, masking interrupts
asm("cli");
// Wait about a second (with some hijinks to keep
// the loop from being optimized into oblivion)
j = 1;
for (i = 0; i < 250000000; i++)
j *= i;
// Restore interrupt flag, restoring interrupts
asm("sti");
// Restore I/O privilege level
iopl(0);
printf("Phew! Survived!\n");
return 0;
以root身份运行时,它可以工作!虽然不是所有的东西都被暂停(我不清楚什么是什么不是),但足够多的锁定让我的 ALSA 流非常好地失败了。所以,现在我可以激发这个问题并确保我的代码可以处理它。
注意:我假设在 CLI 和 STI 之间,系统计时例程会由于缺少中断而失败。然而,当我尝试使用 usleep() 时,时间代码起作用了!但是,整个代码实际上并没有,因为调用重新启用了中断,使得该工具无用。因此使用了一个简单的延迟循环。
【讨论】:
以上是关于如何在 XXX 毫秒内阻止 Linux 机器上的所有其他进程?的主要内容,如果未能解决你的问题,请参考以下文章
细粒度的 nanosleep 在 Linux 上的 c++ 程序中不节能
如何解决 mysql 警告:“InnoDB:page_cleaner:1000ms 预期循环花费了 XXX 毫秒。设置可能不是最佳的”?