免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3952 | 回复: 13
打印 上一主题 下一主题

[内核同步] 内核同步 [复制链接]

论坛徽章:
1
白羊座
日期:2013-08-22 17:30:33
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-11 09:04 |只看该作者 |倒序浏览
请教各位几个问题:
自旋锁的实现会去禁止本地cpu内核抢占;之所以要这么做我的理解是为了防止这样的情况:假设CPU1上的线程1持有自旋锁L后进入临界区A,然后发生内核抢占,本地CPU1上切换到线程2执行,而此时若线程2也试图持有自旋锁L进入临界区A,就会发生死锁的情况。

上面的理解有问题吗?在SMP系统上,线程1是否有可能会被其他的CPU执行?如果有可能,是否在SMP系统是实现自旋锁时可以不用禁止本地cpu内核抢占?
另外,禁止内核抢占后当前执行线程会一直执行直到自动放弃CPU而不理会其时间片是否耗尽么?

请各位前辈指点迷津......

论坛徽章:
0
2 [报告]
发表于 2012-05-11 09:40 |只看该作者
spin_lock最初是为SMP设计的,但是后来内核试图统一UP与SMP的代码,因为UP中的抢占性其实等同多进程的并发,因此加了disable_preempt。你的理解没有问题。在SMP系统上,一个进程在同一时间只可能在一个CPU上运行,虽然有进程迁移的存在,那也只是意味着一个进程前半段可能在cpu0上运行,后半段可能会在cpu1上运行。所以线程1完全有可能在其他CPU上运行,如果没有内核抢占,无论是UP和SMP都无需disable_preempt。现在的进程调度已经没有时间片这一说法,它的CFS的策略出发点来自进程在运行队列中等待的时间。

论坛徽章:
1
白羊座
日期:2013-08-22 17:30:33
3 [报告]
发表于 2012-05-12 11:29 |只看该作者
回复 2# MagicBoy2010
感谢老兄的解答,总结起来可不可以这么理解:一个持有自旋锁的执行路径在释放该锁之前必须一直占有着CPU!所有一切有可能使其失去CPU的源头都必须杜绝:如sleep自动放弃CPU,如内核抢占,如在中断上下文中需关闭本地CPU中断。

   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
4 [报告]
发表于 2012-05-13 13:30 |只看该作者
哪里能找到比较权威的内核同步总结?

论坛徽章:
0
5 [报告]
发表于 2012-05-14 12:59 |只看该作者
MagicBoy2010 发表于 2012-05-11 09:40
spin_lock最初是为SMP设计的,但是后来内核试图统一UP与SMP的代码,因为UP中的抢占性其实等同多进程的并发, ...


hi,我想知道,如果一个CPU一般会占用一个线程运行的这么长时间,那么双CPU为什么比单CPU要快呢,另一个CPU又无法取代码执行。

谢谢,我有在CPU与编译器里问过”双核CPU是怎么工作的“问题,没有得到答案
http://bbs.chinaunix.net/thread-3735743-1-1.html

论坛徽章:
0
6 [报告]
发表于 2012-05-14 13:51 |只看该作者
cjdao 发表于 2012-05-12 11:29
回复 2# MagicBoy2010
感谢老兄的解答,总结起来可不可以这么理解:一个持有自旋锁的执行路径在释放该锁之 ...


可以这样理解

论坛徽章:
0
7 [报告]
发表于 2012-05-14 13:54 |只看该作者
hi,我想知道,如果一个CPU一般会占用一个线程运行的这么长时间,那么双CPU为什么比单CPU要快呢,另一个CPU又无法取代码执行。

谢谢,我有在CPU与编译器里问过”双核CPU是怎么工作的“问题,没有得到答案
http://bbs.chinaunix.net/thread-3735743-1-1.html
=====================================
双CPU比单CPU要快很好理解,因为可以同时运行两个任务,而两个任务间有共享或者同步的概率并不大。每个CPU都有自己的调度队列,作为应用程序员,只需要关注API层面的东西就可以了

论坛徽章:
0
8 [报告]
发表于 2012-05-14 14:36 |只看该作者
回复 7# MagicBoy2010


    谢谢回复。嗯,这就是我不明白的了,一个时间里不是只有一个CPU可以取指译码执行吗,对上上层可以认为2个线程在同时运行,实际上也只有调度后才能切换到另一个线程,也就是调度才能切换CPU,一次调度间的时间也挺久了,另一个CPU又不能抢占总线,也就是闲置了。我就是对这个比较纠结没弄明白。
我们的CPU目前是公用cache,除非是CPU0在cache A处执行一段代码,CPU1在cache B处执行一段代码,有什么中英文文档有描述多核CPU工作原理的吗?谢谢

论坛徽章:
0
9 [报告]
发表于 2012-05-14 14:42 |只看该作者
fei1700 发表于 2012-05-14 14:36
回复 7# MagicBoy2010


不明白你的问题,你就先把SMP想象成两个CPU宏观上同时干活,然后基于这个基础上提出你的问题,你认为会有哪些限制影响他们的并行效率,会有那些风险导致运行逻辑出错?然后大家帮忙一起学习。

论坛徽章:
0
10 [报告]
发表于 2012-05-14 18:18 |只看该作者
灌水菜鸟 发表于 2012-05-14 14:42
不明白你的问题,你就先把SMP想象成两个CPU宏观上同时干活,然后基于这个基础上提出你的问题,你认为会 ...


2个CPU微观上同时干活,受到总线就1条,icache dcache就1个的影响,这样也不能同时微观工作,2个逻辑运算即使能同时工作,还是要抢占cache上的资源。
既然2个CPU不能同时干活,假设禁止CPU抢占,是不是只有主动调用schedule时才能切换CPU,这样CPU0在时间0-2ms执行线程1,再到CPU1时间2-4ms执行线程2,那么这样2个CPU和1个CPU有什么差别?既然这样,为什么SMP比单CPU要有风险,一定要用spin_lock来保护代码,避免多CPU切进来。
我自己只是觉得中断来了可能有问题,但是这跟SMP就没关系了。
我这样算是完全不了解SMP了,因为不了解微观,不了解具体情况,怎么来分析宏观上的问题?

我猜这么回答你是不是就明白我在问什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP