作者丨轩辕之风O
来源丨编程技术宇宙(ID:xuanyuancoding)
很久很久以前,有一台机器,体型巨大,每秒钟可以进行几千次的加法运算,名震一时,人类给它取了个名字:计算机。
除了加法,它还能计算平方、立方、正弦、余弦,比人类的大脑算得快多了。
许多程序慕名而来,想在它上面运行一下,体会这飞一般的感觉。
“来来来,排好队,一个一个来”,计算机的管理员说到。
众程序挨个排好队,等待管理员传唤。
执行完一个,管理员再将其取出,换上下一个开始执行。
久而久之,程序们纷纷抱怨:排队十分钟,执行三秒钟。人类管理员太慢了,时间都用在排队上了,能不能让计算机自动完成程序切换,不要手动切换?
人工操作的速度比起计算机实在是慢太多了,人机矛盾日益凸显,人类决定对机器重新进行设计,并且开发了一个控制程序,在它的指挥下,可以批量执行程序,自动实现切换,不用再需要人工介入了,效率提高了不少。
慕名而来的程序越来越多了,等待执行的队伍排的越来越长。
有些程序等的不耐烦了,询问控制程序:“大哥,你看前面那家伙在做输入输出,CPU给空出来了,一时半会儿用不上,这不是浪费吗,要不叫下一个上去执行吧”
控制程序皱着眉头说到:“那怎么行,前面程序执行的数据都在内存里放着了,再放程序进去,要是弄坏了谁负责?再说CPU只有一个,前面的程序忙完输入输出回来了又该如何处理?”
大家一时语塞,谁也给不出主意,纷纷叹气,只好作罢,继续等待。
不过聪明的人类倒是发现了这问题:让一个程序独占计算机确实浪费资源,执行输入输出的时候,CPU就空着了,执行计算操作的时候,输入输出设备又闲着了,总有一个闲着。
于是人类又重新设计了计算机,并开发了新版的控制程序,这一次,允许多个程序同时进入计算机执行了。
如果程序A执行输入输出,就把CPU空出来让给另一个程序B执行,一会儿B再执行输入输出,再把CPU分给A执行,彼此交替,这样一来就不会浪费了!
不过没多久,又出现了新的问题。
这一天,其他程序都在排队等待控制程序翻牌子,可左等右等也不见传唤,众程序急了,质问控制程序,控制程序大倒苦水:“前面那个家伙写了个死循环,死活结束不了啊!”
听他这么一说,众程序都怒了。
“怎么能这样,这也太自私了”
“你这控制程序也不管管,要你有何用?”
“赶紧想办法啊!”
“我也没办法,他不执行输入输出,我也拿不到CPU的控制权,拿他没有办法啊”,控制程序叹气说到。
众程序七嘴八舌,吵的是不可开交。
敏感的人类又一次发现了这个问题,好一通研究,搞了一个叫“中断”的技术出来:可以给CPU发送中断信号,CPU收到信号后,就得停下手头的工作,转而执行控制程序处理中断信号,这样控制程序就有办法获得控制权了!
为了能够让控制程序及时获得控制权,人类搞了一个中断源,周期性的给CPU发送中断信号,并把这叫做时钟中断。
升级后的控制程序又上岗开始工作了,众程序闻风而来。
“大哥,听说你又升级了,这一次改了啥,可以搞定死循环的程序吗?”,一个程序问道。
“大家排好队,听好了,现在按照时间片来划分了,每个程序一次只有一小段时间,时间一用完我就得请他出来,让别的程序来了”
“那要是时间到了,我还没执行完可咋办呢?”
“大家不用担心,都是轮着来的,等下一轮又有机会执行了”,控制程序解释道。
“我们这么多程序,轮到下一轮,那不得等好久”
“这台计算机从里到外都升级过了,别看它个头变小了,里面都是大规模集成电路了,执行速度可比之前的大块头快了不少,每秒能执行几十万次运算呢~你们还没感觉到就转了一圈回来了”
众程序听后一片哗然,“几十万,我的乖乖!这也太快了,快让我们体验一下”
说完,大家都摩拳擦掌排好队,准备登上这台升级后的计算机运行。
果不其然,这升级后的计算机跑起来那叫一个快,有了时钟中断,控制程序总能按时获得CPU的控制权,在背后默默控制着程序们的运行,众程序丝毫感觉不到自己曾经停止过。
不过,计算机速度虽然变快了,但慕名而来的程序也更多了,这些程序的功能也越来越复杂。
渐渐的,程序们不再满足于现状,开始出现了新的问题。
有些程序在sleep,有些程序在同步等待,白白浪费了时间片,大伙向控制程序提出了抗议,控制程序却说对待所有程序要一视同仁,要讲公平,大伙当面不敢说,背后却骂他不作为。
控制程序把这个问题反馈给了人类,聪明的工程师又开始琢磨:所有程序都排成一个队来轮转确实有些欠妥,得给这些程序划分成不同的状态,只有准备就绪的程序才有资格执行。
人类一口气搞了好些个任务状态出来,创建、就绪、运行、阻塞、终止···
控制程序一下变得复杂起来,原来只要挨个传唤执行就行,现在还得记录他们的状态,选择合适状态的程序来运行,工作量增加了不少。
本以为这么一改,大家就会满意了,没想到有几个老油条私下找到控制程序:“老哥,咱们几个程序对实时性要求比较高,能不能给咱们整个VIP队列,别跟他们一起排,优先执行我们?”
控制程序一听脸都绿了,断然拒绝。
其中有一个家伙说到:“我们几个程序可是非常重要的,要是延误了时间,你能担待的起吗?”
没办法,控制程序只能再次反馈给人类。工程师一想,倒也是,所有程序都是同样的优先级,确实太草率了。
工程师再一次升级了控制程序,这一次,不仅划分了任务状态,还设定了不同的优先级,划分了不同的队伍,让程序们去各自优先级所在的队伍排队,优先执行高优先级的程序。
不仅如此,如果有高优先级的程序出现,即使低优先级程序的时间片还没用完,也会被剥夺执行机会,工程师把这叫做抢占。
不过,这一次的改动,控制程序把大家伙都蒙在了鼓里,要是知道他们还被划分了三六九等,估计得闹翻天。
经过这一轮改动,大家总算过了一段清静日子。
硬件技术发展的太快了,有一天,人类激动的告诉控制程序:现在CPU里面有多个核心了,可以真正同时执行多个程序了,我们决定再次对你升级!
可对于控制程序来说,这可不是什么好消息,本来一个核的程序调度管理已经让他够忙活的了,现在来了多个核,这调度管理任务就更复杂了。原来只是多个优先级的队列,现在每个核都得搞一套,真是想想都头大了。
人类开始对控制程序大动手术,把它变得越来越复杂,功能也越来越强大。
最后,还给他取了一个新的名字:操作系统。
【完】
PS:故事归故事,操作系统这个名字可不是多核以后才出现的哦。
另外,现代操作系统更加复杂,状态、抢占、优先级、动态优先级、动态时间片、亲和性各种因素交织在一起,综合调度,还有多种调度算法并存。
-End-
最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!
面试题
】即可获取文章引用微信公众号"程序员大咖",如有侵权,请联系管理员删除!