免费注册 查看新帖 |

Chinaunix

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

请教2.4内核中的up函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-08 23:09 |只看该作者 |倒序浏览
本帖最后由 spongebooob 于 2011-04-09 11:30 编辑

up()中:
首先递增sem->count,如果递增结果小于或等于0时就调用__wake_up唤醒一个进程。

问题是判断的为什么是“小于等于0”而不是“等于0”?因为这时如果sem->count小于0,被唤醒的进程也是不能进入临界区的:在__down()中81行被唤醒,再到74行时sem->sleepers为1,sleepers-1为0,通过atomic_add_negtive加到sem->count后还是小于0,继续到81行schedule()中睡眠!这次调用__wake_up岂不是多余的?

论坛徽章:
0
2 [报告]
发表于 2011-04-09 11:26 |只看该作者
本帖最后由 spongebooob 于 2011-04-09 11:40 编辑

附上部分__down()代码:
67        for (;;) {
68                int sleepers = sem->sleepers;
69
70                /*
71                 * Add "everybody else" into it. They aren't
72                 * playing, because we own the spinlock.
73                 */
74                if (!atomic_add_negative(sleepers - 1, &sem->count)) {
75                        sem->sleepers = 0;
76                        break;
77                }
78                sem->sleepers = 1;        /* us - see -1 above */
79                spin_unlock_irq(&semaphore_lock);
80
81                schedule();
82                tsk->state = TASK_UNINTERRUPTIBLE;
83                spin_lock_irq(&semaphore_lock);
84        }

因为2.4的代码中如果有进程因不能进入临界区而睡眠,达到“稳定状态”时sem->count只能为-1(所以up中加1后必为0),如果up加1后小于0则表明尚未到“稳定状态”,这样,由于up中count已增1,最后一个进入临界区的进程会在74行处得到0从而break,得到运行,所以我认为也不用在up中唤醒谁。
这里“未达到稳定状态”指一些其它进程已执行过down()使count减1,而尚未执行到__down()中的74行atomic_add_negative对count增1。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP