操作系统管理CPU的直观想法
CPU的工作原理
要想管理CPU,就要先学会如何使用CPU。我们先从一个程序的执行来看看CPU是如何工作的。
void main(){ int i , sum; for(i = 0; i < 100000; i++){ sum = sum + i; } printf("%d",sum); }
如果我们想要执行上面的一个程序,首先我们需要把该程序放到内存中,然后给PC寄存器设置成存放该程序的内存首地址,比如把PC设置成50,CPU通过地址总线找到地址为50的内存,取出第一条指令并执行,并使PC加1指向下一条指令,CPU再取址执行。这个过程CPU是自动取址执行的。
从上面的程序可以知道,如果想让CPU工作起来,只需要给PC寄存器设置一个初值,就可以让CPU自动工作了。
什么是并发
我们来分别运行一下下面两个程序
//程序1 void main(){ int i , sum; for(i = 0; i < 100000; i++){ sum = sum + i; } sum = sum + 1; } //运行时间为:0.324s
//程序2 void main(){ int i , sum; for(i = 0; i < 100000; i++){ sum = sum + i; } //sum = sum + 1; printf("%d",sum); } //运行时间为:0.413s
实际上第二个程序是用一个IO操作指令代替了一条运算指令。上述结果表明执行一条运算指令的时间和执行一条IO指令的时间之比为1:105,IO操作比计算操作慢非常多,一般来说是好几个数量级。在进行IO操作的时候CPU是不工作的,如果让一个程序执行完后再去处理另一个程序,势必会造成CPU的利用率变低。所以为了CPU的利用率,在多道程序之间来回切换着使用CPU使CPU的利用率有效提高是非常重要的。
我们称一个CPU交替执行多个程序为:并发。
进程概念的引入
我们知道要提高CPU的利用率,可以让CPU并发的执行多道程序,那么如何做到并发呢?
需要把程序执行的地址切换到另外一个程序的首地址,然后CPU自动的取址、执行。通过PC寄存器(指示指令在存储器中的存放位置,也就是地址信息,在汇编中用寄存器IP表示PC)进行地址的切换。实际上仅仅切换PC是不够的,还需要还原该程序之前执行的信息,所以每个程序有了一个存放信息的结构:PCB。进程控制块(PCB)相当于一个结构体,包含进程状态程序计数器、CPU寄存器、CPU调度信息、内存管理信息、计数信息、IO状态等信息。
为了与静态程序相区分,我们称运行中的程序为进程。与静态程序相比,进程保存着用于控制和管理进程的所有信息,以便当程序再次执行的时候能够恢复到上次执行的状态进行执行。
多进程视图
我们知道操作系统的核心功能就是管理计算机硬件资源,由如何更好的利用CPU资源引出了对CPU的管理(操作系统对CPU的切换、调度和控制)。由对CPU的管理以便更好的利用CPU资源引出了多进程视图(多个进程在CPU上交替执行的样子)。