在现代分时调度的操作系统中,CPU的调度是分为一个个时间片,分给应用程序使用。
这些程序都是并发执行的,即根据获得的CPU时间片,交替轮流执行任务调度,这个过程不可避免的会造成上下文切换。
上下文切换概括来说就是当前任务在执行完本次CPU时间片之后,切换到另一个另一个任务之前,会保存自己当前的状态,以便在下一次获得CPU时间片的时候,可以根据记录的状态,继从上次终止的时刻继续执行任务。
任务从保存状态到再次加载执行的过程就是一次上下文切换。
上下文切换会消耗大量的CPU时间,这个可能就是CPU耗时最多的操作了。
Java中有个CAS的概念,即Compare & Set ,或是 Compare & Swap ,这是一种乐观锁的操作方式,通过自旋让线程不要切换,有可能等一点时间就会得到CPU,相比于线程切换,这点等待的时间消耗非常小。
上面2个小例子,可以看出线程切换的消耗是非常大的,在资源有限的情况下,我们的优化方向是减少上下文切换的次数。
上下文切换,即context。不懂技术也没什么关系,我们再来看一下生活中上下文切换的场景。
比如在做数学题,突然手机弹出了一条消息:《震惊,3男2女竟在野外开展多人运动》,你出于好奇,点进去看了,发现就一条普通的内容,毫无奇怪的知识点,你感觉有点生气,遂刷了抖音,不知不觉就过去了3小时,等你意犹未尽的时候,发现已经忘了刚才的数学题的解题思路是啥了,不得不重新抓耳挠腮的解题。
从专注的状态中脱离,再回去的时候会发现效果大打折扣。
又比如你正在看生产环境的BUG,一会领导找你给他一份材料,一会同事找你问个问题,然后再来几个其他部门的人,问你一些看起来就让你窝火的问题。
等你终于可以清净一会的时候,发现已经到夜里了,也忘记自己DEBUG过程中找到的思路,不得不熬夜秃头查问题,卒。
计算机体系的设计,如果多想想的话,都可以在现实生活中找到可以参考的案例,有时候我们看着很忙,但是事后复盘的话,会发现几乎没干什么事,效率相当的低。
保持专注,尽量减少因外界干扰导致的场景切换,并做好时间分析,知道自己的时候都花在哪了,会逐步提高我们的时间管理能力。
在资源有限的情况下,通过科学合理的手段,提高资源的利用率,是值得我们好好研究的方向。
网友评论