免费注册 查看新帖 |

Chinaunix

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

[进程管理] 单处理器的自旋锁问题 [复制链接]

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-24 23:09 |只看该作者 |倒序浏览
本帖最后由 qq948299114 于 2013-04-25 19:44 编辑

自旋锁的实现代码,单处理器抢占式内核会关闭内核抢占。可不可以采用锁机制来保护临界区, 是不是只能采用类似信号量之类的锁,而不能采用自旋锁


论坛徽章:
0
2 [报告]
发表于 2013-04-25 01:36 |只看该作者
是我看错了?请问单处理器何来自旋锁?
第二,内核抢占不会访问临界区的,因为有临界区的地方内核抢占已经关闭了!内核不会被抢占!

论坛徽章:
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
3 [报告]
发表于 2013-04-25 08:34 |只看该作者
回复 1# qq948299114
对于单处理器的自旋锁,抢占式内核会关闭内核抢占。但是,如果发生的是进程抢占,抢占进程会不会访问被抢占进程的临界区?

我想的是调度函数shedule()是否会选择一个不会访问临界区的进程来运行呢


单处理器,非抢占内核的自旋锁是空操作。

单处理器,抢占内核的自旋锁就是禁止抢占。

对于临界区的情况,应该是禁止抢占的,在禁止抢占的时候,不会发生进程切换。

   

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
4 [报告]
发表于 2013-04-25 11:18 |只看该作者
本帖最后由 qq948299114 于 2013-04-25 19:45 编辑

回复 2# uliux


    我没有说清楚,我说的自旋锁是是实现自旋锁的代码。单处理器上确实是没有自旋锁的,自旋锁的实现代码中有几个条件编译,对于多处理器是配置CONFIG_SMP的,会加入锁机制。
单处理器、抢占式内核只是会加入禁止内核抢占(关闭中断),这个禁止功能也是在自旋锁的代码中实现的。
   禁止内核抢占会让内核态的进程不会被另一个进程抢占,但对于用户态的进程呢?是否用户态进程因为优先级低,也不能被抢占。

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
5 [报告]
发表于 2013-04-25 11:22 |只看该作者
回复 3# 瀚海书香

意思是禁止内核抢占也就禁止了进程切换吗??

   

论坛徽章:
0
6 [报告]
发表于 2013-04-25 11:49 |只看该作者
回复 4# qq948299114

用户态进程时刻都在被抢占,不存在用户态抢占一说;内核抢占这个功能是因为在2.4内核的时候,内核无法抢占的,当时只能靠内核代码的自觉的调度,否则内核代码就有可能无限的运行下去(注意此时中断包括时钟中断都无法引起内核进程调度,因为在内核空间),还有就是可能此时系统有一个实时性的进程优先级远远高于内核运行的进程,但因为在内核空间没有办法打断内核的运行,这样这个实时性进程就只能干看着影响了系统的反应速度,用户就有可能感觉系统性能下降;就是针对这个问题才引进了系统内核抢占的;这个就是内核抢占的历史缘由,当然就是3.0的内核都不是真正意义上的实时的。用户空间的进程会被中断随时打断不存在不要脸的占住cpu不放的问题,当有优先级高于它的进程它会被内核剥夺cpu控制权。
   

论坛徽章:
0
7 [报告]
发表于 2013-04-25 11:53 |只看该作者
qq948299114 发表于 2013-04-25 11:22
回复 3# 瀚海书香

意思是禁止内核抢占也就禁止了进程切换吗??


你的这个说法不对的,内核抢占被禁止,只是这个内核进程无法被抢占而去调度别的进程运行,但进程调度是没有禁止的,进程调度机制时刻都在运行,但进程会不会切换是调度器和内核在调控,非内核抢占可以控制!

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
8 [报告]
发表于 2013-04-25 12:40 |只看该作者
回复 6# uliux
谢谢,明白了内核抢占的由来,
    我想知道,在单处理器中,两个用户级进程产生了竞争条件,这样可以采用锁机制来保护临界区, 是不是只能采用类似信号量之类的锁,而不能采用自旋锁 ,因为请求自旋锁的进程
一直自旋而必须占用CPU,另一个进程就不能在执行.....于是产生了矛盾。

论坛徽章:
0
9 [报告]
发表于 2013-04-25 13:18 |只看该作者
qq948299114 发表于 2013-04-25 12:40
回复 6# uliux
谢谢,明白了内核抢占的由来,
    我想知道,在单处理器中,两个用户级进程产生了竞争条件 ...


在单处理器中采用锁的机制,如果不想能过关中断来进行互斥操作,采用自旋锁的代码是可以的,
因为自旋锁的实现只是一种原子操作,然后一直等待锁定。若已有进程已占用锁,期间进程切换,
另一个进程去申请锁,会一直等待,直到它的时间片使用完,才能切换出来,CPU利用率会降低。
当然在一些特殊场合也容忍这样的浪费。比如需要中断实时非常高的场合中(除非一定要,一般不关中断)。

论坛徽章:
1
技术图书徽章
日期:2014-01-14 00:02:38
10 [报告]
发表于 2013-04-25 17:03 来自手机 |只看该作者
本帖最后由 qq948299114 于 2013-04-25 21:21 编辑

9# skychgg


谢谢,搞懂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP