代码里调sleep(1),实际的睡眠时间是多少?
这取决于调度延迟,在负载比较重的系统上,实际睡眠时间可能是1.5秒,甚至2秒,3秒,...。因此,不能依赖OS的sleep能够产生准确的时间。例如:当两个进程之间相互发送心跳确认消息的时候(或者lease),如果这个超时时间设置太小,就很容易发生超时。一个方法是用实时线程,但也不能绝对保证调度时延能够控制在一定范围内。另一个方法是:探测系统系统负载,探测调度时延,如果超出某个范围,及时报警。
下面贴图是在我的虚拟机上测试的调度时延情况,测试的时间不长,平均调度时延是171us,最大达到了几百ms。
测试代码在:gitee.com/mphyatyh/sched_latency
这取决于调度延迟,在负载比较重的系统上,实际睡眠时间可能是1.5秒,甚至2秒,3秒,...。因此,不能依赖OS的sleep能够产生准确的时间。例如:当两个进程之间相互发送心跳确认消息的时候(或者lease),如果这个超时时间设置太小,就很容易发生超时。一个方法是用实时线程,但也不能绝对保证调度时延能够控制在一定范围内。另一个方法是:探测系统系统负载,探测调度时延,如果超出某个范围,及时报警。
下面贴图是在我的虚拟机上测试的调度时延情况,测试的时间不长,平均调度时延是171us,最大达到了几百ms。
测试代码在:gitee.com/mphyatyh/sched_latency
#粤嵌星计划#
时间片耗尽/被抢占:
刚被创建的进程都处于“就绪”状态,等待系统调度,内核中的函数 sched( )被称为调度器,他会根据各种参数(比如优先级)来选择一个等待的进程去占用 CPU。进程占用 CPU 之后就可以真正运行了,运行时间有个限定,比如 20 毫秒,这段时间被称为 time slice,即“时间片”的概念。时间片耗光的情况下如果进程还没有结束,那么会被系统重新放入等待队列中等待。另外,正处于“执行态”的进程即使时间片没有耗光,也可能被别的更高优先级的进程“抢占”CPU,被迫重新回到等到队列中等待。
时间片耗尽/被抢占:
刚被创建的进程都处于“就绪”状态,等待系统调度,内核中的函数 sched( )被称为调度器,他会根据各种参数(比如优先级)来选择一个等待的进程去占用 CPU。进程占用 CPU 之后就可以真正运行了,运行时间有个限定,比如 20 毫秒,这段时间被称为 time slice,即“时间片”的概念。时间片耗光的情况下如果进程还没有结束,那么会被系统重新放入等待队列中等待。另外,正处于“执行态”的进程即使时间片没有耗光,也可能被别的更高优先级的进程“抢占”CPU,被迫重新回到等到队列中等待。
M L: Bad boys, bad boys what ya gonna do? What ya gonna do when we come for you?
M L: Dude, you gotta learn the words.
M B: We usually only do the chorus.
- - -
Not bad,on sched ☑️
Pharrell Williams/Loon《Show Me Your Soul (feat. Lenny Kravitz, Pharrell Williams, & Loon)》https://t.cn/A6McKlFE
M L: Dude, you gotta learn the words.
M B: We usually only do the chorus.
- - -
Not bad,on sched ☑️
Pharrell Williams/Loon《Show Me Your Soul (feat. Lenny Kravitz, Pharrell Williams, & Loon)》https://t.cn/A6McKlFE
✋热门推荐