multiprocessing - 在多处理器系统中禁用中断的过程是什么?
问题描述
我有一个教科书声明说在多处理器系统中不建议禁用中断,并且会花费太多时间。但我不明白这一点,谁能告诉我多处理器系统禁用中断的过程?谢谢
解决方案
在 x86(和其他架构,AFAIK)上,启用/禁用中断是基于每个内核的。您不能全局禁用所有内核上的中断。
软件可以通过处理器间中断 (IPI) 或原子共享变量在内核之间进行通信,但即便如此,将所有内核安排在一个自旋循环中等待来自该内核的通知,即它们可以重新运行,这将是非常昂贵的。启用中断。(中断在其他内核上被禁用,因此您不能向他们发送 IPI 以让他们知道您何时完成了原子操作块。)您必须中断所有其他 7 个内核(例如,在 8 路 SMP 上)系统)正在做,有许多周期的往返通信开销。
这基本上是荒谬的。更清楚地说,您不能全局禁用所有内核的中断,而且除了中断处理程序之外,它无论如何都无济于事。 这在理论上是可能的,但它不仅“慢”,而且不切实际。
如果其他线程正在其他内核上运行,则禁用一个内核上的中断不会使某些事情成为原子性的。禁用中断适用于单处理器机器,因为它使上下文切换变得不可能。(或者它使同一个中断处理程序不可能中断自己。)
但我认为我的困惑是,对我来说,1 核和 8 核之间的差异对我来说并不是一个大数字。为什么从中断中禁用所有这些是耗时的。
单处理器以外的任何东西都是基本的质量差异,而不是数量上的差异。即使是双核系统,如早期的多插槽 x86 和第一个双核单插槽 x86 系统,也会完全改变您的原子性方法。您实际上需要锁定或其他东西,而不仅仅是禁用中断。(例如,早期的 Linux 有一个很多东西都依赖的“大内核锁”,然后才对不相互冲突的单独事物进行细粒度锁定。)
根本区别在于,在 UP 系统上,只有当前 CPU 上的中断才能导致事情与当前代码正在执行的操作异步发生。(或来自设备的 DMA...)
在 SMP 系统上,其他内核可以同时做自己的事情。
对于多线程,通过在当前 CPU 上禁用中断来获得指令块的原子性是完全无效的;线程可以在其他 CPU 上运行。
对于中断处理程序中某些内容的原子性,如果此 IRQ 设置为仅中断此内核,则禁用此内核上的中断将起作用。因为没有来自其他核心的干扰威胁。
推荐阅读
- javascript - 如何在Vue中对对象数组进行排序和过滤
- vba - 无法点击网页中的按钮
- css - 在新的 Unity WebGL 模板中添加全屏显示方式
- java - Spring Boot 应用程序无法通过 TLSv1.2 连接到 RabbitMQ 服务器
- c# - CsvHelper“TypeConverterException:单个字段不支持转换 IEnumerable 类型。”
- java - 将 BSON MongoDB 文档映射到 MyClass.class 对象?
- python - 每前 n 行重复 m 次
- sql-server - SSIS 无法运行创建 excel 文件或另存为复制 excel 文件作为 VBScript 罚款,(没有错误,但执行后没有任何变化)
- for-loop - FOR循环错误“找不到文件”并在Win10 CMD中过早关闭BAT文件
- python - 雪花 PyCharm 连接