如何在 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 机器上的所有其他进程?的主要内容,如果未能解决你的问题,请参考以下文章

一段时间内阻止多次登录不成功的请求

发送短信后60秒内阻止点击 + 手机号码检测

细粒度的 nanosleep 在 Linux 上的 c++ 程序中不节能

在linux中从其他机器挂载文件夹

如何防止 LaTeX 连字符包含破折号的单词?

如何解决 mysql 警告:“InnoDB:page_cleaner:1000ms 预期循环花费了 XXX 毫秒。设置可能不是最佳的”?