免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: gqbfree
打印 上一主题 下一主题

请教一个spin_lock问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-04-27 17:08 |只看该作者
本帖最后由 gqbfree 于 2011-04-27 17:14 编辑

多谢各位讨论。
   

    我说的任务级是指进程级别,不是说用户空间和内核空间(之前做VXWORKS)。   
   
   
    中断如果对共享数据不做操作,那么进程只需要用spin_lock就可以了,而不用去锁中断 ---- 根据各方面查询和讨论,看来是这样。
   
    azzurris的一个观点即为了防止后续修改出问题,这个属于写代码的扩展和维护性考虑,也就是说不是强制的。
        
    to amarant: 我同意你所讲,在不锁中断情况下,spin_lock禁止抢占所以不会对内核造成影响。(现在只讨论SMP情况)
   
   
   
    现在疑问是:spin_lock处理的目的是快速完成,但如果不锁中断,中间就会被打断,如果中断来的比较多,那不是其它CPU被耽搁了?

   望各位继续探讨!!

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
22 [报告]
发表于 2011-04-27 17:29 |只看该作者
回复 21# gqbfree


    spin_lock忙等待的时候是在请求锁,别的CPU做好了可以继续做。这里即使被中断了也无所谓。

论坛徽章:
0
23 [报告]
发表于 2011-04-28 09:41 |只看该作者
回复 22# amarant


    我可能没表达清楚。 假设CPU1的一个进程获取到了spin_lock,这个时候该进程被CPU1上的中断打断,本来锁这段时间比较短,但因为中断处理的引入,

导致CPU1占有该锁的时间加长,这样CPU2,CPU3……需要该锁时等待时间过长(因为等待时间需要加上CPU1处理中断时间), 这样是不是违背了spin_lock的初衷?

还是我多虑了?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
24 [报告]
发表于 2011-04-28 10:08 |只看该作者
回复 23# gqbfree


    我觉得你说的很有道理,也许这就是前面的兄弟说的“在进程上下文一定要用关中断的spin_lock”的原因吧。

论坛徽章:
0
25 [报告]
发表于 2011-05-05 13:48 |只看该作者
spinlock_XXX有很多形式,有


  spin_lock()/spin_unlock(),
  spin_lock_irq()/spin_unlock_irq(),
  spin_lock_irqsave/spin_unlock_irqrestore()
  spin_lock_bh()/spin_unlock_bh()

  local_irq_disable/local_irq_enable
  local_bh_disable/local_bh_enable




那么,在什么情况下具体用哪个呢?这要看是在什么内核执行路径中,以及要与哪些内核
执行路径相互斥。我们知道,内核中的执行路径主要有:

1  用户进程的内核态,此时有进程context,主要是代表进程在执行系统调用
    等。
2  中断或者异常或者自陷等,从概念上说,此时没有进程context,不能进行
    context switch。
3  bottom_half,从概念上说,此时也没有进程context。
4  同时,相同的执行路径还可能在其他的CPU上运行。



这样,考虑这四个方面的因素,通过判断我们要互斥的数据会被这四个因素中
的哪几个来存取,就可以决定具体使用哪种形式的spinlock。如果只要和其他CPU
互斥,就要用spin_lock/spin_unlock,如果要和irq及其他CPU互斥,就要用
spin_lock_irq/spin_unlock_irq,如果既要和irq及其他CPU互斥,又要保存
EFLAG的状态,就要用spin_lock_irqsave/spin_unlock_irqrestore,如果
要和bh及其他CPU互斥,就要用spin_lock_bh/spin_unlock_bh,如果不需要和
其他CPU互斥,只要和irq互斥,则用local_irq_disable/local_irq_enable,
如果不需要和其他CPU互斥,只要和bh互斥,则用local_bh_disable/local_bh_enable,
等等。

论坛徽章:
0
26 [报告]
发表于 2011-05-12 12:22 |只看该作者
回复 25# wangzhen11aaa


    类似的总结我也在网上搜到过。
    我问的问题就是质疑这句 “如果只要和其他CPU 互斥,就要用spin_lock/spin_unlock”,  如果在lock过程中,被本地的irq或bh抢占,
   那么其它CPU岂不是要等待该CPU中断处理的时间?  spin_lock本意是速度要快,如果频繁发生中断是不是就导致时间被拉长影响其它CPU处理?

论坛徽章:
0
27 [报告]
发表于 2011-05-12 12:46 |只看该作者
回复 26# gqbfree


一个spin_lock保护的代码时间一般都很短, 这时候别的CPU正在竞争的客能性不大,即使正在竞争,当前CPU(持有锁)被中断的可能性也很小,很快就会释放,(中断的时间间隔是以毫秒为单位吧,没准也有更细粒度的设备)

如果把所有spin_lock  替换为spin_lock_irq只是多浪费指令开关中断而已


如果spin_lock的某段代码很长,那更不能关中断了,

论坛徽章:
0
28 [报告]
发表于 2011-05-13 12:47 |只看该作者
回复 27# flw2


    多谢楼上耐心回答。

   呵呵,我觉得自己可能提了一个牛角尖的问题。多谢大家参与讨论。

论坛徽章:
0
29 [报告]
发表于 2011-05-23 15:36 |只看该作者
我想这是个处理优先级的问题,是应该先处理中断呢?还是处理其他其他内核代码(包括spinlock中的代码)?一般而言是应该先处理中断的。另外某些中断被禁止可能引发副作用,比如内核时钟中断,jiffies是以该中断来计数的

论坛徽章:
1
NBA常规赛纪念章
日期:2015-05-04 22:32:03
30 [报告]
发表于 2011-05-24 19:40 |只看该作者
回复  gqbfree


一个spin_lock保护的代码时间一般都很短, 这时候别的CPU正在竞争的客能性不大,即使正 ...
flw2 发表于 2011-05-12 12:46



    按照您的意思,spin_lock_irq就没有存在的意义喽?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP