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