狭义上,进程就是正在运行的程序实例。广义上,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作i系统中,进程既是基本的分配单元,也是基本的执行单元。
什么是进程
为了将每个程序分离开来,在运行的时候,都有自己的运行空间,所以操作系统引入了进程的概念。
(1) 进程是一个实体,每一个进程都有它自己的地址空间,一般情况下,包括文本区域,数据区域,堆栈。
- 文本区域存储处理器执行的代码;
- 数据区域存储变量和进程执行期间使用的动态分配的内存;
- 堆栈区域存储着活动的过程调用的指令和本地变量。
(2)进程是一个‘执行中的程序’。程序是一个没有生命的实体,只有处理器赋予程序生命时,她才能成为一个活动的实体,我们称之为进程。
进程的特征
- 动态性:进程的是指是程序在多道程序系统中的依次执行过程,进程是动态产生,动态消亡的
- 并发性:任何进程都可以同其它进程一起并发执行。
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
- 结构构特征:进程由程序、数据和进程控制块三部分组成。
- 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但在执行过程中,程序不能发生改变。
程序和进程的区别
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
进程是程序在处理机上的一次执行过程,他是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。
进程调度
想要多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的规则,由此有了进程的调度算法。
- 先来先服务(FCFS)
FCFS是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。它比较有利于长作业进程,不利于短作业进程。本段发适用于CPU繁忙型作业,不利于I/O繁忙型作业。 - 短作业优先调度(SJ/PF)
对短作业进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业被及时处理,作业长短时被估算出来的。 - 时间片轮转
- 多级反馈队列
进程的并行与并发
并行:指两者同时执行。例如多个代码,同时运行。
并发:指资源有限的情况下,两者交替轮流使用资源。比如两个代码,同一时间系统只能运行一段代码,A执行一部分,让给B执行,B执行一部分继续交给A执行,交替使用,直至结束。
区别:
并行是从微观上,也就是精确到了时间片段上,有不同的程序在执行,这就要求必须有多个处理器。
并发时从宏观上,在一个时间段上可以看出时同时执行的,比如一个服务器同时处理多个session
同步、异步与阻塞、非阻塞
从上图中,可以看到,进程创建之后,经由提交进程处于就绪状态,再经过进程调度,到运行。在此期间,可以有事件请求,事件请求可以是网络请求、I/O、文件的输入输出等操作。此时就会发生阻塞,阻塞完毕之后,会重新进入到排队的状态中,然后经过进程的调度,才能重新被执行。
同步、异步
同步就是一个任务的完成需要依赖另一个任务,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两任务的状态可以保持一致。
异步就是不需要等待被以来的任务完成,只是通知被以来的任务要完成什么工作,以来的任务一立即执行,只要自己的任务完成了,整个任务就完成了。这是一种不可靠的任务序列。
阻塞、非阻塞
阻塞和非阻塞这两个概念与程序等待消息通知时的状态有关,也就是说阻塞与非阻塞是从程序等待消息通知时的状态角度来说的
- 同步阻塞形式
效率最低。只能做当前的事请,其他的事情都做不了 - 异步阻塞形式
如果在银行等待办理业务的人采用的是异步的方式去等待消息被通知,也就是领一张纸条,假如在这段时间里不能离开银行做其他的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;异步操作是可以被阻塞住的,只不过它不是在处理消息的时候被阻塞,而是在等待通知时被阻塞。 - 同步非阻塞形式
效率也是低下的。可以想象成再一个人一边打电话,一边看排队是否排到自己,如果把这两个行为当作是两个操作的话,这个程序需要一直来回切换,效率低下程度可想而知。 - 异步非阻塞形式
效率最高。因为打电话时这个人的动作,而通知这个人排队的消息是另一个人的动作,程序没有在两种不同操作之间来回切换。比如说,这个打电话的人突然想抽烟,他告诉大堂经理说等排到我告诉我一声,那么他就没有被阻塞在等待的操作上。这就是异步+非阻塞的方式了
很多人会把同步和阻塞混淆,因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般不会再真正的I/O操作时被阻塞。