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/