【摘要】:目前版本的实现中,时钟中断函数主要完成下列两项主要工作:1)处理定时器队列。中断处理函数会检查系统中的所有定时器对象,一旦发现有定时器对象超时,则会处理该超时的定时器对象。处理方式包括调用定时器超时函数、向定时器的归属线程发送消息等。同时也可以得到结论:线程的睡眠时间,必须是时钟周期的整数倍,因为睡眠状态的核心线程,只有在时钟中断处理程序中,才会被唤醒。
时钟中断的所有处理工作,都是在时钟中断处理函数内完成的。目前版本的实现中,时钟中断函数主要完成下列两项主要工作:
1)处理定时器队列。中断处理函数会检查系统中的所有定时器对象,一旦发现有定时器对象超时,则会处理该超时的定时器对象。处理方式包括调用定时器超时函数、向定时器的归属线程发送消息等。更详细的信息,请参考8.9节。
2)唤醒睡眠状态的核心线程。核心线程通过调用Sleep函数进入睡眠状态,Sleep函数会指定一个睡眠时间。一旦该睡眠时间到达,线程就会被重新唤醒。唤醒线程的操作,也是在时钟中断处理函数内完成的。
定时器队列的处理,将在8.9节中做详细介绍。在本节中,我们查看唤醒核心线程的操作代码。(www.xing528.com)
下面是时钟中断处理函数中唤醒睡眠线程的实现代码,为了解释方便,删除了一些无关代码,比如参数安全检查代码、代码注释、安全检查的条件分支代码等。这些代码的删除,不会影响我们对这个函数的解释。
上述代码主要是对睡眠状态的核心线程进行处理,虽然代码相对比较多,但是整体逻辑比较简单,无非是判断线程是否需要被唤醒,如果是,则修改其状态,然后加入就绪队列。
同时也可以得到结论:线程的睡眠时间(即Sleep函数的参数),必须是时钟周期的整数倍,因为睡眠状态的核心线程,只有在时钟中断处理程序中,才会被唤醒。当然,在调用Sleep函数的时候,可以指定任何参数,但Sleep函数会自动把参数向上舍入到系统时钟周期的整数倍。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。