linux - linux内核中内存屏障的目的

标签 linux linux-kernel embedded-linux

Robert Love 说“set_task_state (task, state) 将给定任务设置为给定状态。如果适用,它还提供内存屏障以强制对其他处理器进行排序(这仅在 SMP 系统上需要)否则它是相当于 任务->状态=状态

我的问题是: 内存屏障如何强制对其他处理器进行排序?

罗伯特·洛夫的意思是什么 - 为什么需要这样做? 他可能在说什么命令?他是在谈论这里的调度队列吗?

如果是这样,SMP 中的每个处理器是否都有不同的调度队列? 我很困惑

最佳答案

你的 CPU,为了挤出额外的性能,做 Out of Order Execution ,它可以按照与代码中给出的顺序不同的顺序运行操作。优化编译器可以更改操作顺序以使代码更快。编译器编写者/内核类型必须注意不要改变期望(或者至少要符合规范,这样他们才能说您的期望不正确)

举个例子

1: CPU1: task->state = someModifiedStuff
2: CPU1: changed = 1;
3: CPU2: if (changed)
4: CPU2:  ...

如果我们没有设置状态的障碍,我们可以重新排序 1 和 2。 由于两者都没有引用另一个,因此单线程实现不会看到任何差异。但是,在 SMP 情况下,如果我们重新排序 1 和 2,第 3 行可能会看到更改但状态不会更改。例如, 如果 CPU1 运行第 2 行(但不是第 1 行),然后 CPU2 运行第 3 行和第 4 行,则 CPU2 将以旧状态运行,如果它随后被清除更改,则 CPU1 刚刚所做的更改将会丢失。

障碍告诉系统,在某个点,在 1 和 2 之间,它必须在继续之前使事情保持一致。

搜索“内存屏障”,您会发现一些好帖子:Memory Barriers Are Like Source Control Operations

关于linux - linux内核中内存屏障的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30914442/

相关文章:

mysql - 如何从 Linux 机器连接到 Windows 上的远程 MYSQL 服务器?

linux - 为什么在 bash 命令后附加控制字符?

linux - 随机运行 Bash 脚本

c++ - 如何避免重复使用socket?

mysql - 损坏的 mysqld 包阻止在 ubuntu 中进行任何其他安装

c - 内核领域中的错误处理/检查

linux - Linux中,任何用户的组名和其他用户的组名可以相同吗?

linux - 如何在实时 Linux 的内核模式下获取中断时间(时间戳)?

linux - syscall_table_32.S 未找到

Android 原生系统调用挂起 [C]