SMP调度在Linux内核中如何工作? (ARM架构)

2023-11-23

在Linux中,当经过特定时间量时,调度程序将被触发。据我了解,计时器触发一个中断,进而触发对schedule.

在SMP系统中,我在《Understanding the Linux Kernel》一书中读到“每个处理器都独立运行scheduler()函数”。 这是否意味着每个定时器中断都会触发每个CPU同时进行重新调度?


The ARM SMP systems support two types of interrupts. SPI (shared peripheral interrupt) and PPI (peripheral private interrupts). The PPI is a per-CPU interrupt source. A special case for SMP of the PPI is an SGI (software generated interrupt); this is a CPU-to-CPU interrupt that is used to signal from one CPU to another in the SMP world (called IPI).Note1

A PPI定时器可用于允许每个 CPU 使用“无滴答调度”;也就是说,定时器中断是通过对未来时间事件的了解来安排的(谷歌计时轮,看看NO_HZ文档, ETC)。当前的Linux内核不使用这个特定的PPI定时器来进行调度。它仅用作延迟循环时间源。相反,全局 PPI 定时器用来。该定时器可以选择性地中断每个CPU,但寄存器组对于所有CPU来说是全局的。一个特定的CPU可以为自己安排一个中断;时基是全球性的。

复杂之处在于,任务必须从一个 CPU 迁移到另一个 CPU 才能平衡 CPU 之间的工作。此外,Linux 内核的核心代码/调度程序是为多个 CPU(或架构)编写的,它们可能没有这些per-CPU中断源。明确的答案可能取决于您的内核版本和使用的调度程序(或更一般的内核配置)。一般来说,繁忙的 CPU 会执行以下操作移民,其他 CPU 可能会在计时器滴答时唤醒,只是为了查看其中的任务是否应该运行(可能是迁移的进程)。如果NO_HZ生效后,某些 CPU 可能根本无法唤醒;如果发生迁移,他们将获得 IPI。

无论如何,没有什么是ARM除了时钟源之外,还具体体现在CPU调度中。这是可能的ARMSMP系统没有一个全局PPI定时器。在这种情况下,每个 CPU 都可能会唤醒以服务中断,但大多数 CPU 可能会立即休眠。由于糟糕的定时器/中断控制器设计或糟糕的系统配置,这种情况可能发生在任何系统上。然而,即使在这些情况下,除非需要,否则代码也不会调用调度程序。

See: SMP 上的 Linux 调度程序(这可能是重复的,尽管在我看来答案不是很好),IBM 的完全公平调度程序文章和O'Reillys Linux 内核调度程序章节。

Note1:这实际上是GIC (or 通用中断控制器)术语。然而,大多数 ARM SMP 系统都使用这种中断控制器。它与 Cortex-A CPU 捆绑在一起,并作为某些 ARMv6 系统的外部软件组件。 ARM SMP 系统可以使用其他控制器,但这种情况可能极其罕见或根本不存在。

Edit:有两个ARM片上定时器;与 SOC 供应商计时器相比,这些计时器很有用,因为每个 Cortex-A 都有它们。其中之一用于代替“计数循环”来实现延迟。这在中断的情况下效果更好。我认为理解 SMP 调度并不重要,您可以忽略该注释,只知道该源文件不用于调度。这是我第一个看到的。如果您发现它确实分散了您的注意力,我将删除该信息。

See 这张纸 on 正时轮;它是关于“IP”/网络,但是概念NO_HZ很相似。 IE。不要每 10 毫秒中断一次,只是为了增加刻度。在里面NO_HZ在这种情况下,每个 CPU 都可以根据驱动程序和子系统发出的请求类型来设置未来的唤醒时间。 IE,schedule_work()需要在 175ms 内运行,然后将计时器设置为 CPU 的该值,并且我们不会唤醒 17 次(如果系统节拍为 10mS),而只是将节拍增加 17 次。某些 CPU 可能需要超时驱逐当前进程以运行另一个进程以进行多任务处理,因此调度程序本身可以设置一个计时器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SMP调度在Linux内核中如何工作? (ARM架构) 的相关文章

  • 尝试映射大页面 (1GB) 时 mmap 失败

    我做了什么 使用 root 启用大页 我的系统支持 1MB 大页 echo 20 gt proc sys vm nr hugepages 将大页文件系统挂载到 mnt hugepages mount t hugetlbfs nodev mn
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • DS-5:什么是 FVP、RTSM、基础模型、AEM 模型、快速模型、CADI?

    DS 5 模拟器使用了很多术语 如 FVP RTSM 快速模型 基础模型 AEM 模型 CADI Arm的文档中提供的解释不是很清楚 这些术语的含义是什么 作为 DS 5 的最终用户我应该关心哪些术语 Model 软件模拟的行业术语 就 A
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • gdb 不会从外部架构读取核心文件

    我正在尝试在 Linux 桌面上读取 ARM 核心文件 但似乎无法找出我的核心文件 有什么方法可以指示 gdb 我的核心文件是什么类型吗 file daemon daemon ELF 32 bit LSB executable ARM ve
  • saber sd 如何在没有 SPL 的情况下直接从 uboot 启动

    sabre sd 基于 imx 6 最大内部 RAM 约为 150Kb 然而 uboot 足够大 可以容纳在这个空间中 在这个场景中事情是如何进行的 https community freescale com docs DOC 95015
  • 为什么 GCC 交叉编译不构建“crti.o”?

    在尝试为arm构建gcc 4 x x交叉编译器时 我陷入了缺失的困境crti o文件在 BUILD DIR gcc子目录 An strace在顶层Makefile表明编译后的xgcc正在调用交联器ld with crti o 作为一个论点
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • 在网络处理中使用自旋变体

    我编写了一个与网络过滤器挂钩交互的内核模块 网络过滤器挂钩在 Softirq 上下文中运行 我正在访问全局数据结构 哈希表 来自软中断上下文以及进程上下文 进程上下文访问是由于sysctl文件用于修改哈希表的内容 我正在使用 spinloc
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 使用sk_buff添加以太网帧头

    我有一个捕获传出互联网流量的内核模块 Netfilter hook LOCAL OUT 在此挂钩处 仍然没有以太网标头 我构建了以太网头并且可以使用了 但是如何将其连接到skb这样我就可以将整个 skb 结构发送到dev queue xmi
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 当 mov 指令导致页面错误并且在 x86 上禁用中断时会发生什么?

    我最近在自定义 Linux 内核 2 6 31 5 x86 驱动程序中遇到一个问题 其中 copy to user 会定期不将任何字节复制到用户空间 它将返回传递给它的字节数 表明它没有复制任何内容 经过代码检查 我们发现代码在调用 cop
  • 让 TensorFlow 在 ARM Mac 上使用 GPU

    我已经安装了TensorFlow在 M1 上 ARM Mac 根据这些说明 https github com apple tensorflow macos issues 153 一切正常 然而 模型训练正在进行CPU 如何将培训切换到GPU
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • RXJava 调度程序/线程如何为不同的操作员工作?

    谁能帮我解释下面的代码正在运行哪个调度程序 Completable complete subscribeOn http Schedulers io observeOn AndroidSchedulers mainThread delay 5
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪

随机推荐

  • 在 Windows 10 的命令提示符中,“py”有效,但“python”无效[重复]

    这个问题在这里已经有答案了 我在我的电脑上安装了Python 当我打字时python在命令提示符中我收到以下消息 python is not recognized as an internal or external command ope
  • 在控制台应用程序中使用 ELMAH

    我刚刚开始使用 ELMAH 并且是它的粉丝 我的团队支持大量 Web 应用程序 令我特别兴奋的是 ELMAH 允许我们将每个应用程序的异常保存到同一个 MS SQL 数据库表中 我们还支持一些控制台 DLL 和桌面应用程序 是否可以使用 E
  • MAMP - phpMyAdmin #2002 - 无法通过套接字“/Applications/MAMP/tmp/mysql/mysql.sock”连接到本地 MySQL 服务器

    我正在研究 MAMP phpMyAdmin 一切都运行良好 直到我查询ALTER TABLESQL 选项卡中的语句 操作时间太长而无法结束 因此我决定刷新我的页面 从现在起 我无法再联系 phpMyAdmin 并且我总是收到以下消息 200
  • 在Win10上调试使用VS2015编译的C++ SDL2程序中的加载时间错误

    我正在使用 Visual Studio 2015 在 64 位 Windows 10 上使用 SDL2 用 C 编写一个项目 我最近购买了一台新的 Windows 10 笔记本电脑并从 github 克隆了我的项目 我的项目编译正确 但运行
  • 使用 PHP 登录后重定向到上一页

    假设我想导航到联系页面 但为了到达那里 该网站要求我登录 登录后 我应该被重定向到联系页面 但我在其他地方 我应该怎么做才能在登录后重定向到我想要的页面 我有一种强烈的感觉 这与会议有关 但尽管如此 应该采取什么方法 您可以采用三种通用方法
  • 我可以将匿名类型传递给我的 ASP.NET MVC 视图吗?

    我刚刚开始使用 ASP NET MVC 现在它还处于测试阶段 在我的代码中 我运行一个简单的 LINQ to SQL 查询来获取结果列表并将其传递到我的视图 这种事 var ords from o in db Orders where o
  • 使用电子邮件 ID 从 Active Directory 查找用户名

    我通过传递电子邮件 ID 从 Active Directory 查找用户名 它运行良好 但获取用户名需要30 40秒 还有其他更好的方法通过电子邮件地址从 Active Directory 查找用户名吗 请参考我的代码 using Prin
  • 外部化 Eclipse 插件的 plugin.xml 中的字符串

    如何在 Eclipse 插件的 plugin xml 中外部化字符串 右键单击插件项目 gt PDE 工具 gt 外部化字符串不会显示我的插件 我现在正在尝试手动执行此操作 我在plugin properties 中添加了条目 并用 符号后
  • 将元素拖放到 iframe 中。可放置区域坐标错误且碰撞错误

    我需要在 Web 应用程序中在网页中存在的元素和 iframe 内的元素之间实现拖放功能 在您开始抱怨 iframe 之前 出于技术原因我需要它 这不是一个选项 我的页面中的元素可以拖动到 iframe 内的目标可放置元素中 我已经成功地使
  • 如何设置Mockito模拟类进行Android单元测试

    如果我做一个简单的测试用例 比如 Test public void myTest throws Exception Spanned word new SpannedString Bird int length word length 抛出异
  • 在多个分支中进行 git Cherry-pick

    有时我会遇到我发现的情况 错误并更正它 然后提交更改 此提交可以在所有受影响的项目中进行挑选 分支 我非常喜欢的一个功能 但事实证明这很乏味 查看受影响的 5 10个分支 选择提交 或容易出错 樱桃采摘 在该分支上工作时 有时几天 几周后
  • 如何不序列化 JSON 对象上的 __type 属性

    我从 a 返回的每个对象WebMethod of a ScriptService被包装到一个 JSON 对象中 其中的数据位于名为的属性中d 没关系 但我不想要额外的 type属性要提供给客户端 因为我使用 jQuery 进行手动处理 是否
  • SQL Server 中的查询持续时间估计

    我在 Oracle 10g 中看到了一个功能 可以估计长时间运行的查询的剩余时间 我想知道这在 SQL Server 中是否也可能 至少在 2008 年 假设我有一个非常大的表 其中有数千万行 索引良好等 并且我需要搜索一些特定的行 我知道
  • 使用 unicode 字符进行 Angular JS 电子邮件验证

    我有一个应用程序的注册表单 Angular js 负责其验证 当 Angular js 不接受包含撇号的电子邮件地址时 我遇到了一个问题 Pear 电子邮件受保护 我发现 AngularJs 不喜欢电子邮件地址中的 unicode 字符 有
  • python-3.6 中带有“f”前缀的字符串

    我正在尝试Python 3 6 在查看新代码时 我偶然发现了这种新语法 f My formatting string 看来我们可以做这样的事情 gt gt gt name George gt gt gt print f My cool st
  • 如何使用带有集成 Windows 身份验证的 MSDeploy 和 TeamCity 进行部署?

    当我传入用户凭据时 我的 MSDeploy 部署与 TeamCity 完美配合 命令行参数 使用环境变量作为某些值 是 MSBuild exe Web csproj P 配置 env Configuration P DeployOnBuil
  • 为什么我们不能在作为方法默认参数的 lambda 中捕获它?

    我正在尝试捕捉thislambda 函数中的指针 用作方法的默认参数 我的目标是从 lambda 中调用此类的方法 这需要捕获this指针 但是 以下代码会导致错误 错误 C3639 作为默认参数一部分的 lambda 只能有一个 init
  • Twilio 呼叫转移

    我对 Twilio 的呼叫转接概念有疑问 我想创建一个应用程序 让用户将其现有号码转发到 Twilio Twilio 处理必要的信息 并将呼叫转发回用户 然而 当我尝试实现这一点时 发生了无限循环 呼叫被转发到 Twilio Twilio
  • RxJava 2 / Retrofit 2 - NetworkOnMainThreadException

    我需要执行请求 如果我的令牌已过期 我需要刷新它并重试该请求 这就是我尝试执行此操作的方式 目前我可以刷新令牌 但它会向我抛出 NetworkOnMainThreadException 它完成了请求 更新了令牌并到达了日志 但是这个异常让我
  • SMP调度在Linux内核中如何工作? (ARM架构)

    在Linux中 当经过特定时间量时 调度程序将被触发 据我了解 计时器触发一个中断 进而触发对schedule 在SMP系统中 我在 Understanding the Linux Kernel 一书中读到 每个处理器都独立运行schedu