目录
CPU管理 && 多进程图像
要管理CPU,先要学会使用CPU
CPU的工作方式在操作系统学习之初就已经提过:
- 取值执行
- 程序存放在内存中,每段指令对应一个地址
- CPU发出取指命令,将想取地址通过地址总线传到PC
- 内存根据地址取出对应地址的指令
- 从总线传回,CPU解释执行
总之,就是自动的取指--执行
所以,管理CPU最直观的方法就是,设置PC的初值,CPU就能根据取指执行依次执行下去
好了现在CPU执行起来了,但这样的管理方式是否有什么问题?看下面一段程序:
int main(int argc,char* argv[]){
int i,to,*fp,sum=0;
to = atoi(agv[1]);
for(i = 1; i <=to; i++){
sum = sum + i;
fprintf(fp,"%d",sum);
}
}
- 注意fprintf(),这是一条IO指令。如果将其替换成一条计算语句,整段程序运行时长前后比值约为10^6:1
- 也就是说,IO指令特别特别慢
如果一段程序中IO指令的占比又很大,那么整个程序执行所耗时间中,IO指令会占非常大的比例。
- 换句话说,CPU很多时间都在摸鱼,等待IO指令完成在继续干活,这样CPU利用率就太低了。这样管理就出现了问题
怎么压榨CPU?
CPU管理的核心:并发
并发概念
让CPU不再一次局限于单段程序,而是多道程序,交替执行
由此得出一个重要的概念:并发
- 并发:一个CPU上交替地执行多个程序
注意并发与并行概念的不同:
并发(Concurrency):并发指的是一个系统能够同时处理多个任务。在一个单处理器系统中,多个任务交替执行,因为处理器实际上在一段时间内只能执行一个任务。这种情况下,因为多个任务交替执行的效果,看起来好像同时在运行。在一个多处理器系统中,多个任务可以真正同时执行,但是在并发系统中,即使没有多个处理器也能实现同时执行的效果。
并行(Parallelism):并行是指系统同时执行多个任务,每个任务都在不同的处理器核心上执行,因此它们真正同时进行。在一个拥有多核心处理器的系统中,可以实现真正的并行执行,每个核心处理器同时处理不同的任务。
并发与并行的区别:并发强调的是在单位时间内有多个任务同时进行,但是这些任务可能是交替执行的。而并行强调的是在同一时刻有多个任务同时进行。
通俗一点,一个系统可以同时处理多个任务,但这些任务可能只是交替执行,这是并发;而如果多个任务确实同时执行,那么这是并行。
这样,执行到像IO这样慢的步骤时,CPU就可以切换到另一个程序继续执行
如何实现并发?
要实现不同程序间的切换执行,首先想到修改寄存器PC。但只修改寄存器P C就可以实现吗?
很显然,还需要用栈来记录当前程序的一些信息。这和汇编模块化设计中用data段存数据一样。
- 由此,每个程序有了一个存放信息的结构:PCB,Process Control Block,进程控制块
就像我们正在看书,突然被人叫走做别的事,我们就应当停下来,记录当前页码以及故事情节,然后离开,这样回来后才能继续阅读。
这样,这些运行的程序就和静态的程序不同了。具体不同就体现在PCB表中。
由此引出一个概念:进程
进程描述了运行中的程序,如上图中程序1和程序2就是两个进程。
进程的名字十分形象
- 进程有开始、结束。程序没有;
- 进程会走走停停,是动态的,有状态的。程序没有
- 进程需要记录ax,bx......程序不用;
总结
由此,我们描述了CPU的管理:
- 使用CPU:启动进程,执行进程
- 更高效
压榨使用CPU:启动多个进程,交替执行多个进程 - 所谓多进程图像,便是CPU执行多个进程的过程,也是CPU执行的核心