免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhenggn123

[内核同步] 关中断或关软中断后,禁抢占是否必要 [复制链接]

论坛徽章:
0
发表于 2012-06-04 20:15 |显示全部楼层
回复 12# 瀚海书香

1) local_irq_disable和local_bh_disable能否保证不会发生抢占?
2) 如果能的话, spin_lock_irq的实现里面的preempt_disable是否可以去掉

我发现大家实际上在同时讨论以上两个问题。 第一个问题应该可以得出结论了吧,从而可以集中到第二个问题。不然这楼一会往左歪,一会儿往右倒。
关于问题1), 我觉得是yes。 不知道大家是否有不同的意见。
   

论坛徽章:
0
发表于 2012-06-05 09:37 |显示全部楼层
honkiko 发表于 2012-06-04 20:15
回复 12# 瀚海书香

1) local_irq_disable和local_bh_disable能否保证不会发生抢占?
2) 如果能的话, spin_lock_irq的实现里面的preempt_disable是否可以去掉

我发现大家实际上在同时讨论以上两个问题。 第一个问题应该可以得出结论了吧,从而可以集中到第二个问题。不然这楼一会往左歪,一会儿往右倒。
关于问题1), 我觉得是yes。 不知道大家是否有不同的意见。



我同意你的观点,对于问题1,目前没有看到谁提出能说服别人的反对意见。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-06-05 09:42 |显示全部楼层
回复 31# honkiko
1) local_irq_disable和local_bh_disable能否保证不会发生抢占?

因为你只是禁止了当前CPU的中断,可以防止本CPU上进程的被抢占,但不代表不会任务切换,其实也不能保证其他CPU进入当前临界区。
所以可以说禁止了抢占,但无法达到临界区的功能。

看如下引用:
(1) 关 中 断;

(2) 执 行 临 界 区 程 序;

(3) 开 中 断。

关 中 断 之 后, 任 何 外 部 事 件 都 不 能 打 扰 处 理 机 连 续 执 行 临 界 区 程 序。 如 果 临 界 区 程 序 本 身 并 不 包 含 使 它 的 进 程 转 变 为 封 锁 状 态 的 因 素, 那 么 这 种 方 法 就 能 保 证 临 界 区 作 为 一 个 整 体 执 行。 这 种 方 法 的 优 点 是 简 单、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 处。

(1) 它 不 能 用 于 多 处 理 机 系 统。 其 原 因 是: 由 于 该 系 统 中 的 多 个 处 理 机 都 有 其 各 自 的 中 断 开 关, 因 此 一 个 处 理 机 并 不 能 阻 止 在 其 它 处 理 机 上 运 行 的 进 程 进 入 同 类 临 界 区。

(2) 在 临 界 区 中 如 果 包 含 有 使 执 行 它 的 进 程 有 可 能 进 入 封 锁 状 态 的 因 素, 则 也 不 能 使 用 这 种 方 法。 因 为 在 该 进 程 进 入 封 锁 状 态 后, 系 统 将 调 度 另 一 进 程 使 用 处 理 机, 如 果 需 要, 该 进 程 也 可 以 执 行 临 界 区 程 序, 不 会 受 到 任 何 阻 拦, 所 以 在 这 种 情 况 下, 开、 关 中 断 不 能 实 施 临 界 区 互 斥。

(3) 如 果 临 界 区 比 较 长, 则 本 法 会 降 低 中 断 响 应 速 度。

(4) 这 是 一 把 锁 处 理 各 类 临 界 区, 不 必 要 地 扩 大 了 互 斥 范 围。

   

论坛徽章:
0
发表于 2012-06-05 10:11 |显示全部楼层
瀚海书香 发表于 2012-06-05 09:42
回复 31# honkiko

因为你只是禁止了当前CPU的中断,可以防止本CPU上进程的被抢占,但不代表不会任务切换,其实也不能保证其他CPU进入当前临界区。
所以可以说禁止了抢占,但无法达到临界区的功能。

看如下引用:
(1) 关 中 断;
(2) 执 行 临 界 区 程 序;
(3) 开 中 断。

关 中 断 之 后, 任 何 外 部 事 件 都 不 能 打 扰 处 理 机 连 续 执 行 临 界 区 程 序。 如 果 临 界 区 程 序 本 身 并 不 包 含 使 它 的 进 程 转 变 为 封 锁 状 态 的 因 素, 那 么 这 种 方 法 就 能 保 证 临 界 区 作 为 一 个 整 体 执 行。 这 种 方 法 的 优 点 是 简 单、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 处。

(1) 它 不 能 用 于 多 处 理 机 系 统。 其 原 因 是: 由 于 该 系 统 中 的 多 个 处 理 机 都 有 其 各 自 的 中 断 开 关, 因 此 一 个 处 理 机 并 不 能 阻 止 在 其 它 处 理 机 上 运 行 的 进 程 进 入 同 类 临 界 区。

(2) 在 临 界 区 中 如 果 包 含 有 使 执 行 它 的 进 程 有 可 能 进 入 封 锁 状 态 的 因 素, 则 也 不 能 使 用 这 种 方 法。 因 为 在 该 进 程 进 入 封 锁 状 态 后, 系 统 将 调 度 另 一 进 程 使 用 处 理 机, 如 果 需 要, 该 进 程 也 可 以 执 行 临 界 区 程 序, 不 会 受 到 任 何 阻 拦, 所 以 在 这 种 情 况 下, 开、 关 中 断 不 能 实 施 临 界 区 互 斥。

(3) 如 果 临 界 区 比 较 长, 则 本 法 会 降 低 中 断 响 应 速 度。

(4) 这 是 一 把 锁 处 理 各 类 临 界 区, 不 必 要 地 扩 大 了 互 斥 范 围。


33楼说的是用关中断来保护临界区时存在的问题,说的都很经典。我深表赞同。如果仅仅用关中断就能保护多处理机下的临界区,那要自旋锁又有何用呢?所以我们用spin_lock_irq来替换local_irq_disable().如果说禁止了当前CPU的中断,可以防止本CPU上进程的被抢占,但不代表不会任务切换,就像第2条描述的那样,那么加了preempt_disable(),就可以保证不会任务切换吗?

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
发表于 2012-06-05 10:32 |显示全部楼层
回复 33# 瀚海书香

关了中断应该就不会出现进程切换,且不说SMP上关闭本地中断的意义,但其最基本的初衷起码是想独占本地CPU。进程切换时如果发现中断被关闭了,内核应该直接BUG(求证)。

有一种还算正常的情况,就是关闭中断后发生异常。这种情况下,异常返回时绝不会发生进程切换。




   

论坛徽章:
0
发表于 2012-06-05 10:46 |显示全部楼层
本帖最后由 honkiko 于 2012-06-05 10:57 编辑
瀚海书香 发表于 2012-06-05 09:42
回复 31# honkiko

因为你只是禁止了当前CPU的中断,可以防止本CPU上进程的被抢占,但不代表不会任务切换,其实也不能保证其他CPU进入当前临界区。
所以可以说禁止了抢占,但无法达到临界区的功能。


没太明白你的意思。 你是不同意“关中断可以保证不会被抢占”的说法吗?
非抢占的任务切换,那就只有进程主动调schedule()了。没有人能阻止谁这样做,但是在持有锁和关中断的情况下,这样做是bug。

另外,楼主没说要用“关中断”取代其他机制来保护临界区啊。楼主说的spin_lock_irq本来就包含关中断和spinlock啊。
我也没说过关中断就可以保护临界区。 不知道你在反驳啥啊。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2012-06-05 11:30 |显示全部楼层
回复 36# honkiko
preempt_disable其实是有两个作用的。如果第一个作用说不通,那就是第二个作用了——内存屏障的作用。
由于内存屏障的使用非常ugly,所以封装在了很多基础的函数中。preempt_disable就是其中的一个。

   

论坛徽章:
0
发表于 2012-06-05 14:05 |显示全部楼层
回复 37# 瀚海书香
不敢苟同
在preempt_disable()中,是因为有inc_preempt_count(),才需要优化屏障barrier()的

   

论坛徽章:
0
发表于 2012-06-05 17:24 |显示全部楼层
这么无聊的东西,讨论半天,毛意思啊,加个preempt_disable()会死人吗?不会吗?。。。。。。

论坛徽章:
0
发表于 2012-06-09 21:18 |显示全部楼层
cli对NMI和内部异常不能屏蔽。反正多加个preempt_disable没什么副作用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP