关于sleep的理解

unix是按时间片轮转调度, windows是抢占式调度

以吃蛋糕为例子,10个人吃蛋糕,如果是unix下,

假设开始时,每个人都处于就绪状态,那么操作系统调度大家排好队,按顺序吃,每个人吃1分钟,

1分钟就是操作系统给大家分配的时间片, 那么

1)有些人饭量大,吃一份钟也不饱,还想吃,但是操作系统在到1分钟时限后,会让这个离开,到就绪队列里,等操作系统叫他.

2)有些人饭量小,吃了10s钟,就饱了,他跟操作系统说,我吃饱了,操作系统就调度另一个人进来吃, 相当于sleep(0),主动放弃剩下的时间片.

3)还有些人吃了10s,这时噎住了,要去喝水,这时他跟操作系统说,我10分钟后再回来吃,操作系统就调度另一个人进来吃,并把这个人标记

    成阻塞状态,并且10分钟内都不会叫这个人来吃蛋糕, 10分钟到了之后,操作系统把这个人安排到就绪队列中,当轮到这个人的时候,操作系统

    通知它吃蛋糕. 相当于sleep(10分钟)

 

如果是抢占式的操作系统

1. 操作系统先算出优先级最高的人, 这个人一直吃,直到吃到不想吃为止

2.操作系统再算出优先级最高的人,重复1 

 

sleep(x)  表示当前线程,在x时间内,不竞争cpu时间片, 等x时间到了后,才参与时间片的竞争,拿到时间片之后,才会被调度执行

所以sleep 是不能做精准定时的, 线程从休息到执行,中间等待的时间是 ( x + 进入就绪队列后,等待CPU调度执行的时间)

posted @ 2016-09-04 13:27  JinleiZhang  阅读(410)  评论(0编辑  收藏  举报