5、你们的世界太慢,多任务(程序或进程)运行吧
我是一个专门计算员工薪水的小程序。
我听说我的祖先们生活在专用计算机里, 一生只帮助人类做一件事情,比说微积分运算、人口统计 、生成密码、甚至通过织布机印花 !
如果你想在这些专用“计算机”上干点别的事儿,例如安装个游戏玩玩, 那是绝对不可能的, 除非你把它拆掉, 然后建一个全新的机器,或者通过开关、重新连接电缆重新设计计算机,我这些祖先们勉强可以称为“程序”,叫外部程序。
后来有个叫冯诺依曼的人, 非常了不起, 他提出了“存储程序”的思想, 并且把计算机分为五大部件: 运算器、控制器、存储器、输入设备、输出设备。
各种各样不同功能的程序写好以后,和程序使用的数据一起存放在计算机的存储器中,即“存储程序”;然后,计算机按照存储的程序逐条取出指令加以分析,并执行指令所规定的操作。
这样一来,原来的专用计算机变成了通用的计算机,不管你是计算导弹弹道的,模拟核爆炸的,还是计算个人所得税的, 统统都可以在一台机器上运行。
我所在的计算机是个批处理系统, 每次上机时, 我和其他程序都排好队, 一个接一个的进入内存运行。
每个月末是发薪日, 我都要运行一次,这样我每月都能见一次CPU阿甘, 这个沉默寡言,但是跑的非常快的家伙。
我知道内存看阿甘不顺眼,还告了它一状,说他一遇到IO操作的时候,就歇着喝茶 ,从来不管不问内存和硬盘忙的要死的惨境。
其实我倒是觉得挺好, 这时候正好和阿甘海阔天空的聊天,他阅程序无数, 知道很多内部消息,每一个字节都清清楚楚, 和他聊天实在是爽。
又到了月末发薪水的时候, 我刚一进入内存,便看到这么一个公告:
公告
为了创建和谐社会,促进效率和公平, 充分发挥每一个人的能力,经系统党委慎重研究决定:本系统自即日起,正式从“批处理系统”转为“多道程序系统”, 希望各部门通力配合,一起完成切换工作。
系统党委xxxx年xx月xx日
我正想着啥是多道程序系统, 阿甘便打电话给内存要我的指令开始运行了。
和之前一样,运行到了第13869123行,这是个I/O指令, 我欢天喜地的准备和阿甘开聊了。
阿甘说: 哥们, 准备保存现场吧, 我要切换到另外一个程序来运行啦!
“啊 ? 我这正运行着呢! 咱们不喝茶了?“
“喝啥茶啊,马上另外一个程序就来了!”
" 那我什么时候回来再见你?” 我问道。
“等这个I/O指令完成,然后操作系统老大会再给你机会运行的。”
“那谁来记住我当前正在运行第13869123行? 还有刚把两个数据从内存装载到了你的寄存器,就是那个EAX, EBX , 你一切换岂不都丢了? ” 我有点着急。
阿甘说:“所以要暂时保存起来啊, 不仅仅是这些,还有你的那些函数在调用过程中形成的栈帧和栈顶, 我这里用寄存器EBP和ESP维护着, 都得保存起来。”
“还有” 阿甘接着说,“你打开的文件句柄,你的程序段和数据段的地址, 你已经使用CPU的时间,等待CPU的时间…… 以及其他好多好多的东西,统统都要保存下来。”
我瞪大了眼睛: “这也太麻烦了吧, 原来我只需要关心我的指令和数据, 现在还得整这么多稀奇古怪的东西”
“没办法,这就叫做上下文切换, 把你的工作现场保存好,这样下一次运行的时候才能恢复啊。 对了,老大给你们统一起了一个新的名称: 进程 ! 刚才那些需要保存的东西叫做进程控制块(Processing Control Block, PCB),”
我想了想,这个名字还挺贴切的, 一个真正进行的程序! 只是这个正在进行的程序随时可以被打断啊。
我只好保存好上下文,撤出CPU, 回到内存里歇着去了,与此同时另外一个程序开始占据CPU运行。
其实我这个程序,噢,不对,我这个进程被放到一个阻塞队列里,等到I/O的数据来了以后,又被赶到了就绪队列中, 最后才有机会再次运行,再次见到CPU阿甘。
阿甘从我的PCB中取出各种保存的信息,恢复了运行时现场, 可是忙活了好一阵, 没办法,这就是程序切换必须要付出的代价。
我有点同情阿甘了, 从此以后,他很难再悠闲和我们海阔天空,每时每刻都处于高速的奔跑中。
得益于阿甘的高速度, 虽然在同一时刻只有一个程序在运行, 但是有很多程序在短时间内不断的切换, 在外界看来, 似乎多个程序在同时执行。