如何无需轮询或休眠实现NMI中断的等待?
无需轮询的NMI中断等待方案
你的轮询方案会周期性占用CPU资源(哪怕sleep 1也会定时唤醒进程),可以通过文件系统事件监控的方式实现无轮询等待,以下是实用的优化方案:
方案一:使用inotifywait监控/proc/interrupts变化
inotifywait能监听文件的修改事件,只有当/proc/interrupts内容更新时才触发检查逻辑,完全避免轮询和休眠机制的资源浪费。
实现步骤
先安装依赖工具包:
# Debian/Ubuntu 系列系统 sudo apt install inotify-tools # RHEL/CentOS 系列系统 sudo yum install inotify-tools替换后的优化脚本:
#!/bin/bash # 阻塞等待/proc/interrupts的修改事件,无变化时不占用CPU while inotifywait -e modify /proc/interrupts >/dev/null; do # 提取NMI中断计数并去除前导零和非数字字符 RES=$(grep NMI /proc/interrupts | sed 's/[^0-9]*//g' | sed 's/^0*//') # 检查计数非空(即NMI中断已发生) if [ -n "$RES" ]; then echo "DONE" exit 0 fi done
原理说明
inotifywait -e modify /proc/interrupts会进入阻塞状态,直到内核更新/proc/interrupts文件(NMI中断发生时内核会同步更新该文件的计数),期间不会消耗额外CPU资源。- 仅在文件内容发生变化时才执行检查逻辑,相比轮询模式效率提升明显。
方案二:内核kobject uevent监听(进阶)
如果需要更底层的控制,可以通过监听内核uevent事件捕获中断相关通知,但这种方式需要调整内核配置并编写更复杂的处理逻辑,对于普通场景来说inotifywait方案已经足够简洁高效。
注意事项
/proc/interrupts是内核生成的虚拟文件,多数主流内核版本都支持inotify监控其修改事件,若遇到兼容性问题可手动触发NMI中断验证脚本响应情况。- 脚本需以root权限运行,确保能正常读取
/proc/interrupts的完整内容。
内容的提问来源于stack exchange,提问作者Maestro
相关产品推荐
相关产品推荐

