免费注册 查看新帖 |

Chinaunix

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

自旋锁的疑问-spin_lock_irqsave -线程调度机制也被禁止? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-11-09 14:38 |只看该作者
原帖由 accessory 于 2009-11-7 11:48 发表
先看是单处理器还是多处理器。
那个输出结果看上去是不正常。看看是否自己程序其他地方有问题。




要有问题也应该是创建线程那个for循环有!!但我感觉这样创建线程应该没错吧!

论坛徽章:
0
12 [报告]
发表于 2009-11-09 14:44 |只看该作者

回复 #8 dreamice 的帖子

有点道理!!那就是for循环创建线程没有调度机制了!!乱了!!
为什么lock0 ,没有解锁时候,   lock1 马上就上锁了! 这个按照我们的思维应该是在lock1那里自旋,没有调度机制了,也应该会是等待接锁吧?

论坛徽章:
0
13 [报告]
发表于 2009-11-09 15:14 |只看该作者
原帖由 xiaochangfu 于 2009-11-6 10:48 发表
spin_lock_irqsave   -------该宏如果获得自旋锁lock,它也将保存标志寄存器的值到变量flags中,并且失效本地中断,--------
-------本地中断失效??,是不是线程调度机制也被禁止了??

我写了个测试的驱动

...

                case IOCTL_CMD_CLOSE:
                        {
                                spin_lock_irqsave (&test_lock, flags);
                                local_irq_disable();
                                printk("lock is :%d\n",   spin_is_locked(&test_lock));   

                                printk("i am pthread%d  lock\n",arg);
                                count++;
                                printk("count= %d\n",count);
                        break;
                        }
                case IOCTL_CMD_OPEN:
                        {       
                                printk("count= %d\n",count);
                                printk("i am pthread%d unlock \n",arg);
                                spin_unlock_irqrestore (&test_lock, flags);
                                local_irq_enable();
                                count--;                       
                                printk("lock is :%d\n",   spin_is_locked(&test_lock));   
                                break;
                        }

结果OPEN: major=233, minor=1
lock is :0
i am pthread0  lock
count= 1
lock is :0
i am pthread1  lock
count= 2
lock is :0
i am pthread2  lock
count= 3
lock is :0
i am pthread3  lock
count= 4
lock is :0
i am pthread4  lock


结论:看来spinlock没有编译,,但是local_irq_enable();了  怎么线程调度还有呢??奇怪

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
14 [报告]
发表于 2009-11-09 15:29 |只看该作者

回复 #13 xiaochangfu 的帖子

你创建的进程,在何时被内核调度,这个时间点你是没办法控制的

论坛徽章:
0
15 [报告]
发表于 2009-11-09 17:33 |只看该作者
原帖由 xiaochangfu 于 2009-11-6 10:54 发表
说明下  这是在但cpu下面的,我只是想用irqsave--本地中断失效这个功能


LZ不是说了是UP, 在UP下, spin_lock_irqsave只是一个local_irq_disable的操作,并没有自旋。。。
而你返回用户态的时候,eflags会被恢复成进入kernel之前的状态。

[ 本帖最后由 eexplorer 于 2009-11-9 17:34 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2009-11-10 09:45 |只看该作者

回复 #15 eexplorer 的帖子

对的!!我看了下是说在内核的中断禁止,到用户态  就自动恢复进入内核前的状态了!        所以说我在用户和内核之间转来转去中断禁止没啥作用了!!  
那位有什么好的方法可以  检测下up下的抢占 的spinlock的运用
谢谢了

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2009-11-10 09:54 |只看该作者
写两个内核线程,来调试一下

论坛徽章:
0
18 [报告]
发表于 2009-11-10 16:16 |只看该作者

回复 #17 dreamice 的帖子

我想这样做!!内核线程不能用sleep 啊!!怎么延时判断呢?指点下!谢谢了!

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
19 [报告]
发表于 2009-11-10 17:04 |只看该作者

回复 #18 xiaochangfu 的帖子

内核有延迟函数,也可以主动放弃CPU的,你看看源代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP