- 论坛徽章:
- 0
|
本帖最后由 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。 |
|