首页 理论教育 操作系统实现之路-线程睡眠与唤醒

操作系统实现之路-线程睡眠与唤醒

时间:2023-10-21 理论教育 版权反馈
【摘要】:线程在执行的过程中可以调用Sleep函数,暂时进入睡眠状态,一段时间之后,继续运行,睡眠的时间由Sleep函数的参数指定。Sleep函数把当前线程对象插入睡眠队列,然后引发一个线程重调度。假设系统时钟中断周期为T,而线程调用Sleep函数的时候,指定一个参数为t,则该线程的实际睡眠时间应该为(t/T)*T+T(t%T!上述所谓的睡眠时间是线程处于睡眠状态的时间,上述时间到达后,线程并不一定马上得到调度,因为线程仅仅被重新插入就绪队列。

操作系统实现之路-线程睡眠与唤醒

线程在执行的过程中可以调用Sleep函数,暂时进入睡眠状态,一段时间之后,继续运行,睡眠的时间由Sleep函数的参数指定。Sleep函数把当前线程对象插入睡眠队列(lpSleepingQueue),然后引发一个线程重调度。

每次时钟中断,中断处理程序都会检查当前睡眠队列中,是否有睡眠时间到的线程,若有这样的线程,则时钟中断处理程序会从睡眠队列中把这些睡眠的线程删除,然后插入就绪队列,这样在合适的时刻,这些线程就会又被调度执行。

可以看出,睡眠时间虽然可以采用Sleep函数的参数以毫秒(ms)为单位进行指定,但实际的睡眠时间粒度应该是系统时钟频率。假设系统时钟中断周期为T(ms),而线程调用Sleep函数的时候,指定一个参数为t(ms),则该线程的实际睡眠时间应该为

t/T*T+Tt%T!=0)(www.xing528.com)

其中,t/T为t除以T所得的结果的整数部分,而t%T则是t对T取模所得的结果。当然,如果t刚好能够被T整除,则睡眠时间就是t。

上述所谓的睡眠时间是线程处于睡眠状态的时间(在睡眠队列中的时间),上述时间到达后,线程并不一定马上得到调度,因为线程仅仅被重新插入就绪队列。若线程的优先级不是就绪队列中最高的,则可能不会被马上调度;若线程的优先级是最高的,则可以马上得到调度。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈