上一部分讨论了什么是操作系统,我们的结论是操作系统是帮助程序运行的程序。这部分开始讨论具体怎么帮助程序运行的。
2.1操作系统怎么帮助应用程序使用CPU的?(A级)
我们还是从最简单的案例入手,假设一个计算机从出生到报废,只有一个程序会在这个计算机上运行,那么如果仍然是冯诺依曼式的计算机的话,则应该是计算机开机后装载这个程序进入内存,然后置cpu的ip指针到这个程序的起始地址开始取指执行取指执行,直到程序运行结束。应该长成下图
或者,如果这个计算机虽然可以有多个程序运行,但是每次只运行一个程序,那么效果也如上图。或者,如果这个计算机虽然有多个程序运行,但是都是顺序运行,如下图
虽然有4个程序同时进入内存,但是它们是顺序运行的,比如程序0开始运行,程序0结束后程序1开始运行,程序1结束后程序2开始运行,以此类推,那么这种模式下的程序运行很简单,每个程序结束的时候把cpu的ip指针指向下一个程序的开始地址就可以完成每个程序的取指执行的循环了。
但是,如果有一个程序是这样的
那么编译后运行结果,如下图
我们看到这个程序耗时0.859秒,如果用一条非I/O指令取代fprintf,并再次运行,而且循环次数增加一万倍,则运行时间如下图所示,耗时0.015秒。比有fprintf的时候大概快了一万倍。也就是说在计算机运行fprintf的这个指令的时间段,可以运行别的非I/O指令大概一万条还要多。所以,这里的fprintf这样的操作是非常耗时的,这个时候如果cpu等待fprintf的结束,则相当于等了可以运行一万多条指令的时间 。
(以上例子取自哈工大 李志军老师的操作系统课)
所以,有一个简单想法就是,能不能在这个fprintf执行的时候,让cpu去运行别的程序,那段时间可以运行一万多条指令呢,不要让cpu在这里白白浪费时间等待?
如果这样的话,则程序运行就成如下图这种方式了
程序A先占用cpu,这时候程序B在等待或者操作设备DEV1,等到程序A需要执行DEV1的时候,程序B使用cpu。。。以此类推,这样的话cpu的利用率提高了,程序A或者程序B在与外设交互的时候不耽误另外的程序占用cpu。也就是所谓的cpu和I/O设备并行工作。
如果要做到这样利用计算机的话,则需要有第三方力量来记录程序的断点,并有能力恢复到断点继续执行下去。这个第三方力量非操作系统莫属。
2.2进程的出现(B级)