我正在阅读“Linux 设备驱动程序,第 3 版”并且不完全理解描述中断处理程序的部分。我想澄清一下:
我相信我对 Top/Bottom half 的模型非常了解,根据它,只要 TopHalf 正在执行,中断就会被禁用,因此无法重新输入处理程序,对吗?
但是高优先级中断呢?它们是否仅受 vanilla Linux 或特定实时扩展的支持?如果低优先级中断被高优先级中断中断会发生什么?
据我所知,Linux 具有“快速中断”,即使用 SA_INTERRUPT 标志请求的中断;在当前 CPU 上禁用所有其他中断的情况下执行快速中断。但是它与正常的中断处理程序行为(在哪里)有什么不同?
警告:不要在不知道其含义的情况下尝试此问题中列出的命令。
对不起,如果这是重复的。我很惊讶地发现一个简单的命令
echo $(yes)
Run Code Online (Sandbox Code Playgroud)
冻结了我的计算机(实际上它严重滞后于计算机而不是冻结,但滞后严重到让人认为它已冻结)。键入CtrlC或CtrlZ在键入此命令后立即键入似乎并不能帮助我从这个错误键入的命令中恢复过来。
另一方面
ls /*/../*/../*/../*/../*/
Run Code Online (Sandbox Code Playgroud)
是一个众所周知的漏洞,它也使计算机严重滞后于最佳状态并使计算机崩溃至最坏状态。
请注意,这些命令与众所周知的分叉炸弹有很大不同。
我的问题是:有没有办法在我开始在 shell 中执行这些命令后立即中断这些命令,这些命令会立即建立大量的 shell 命令行选项?
我的理解是,由于 shell 扩展是在命令执行之前完成的,通常的中断命令的方法不起作用,因为在发生滞后时命令甚至没有运行,但我也想确认我的理解是正确的,并且我非常有兴趣学习在使用过多内存之前取消 shell 扩展的任何方法。
我不是在寻找内核如何在低内存下工作。我也不是在寻找SysRq在系统已经严重滞后时可能会有帮助的过度杀伤力。我也不是在寻找预防方法,例如ulimit在记忆中强加一个。我正在寻找一种方法,可以在它滞后于系统之前有效地从外壳本身内部取消巨大的外壳扩展过程。我不知道是否有可能。如果评论不可能,请同时留下一个答案,指出这一点,最好附上解释。
我选择不在原始问题中包含任何特定于系统的信息,因为我想要一个一般性的答案,但如果这很重要,这里是有关我的系统的信息:Ubuntu 16.04.4 LTS使用gnome-terminal和bash 4.3.48(1),运行x86_64系统。不涉及虚拟机。
假设我有 4 个物理内核(索引为 0-3)并且我将内核 1-3 专用于用户应用程序的屏蔽,并尝试将所有系统线程引导到内核 0 上。我正在关注此处的答案并使用cset:
# /usr/local/bin/cset shield --cpu 1-3
cset: --> activating shielding:
cset: moving 145 tasks from root into system cpuset...
[==================================================]%
cset: "system" cpuset of CPUSPEC(0) with 145 tasks running
cset: "user" cpuset of CPUSPEC(1-3) with 0 tasks running
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法将所有内核线程移动到核心 0 上:
# cset shield --kthread on
cset shield --kthread on
cset: --> activating kthread shielding
cset: kthread shield activated, moving 175 tasks into system cpuset...
[==================================================]%
cset: **> 30 …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关 jiffies 的信息,它会针对每个定时器中断进行更新。定时器中断的频率由编译时间常数 HZ 决定。
X86 上有很多硬件设备。1. RTC 2. 可编程中断定时器 3. 本地 APIC 4. 时间戳计数器 5. HPET
这是 Linux 内核用来增加 jiffie 值的设备。
Robert Love 的书说“可编程中断定时器”。是否还有效。
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc
Run Code Online (Sandbox Code Playgroud)
上面的 sys 文件是否提供了该信息?
在硬件和软件中断流程中如何处理排队?更准确地说,我有以下疑问
让我们假设我有一台带有 2 个 CPU 的机器。CPU1 正在处理进程 P1,CPU2 正在处理进程 P2。进程 P3 正在等待执行。现在 CPU1 得到了硬件中断 (I1)。因此,CPU1 上下文切换到 I1 的中断服务程序 (ISR)。
注意:我们可以忽略中断的下半部分,而认为所有中断都只有上半部分。
虽然我知道很多数据包处理(CRC 计算、数据包分段处理等)可以卸载到 NIC,但是每个数据包是否仍然会导致 CPU 中断?如果网卡处于混杂模式,有什么区别吗?
我有两个关于 Linux 内核的问题。具体来说,有没有人确切地知道 Linux 在定时器中断中做了什么?是否有一些关于此的文档?在构建内核时更改 CONFIG_HZ 设置会产生什么影响?
提前致谢!
我一直在阅读有关线程和中断的一些内容。并且有一节说使用线程进行并行编程更简单,因为我们不必担心中断。
但是,如果不是中断,则发出阻塞系统调用释放信号的机制是什么?
例子
我在我的线程中读取 i 文件,该线程使用阻塞系统调用从磁盘读取文件。
在此期间,其他线程正在运行。
在某个时刻,文件已准备好从硬盘中读取。
它是否通过硬件中断通知处理器这一点,以便它可以对请求文件的线程进行上下文切换?
请评论下面的句子:
在没有 rt 补丁的标准 Linux 内核上,中断不能中断正在进行的系统调用。当从硬盘获取数据时,我们的机器没有停止工作的原因是我们用于该操作的系统调用是阻塞的。阻塞意味着一旦它向硬盘发出请求,它将进程状态更改为阻塞,并自愿放弃处理器时间。没有办法在非实时内核上中断正在进行的系统调用。
这是我对主题的理解,但是,我不确定它是否正确。
interrupt ×10
linux ×6
scheduling ×6
kernel ×5
cpu ×2
linux-kernel ×2
bash ×1
centos ×1
command-line ×1
ethernet ×1
kill ×1
networking ×1
process ×1
thread ×1