免费注册 查看新帖 |

Chinaunix

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

自旋锁 可抢占内核中使用自旋锁跟使用信号量有什么区别? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-06-05 01:06 |只看该作者
3.如果进程A在内核态下拥有自旋锁,被阻塞后,被调度的另外一个进程B也执行到同样的一段内核代码,申请自旋锁,但是由于进程A并没有释放该锁,所以B会一直自旋等待,同时内核被禁止抢占,也就是说进程B会一直自旋,不会让出处理器。

这是在百度百科里看到的:单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会。
具体Linux是不是这样实现的就不知道了,得看源码。

http://baike.baidu.com/view/1250961.htm

论坛徽章:
0
12 [报告]
发表于 2010-06-05 01:44 |只看该作者
3.如果进程A在内核态下拥有自旋锁,被阻塞后,被调度的另外一个进程B也执行到同样的一段内核代码,申请自旋锁,但是由于进程A并没有释放该锁,所以B会一直自旋等待,同时内核被禁止抢占,也就是说进程B会一直自旋,不会让出处理器。

突然想到:在上述情况下,内核不能抢占的只是进程A阿,因为A持有锁,所以它的preempt_count不为0;
而进程B不持有锁,是可以被抢占的,所以要么进程B把时间片耗尽,从ISR返回内核空间前被抢占(其preempt_count为0,可以被抢占),要么像上面说的尝试一定次数后,主动放弃CPU
具体是主动放弃CPU还是耗尽时间片,得看源代码,也许在不同的版本中实现还不一样呢。。。

论坛徽章:
0
13 [报告]
发表于 2010-06-05 09:55 |只看该作者
回复 9# sara550


    我的理解是,在单处理器可抢占内核中,一般来讲在进程上下文中肯定可以申请到自旋锁,因为别的进程持有锁的时候,内核是禁止抢占的,也就是说这个时候除了中断,持有锁的进程肯定会执行完毕,并且释放锁。
    所以在进程中是可以放心使用自旋锁的,但是在中断程序中,就要小心使用,因为当进程拥有一个自旋锁的时候,被中断程序打断,而在中断处理程序中又同样申请该锁,这样就造成了死锁。所以在进程和中断服务程序都要访问一内核数据的时候,一般只要在进程中或者内核代码中申请自选锁时要禁止中断。就是调用spin_lock_irqsave,spin_unlock_irqstroe函数。

论坛徽章:
0
14 [报告]
发表于 2010-06-05 12:04 |只看该作者
在单处理器可抢占内核中,一般来讲在进程上下文中肯定可以申请到自旋锁,因为别的进程持有锁的时候,内核是禁止抢占的,也就是说这个时候除了中断,持有锁的进程肯定会执行完毕,并且释放锁。
恩,这个我赞同。

可是,你描述的情形中,进程A是被阻塞的。
在LKD中是这样描述的:If a task in the kernel blocks (which results in a call to schedule())
如果内核中的任务阻塞,会导致调用schedule()
而进程B优先级比A高的话,不就会被调度了么???

论坛徽章:
0
15 [报告]
发表于 2010-06-07 18:51 |只看该作者
回复 9# sara550

锁是配对使用的,一开始,是开启的状态,有人进入,才lock,这个时候,另外一个人进来,就等待,但前面那个进程迟早会出来的,就unlock,
后面那个就可以进来。不存在你们的那个假设(锁一开始是锁住状态)

论坛徽章:
0
16 [报告]
发表于 2010-06-08 10:12 |只看该作者
回复 14# sara550


    所以在临界区中一般不要引用引发阻塞的函数

论坛徽章:
0
17 [报告]
发表于 2013-01-04 21:04 |只看该作者
这个问题,现在搞清楚了吗,各位?

论坛徽章:
0
18 [报告]
发表于 2013-05-12 10:27 |只看该作者
本帖最后由 By_winds 于 2013-05-12 10:28 编辑

对自旋锁的理解在网上搜索了一下,感觉大多数人都陷入了一个误区,也就是由自旋锁的具体实现,来推导自旋锁的语义。我觉得对于操作系统某一个元素的实现原理的讨论要首先给予语义,这些语义可以认为是操纵系统中不言自明的“规定”(不要问为什么,就像不要问1为什么为1)。自旋锁的诞生就是为了防止真正并发实体(单cpu不存在实际意义上的并发)对某一临界资源的忙等互斥占用,在smp下容易理解,在单cpu下如何实现呢?尤其是内核可抢占时,这时实际的实现就是禁止抢占,只有这样才能实现“忙等互斥占用”这一目标。

论坛徽章:
0
19 [报告]
发表于 2014-11-14 20:26 |只看该作者
关于sara550所说的:
可是,你描述的情形中,进程A是被阻塞的。
在LKD中是这样描述的:If a task in the kernel blocks (which results in a call to schedule())
如果内核中的任务阻塞,会导致调用schedule()
而进程B优先级比A高的话,不就会被调度了么???

我想问的是,既然内核是禁止抢占的,那么这个地方阻塞了,内核还会进行schedule()么?如果会的话,因为抢占被禁止,那么你的这个schedule()调度又有什么意义呢?优先级再高,不能抢占,你还是运行不了,最终不是还是运行被阻塞的那个进程?

所以我感觉,因为禁止抢占,所以在自旋锁内部被阻塞的情况下,任务调度也是不能够执行的,不知道我的理解是否正确

论坛徽章:
0
20 [报告]
发表于 2014-11-14 20:38 |只看该作者
刚才又看了其他的一些帖子讨论,如:http://www.360doc.com/content/12/0329/20/1317564_199055485.shtml

我上述的说法是不正确的,应该是一旦阻塞,就会schedule(),但是,因为禁止抢占,所以schedule()了,但是其他进程还是得不到执行“如果自旋锁在锁住以后进入睡眠,由于不能进行处理器抢占,其他系统进程将都不能获得CPU而运行,因此不能**睡眠的自旋锁,因此系统将不响应任何操作”,说明其他的进程还是运行不了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP