并发编程理论之多道技术、进程
操作系统的发展
-
穿孔卡片
1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式。
程序员将对应用程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
在这个时期,用户独占全机,而CPU要等待手工操作,CPU利用极其不充分。
-
批处理系统
主机和输入机之间增加了磁带这一存储设备,成批地把输入机上的用户作业读入磁带,而计算机依次把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。
相比手工操作,效率还是提升很多的,但是CPU的性能过剩还是很严重。
后来还引入了脱机批处理系统,增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机。当然起到的提升也是巨大,因为CPU不必反复等待程序录入了。
但是CPU的利用率依然有很大的提升空间。
-
多道处理技术
允许多个程序同时进入内存并运行
假设有两个程序想要在某cpu中运行,传统的单道程序工作程序占用时间的方式如下
而多道程序的占用时间方式如下:
实际上,就是IO操作不用CPU来做,所以在程序有IO请求时,我们的CPU就转去做其他程序的计算工作,而避免等待原程序IO操作而CPU可以进行其他工作的时间。
这样原本需要T1+T2才能结束的两段程序,使用多道技术后就可以不用这么长时间了。
多道技术实现方式
-
切换
计算机在程序遇到IO操作或者程序长时间占用CPU时会将CPU的使用权交给其他程序。
-
保存状态
在把CPU使用权交接出去时,会保存当前程序的执行状态保存下来,使已经执行过的程序是有效的。
进程理论
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。
简单来说,是正在运行中的程序,其占用着某些包括CPU在内的系统资源。
刚才在介绍正在跑的程序A和程序B就是进程A和进程B。
进程的并行与并发
-
并行
多个进程同时执行,须要多个cpu配合,同时运行这多个进程
-
并发
多个进程在某一时段看起来同时运行了,但实际上每一时刻只有一个进程在被CPU执行
我们刚才所介绍的多道技术就是提现了并发的思想。
进程的调度算法
进程的调度算法指操作系统面对多个进程时,如何分配CPU时间的策略。
-
先来先服务的算法
简单的策略,哪个进程先进来,就先执行完哪个进程
缺点很明显,当遇到一个长时间进程时,对短进程不友好
-
短作业优先调度法
也很粗暴,哪个进程执行的快就执行哪个进程,对长进程又不友好
-
时间片轮转法
每次分配CPU的一个小时间段给某个进程,到时间就保存当前进程状态和切换另外一个进程。
这样分配,所有程序都不会等太久。
-
多级反馈队列
在时间片轮转的基础上,这个程序如果每次都是因为时间片到时间了而不是IO而被剥夺使用权,那就每次分配长一点的时间片给这个程序。
这样可以减少轮转的频率,也可以让各种程序都执行的相对连贯。
进程的三种状态
-
就绪态:每当程序开始运行编程进程,都会进入这个状态,是等待CPU的使用权的状态
-
运行态:正被CPU执行的状态
- 当程序结束会进入终止态
- 当程序遇到IO会进入运行态
- 当时间片到会返回就绪态(cpu要分配给其他进程)
-
阻塞态:正在执行IO操作时,这是CPU就不会去选择执行这段进程
当阻塞态结束会重新回到就绪态。
- 创建态和终止态:进程开始和结束的状态