免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1817 | 回复: 7

大家来看一下,内核同步机制-spin_lock疑问 [复制链接]

论坛徽章:
0
发表于 2009-12-23 10:58 |显示全部楼层
下面的同步讨论假设只是在单CPU系统上(可抢占)
在单CPU系统上内核同步机制spin_lock代码如下:
#define spin_lock(lock)   _spin_lock(lock)
#define _spin_lock(lock)  __LOCK(lock)
#define __LOCK(lock) \
do { preempt_disable(); __acquire(lock); (void)(lock); } while (0)
可见在单CPU系统上加锁操作只是做了一个禁止抢占操作.

下面我有两个疑问:
1: 假设进程A正在访问临界区D,此时系统来了一个IRQ将任务B唤醒;A任务被抢系统执行任务B,如果此时任务B
      也访问临界区D ,这算是竞争吗?
      在单CPU系统中,从微观上来说,在某时刻系统只能执行一个任务,如果上面的问题不算竞争,那么对单CPU系统来说
    访问内存资源是不可能出现竞争的,也就不需要任何加锁操作。

  2:接着1的问题,如果上面情况不算是竞争, 那么在加锁操作为什么要preempt_disable()?
     对于SMP系统加锁需要preempt_disable()禁止抢占还可以理解(为了提高SMP系统效率, 如果A核上的一个a进程正在访问临界区
    此时a任务被抢占,,如果此时B核上的b任务正在忙等待锁 ,此时系统效率就会降低;如果禁止抢占的话 a任务就不会被抢占,从而可以
    很快的释放锁.)
     但是对于单CPU来说同一时刻不可能有两个任务同时在运行,所以这里禁止抢占是什么意思?

论坛徽章:
0
发表于 2009-12-23 12:22 |显示全部楼层
1、我认为这是你所说的“竞争”,所以要禁用抢占,避免“竞争”; (总觉得“竞争”这个词不太恰当)
2、如果这不算“竞争”,那么多处理器情况下也不算。一般连接一个物理内存设备的数据通道只有一条,多个CPU同时访问也是要被串行化的,并不是同时。

论坛徽章:
0
发表于 2009-12-23 13:10 |显示全部楼层
UP的情况如果你知道临界区有可能被ISR访问的话,是要你在程序中disable interrupt的。如果你没有disable而引起竞争,那是你程序的问题了。

论坛徽章:
0
发表于 2009-12-23 13:18 |显示全部楼层

回复 #1 wmmy2008 的帖子

> 1: 假设进程A正在访问临界区D,此时系统来了一个IRQ将任务B唤醒;A任务被抢系统执行任务B,如
> 果此时任务B
>      也访问临界区D ,这算是竞争吗?

disable preempt就是为了防止A被B抢占。。。

论坛徽章:
0
发表于 2009-12-23 13:18 |显示全部楼层
临界区到底在哪些上下文被访问到你要清楚。

如果临界区在进程上下文和中断上下文都会被访问,你必须要禁止硬中断。

如果只在进程上下文和软中断上下文被访问,那禁止软中断就行了。

如果只是多个进程上下文之间会被访问,那禁止抢占就ok了。

论坛徽章:
0
发表于 2009-12-23 13:31 |显示全部楼层
ULK5.3.1有个表说的很清楚啦

论坛徽章:
0
发表于 2009-12-23 13:47 |显示全部楼层
再仔细研读一下ULK3

论坛徽章:
0
发表于 2009-12-23 18:10 |显示全部楼层
单核preempt_disable目的是为了不使当前线程被调度器切换出去,保证某些操作的原子性
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP