Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1271366
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-04-12 20:45:17

在smp机器上, 
一个进程A(运行在cpuA上)获得了自旋锁,然后执行schedule_timeout休眠10s(只是测试), 
同时另外一个进程B(运行在cpuB上)也在试图获得这个自旋锁。 
我看了网上其它人的解释,说这种情况会发生死锁。 但是按照我自己的理解在进程A在cpuA睡眠期间, 
进程B会在cpuB上一直忙式等待这个自旋锁,等进程A在cpuA上被唤醒后,执行完自己的操作,然后解锁。这时进程B就能够得到这个自旋锁,应该不会发生死锁啊。。。。。 


另外有一个问题,我在网上看到一句话 
[color=#FF0000]“另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁)” 
[/color] 
原帖地址是http://blog.csdn.net/sandflee/archive/2009/04/10/4062596.aspx 

我不明白的是,睡眠后这个拥有自旋锁的进程会接着往下执行,怎么又会去再次申请自己已持有的锁??
-----------------------------------------------------------------------------------------------------------------------------------

恰巧这两天也在看这部分,胡乱解析一通,楼主不要见怪,呵呵 . 

1) 如果resource会被中断访问,a在持锁时要禁中断,否则中断再抢lock会让kernel freeze, 
2) a sleep 后重新调度到,仍然在持锁的上下文中,照我看书的理解,不会重新申请锁。 
当然不排除特殊情况,哈哈 
----

你说的情况,在理想情况下,是不会死锁的,但是,有几个问题: 
1)这个进程A睡眠以后,可能被kill掉了,这样它持有的自旋锁就永远解不开了。 
2)这个进程A可能会睡眠很长时间,这个时间是不可预测的,会造成系统的停摆。 
3)持有自旋锁去睡眠,是对cpu资源的极大浪费,进程A完全可以在睡眠前释放自旋锁,然后睡眠,醒来后再去获得自旋锁。 

另外,你引用的 
“另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠 
有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁)” 

我感觉是错误的。
----

你说的情况,在理想情况下,是不会死锁的,但是,有几个问题: 
1)这个进程A睡眠以后,可能被kill掉了,这样它持有的自旋锁就永远解不开了。 
> kill a时, 不会释放其所占资源么? 想知道细节 

2)这个进程A可能会睡眠很长时间,这个时间是不可预测的,会造成系统的停摆。 

3)持有自旋锁去睡眠,是对cpu资源的极大浪费,进程A完全可以在睡眠前释放自旋锁,然后睡眠,醒来后再去获得自旋锁。 
> 这个严重同意,光想想spin-lock让n个cpu干等,就知道它的威力了 

另外,wheelz, 所谓系统“停摆”,是一种什么状态呢? 有没有这方面实验过,好奇 
----

> kill a时, 不会释放其所占资源么? 想知道细节 

当然不会,内核哪里知道你持有了什么锁? 

> 另外,wheelz, 所谓系统“停摆”,是一种什么状态呢? 有没有这方面实验过,好奇 

没有什么特别的含义,就是说进程A睡眠了,其他想获得该锁的进程只能等待,这样不就是系统停顿了么。呵呵。
----

okay,明白了 谢谢 :-)
----

拿了spinlock之后,你还放掉CPU,这不是技术问题,是概念问题。 

你的测试没有意义。 

全人类没有这样写程序的。如果有可能放CPU,你要用mutex,for example

====




阅读(1321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~