加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux内核中内存障碍的目的

发布时间:2020-12-13 22:57:54 所属栏目:Linux 来源:网络整理
导读:Robert Love说“set_task_state(task,state)将给定任务设置为给定状态.如果适用,它还提供内存屏障以强制在其他处理器上排序(这仅在SMP系统上需要)否则它相当于 task- state = state 我的问题是: 内存屏障如何强制在其他处理器上进行排序? 罗伯特的爱是什么
Robert Love说“set_task_state(task,state)将给定任务设置为给定状态.如果适用,它还提供内存屏障以强制在其他处理器上排序(这仅在SMP系统上需要)否则它相当于
task-> state = state

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

罗伯特的爱是什么意思 – 为什么这需要?
他可能会谈论这个顺序是什么?他在这里谈论调度队列吗?

如果是这样,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读