罗伯特·洛夫(Robert Love)说:“set_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/