Chinaunix

标题: 请教2.4内核中的up函数 [打印本页]

作者: spongebooob    时间: 2011-04-08 23:09
标题: 请教2.4内核中的up函数
本帖最后由 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岂不是多余的?
作者: spongebooob    时间: 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。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2