S22*_*S22 5 linux linux-kernel embedded-linux
Robert Love 说“set_task_state(task, state) 将给定的任务设置为给定的状态。如果适用,它还提供了一个内存屏障来强制在其他处理器上排序(这仅在 SMP 系统上需要)否则它相当于任务-> 状态 = 状态
我的问题是:内存屏障如何强制对其他处理器进行排序?
robert love 是什么意思 - 为什么需要这样做?他可能在谈论什么命令?他是在谈论这里的调度队列吗?
如果是这样,SMP 中的每个处理器是否都有不同的调度队列?我很迷惑
为了挤出额外的性能,您的 CPU 执行无序执行,它可以按照与代码中给出的顺序不同的顺序运行操作。优化编译器可以更改操作顺序以使代码更快。编译器编写者/内核类型必须注意不要改变期望(或者至少符合规范,这样他们就可以说你的期望不正确)
这是一个例子
1: CPU1: task->state = someModifiedStuff
2: CPU1: changed = 1;
3: CPU2: if (changed)
4: CPU2: ...
Run Code Online (Sandbox Code Playgroud)
如果我们没有设置状态的障碍,我们可以重新排序 1 和 2。由于两者都没有引用另一个,所以单线程实现不会看到任何差异。然而,在 SMP 情况下,如果我们重新排序 1 和 2,第 3 行可能会看到更改,但状态不会更改。例如,如果 CPU1 运行第 2 行(但不是第 1 行),然后 CPU2 运行第 3 行和第 4 行,则 CPU2 将以旧状态运行,如果随后清除更改,则 CPU1 刚刚所做的更改将丢失。
障碍告诉系统,在 1 和 2 之间的某个时刻,它必须使事情保持一致,然后才能继续。
搜索“内存屏障”,您会发现一些好帖子:内存屏障就像源代码控制操作