一、问题描述
在pintos里,实现进程睡眠是依靠timer_sleep(ticks)函数。
该函数的实现是将进程“睡眠”后,利用Polling的机制不断中断当前CPU内的进程,使得CPU时间不能够让给别的进程,造成一个”忙等待”的现象。
这有点像一个俗语——“站着茅坑不拉shi”,把CPU时间一直紧紧攥着,然后也不让别的进程去完成任务了。而且这个进程也并没有真正睡着,一直在问我到底还有多久才醒过来,你说是不是很傲娇。
二、问题分析
-为了解决这个傲娇的问题,毫无疑问,我们需要将进程安抚睡着,并帮它掐好表,准时告诉它醒过来。
但不管怎样,我们从timer_sleep这个函数分析起。
/* Sleeps for approximately TICKS timer ticks. Interrupts must be turned on. */
void timer_sleep (int64_t ticks)
{
int64_t start = timer_ticks ();
ASSERT (intr_get_level () == INTR_ON);
while (timer_elapsed (start) < ticks)
thread_yield ();
}
-首先,我们看下面这条语句,它返回了当前timer从os启动后的tick次数。
int64_t start = timer_ticks ();
-然后这个ASSERT()宏定义为了确保系统允许中断,即别的进程可以抢茅坑。
ASSERT (intr_get_level () == INTR_ON);