11-02 多进程理论篇

一. 什么是进程

进程的发展史(来源): 进程的概念来源于操作系统, 是操作系统最核心的概念. 是由操作系统提供的最古老的也是最重要的抽象概念之一, 操作系统其他的所有内容都是围绕进程的概念展开的.

进程:正在进行的一个过程或者说一个任务。是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个抽象概念,所有多道程序设计操作系统都建立在进程的基础上。

二. 进程与程序的区别

程序就是一堆躺在硬盘上代码, 是'死'的. 程序存在于硬盘中.
进程则是表示程序正在执行的过程是'活'的. 进程存在于内存中.

三. 进程调度

要想多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。

1) 先来先服务调度算法
    先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。
    
2) 短作业优先调度算法
    短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

3) 时间片轮转法
    时间片轮转(Round Robin,RR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。在时间片轮转法中,需要将CPU的处理时间分成固定大小的时间片,例如,几十毫秒至几百毫秒。如果一个进程在被调度选中之后用完了系统规定的时间片,但又未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程。

4) 多级反馈队列
    前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中,调度算法的实施过程如下所述。
    (1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
    (2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。
    (3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在
    补充: 在linux系统可以给任务设置任务优先级. 比如这个任务比较重要,一次性需要分配好几个时间片,让其他任务先停一下,让这个任务先去运行.
    例子: 比如你打开一个百度云,那么就把你百度云先展示页面先起来,但你不做出任何的操作了下,就不会去运行,当你点击操作的时候,就会去运行你的操作,把这种你不做操作的这种时间节省下来.也就是说当你要打开新程序的时候,会停下当前执行的任务,新程序给你打开, 因为一般情况下打开并不需要长时间的占用CPU.

四. 并发与并行

1) 并发: 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
    实现: 单个cpu+多道技术就可以实现并发
    
2) 并行: 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑. 

3) 区别:
    并发是是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发
    并行是同时运行, 只有具备多个cpu才能实现并行
    
    注意1: 并行肯定是并发. 并发一定不是并行.
    注意2: 单核的计算机肯定不能实现并行,但是可以实现并发.(补充: 我们直接假设单核就是一个核干活的,就是一个人不要考虑CPU里面的内核数.)

五. 进程里的2大概念: 同步异步 & 阻塞非阻塞

在了解其他概念之前,我们首先要了解进程的几个状态。在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪(ready),运行(running)和阻塞(blocked)。

图解:

# 注意!!!: 所有的程序要想被执行,必须先经历就绪态

1. 用户向操作系统发送系统调用执行硬盘中的程序, 操作系统控制磁头转动将躺在硬盘中的二进制格式的程序读入内存, 提交本次任务交给CPU处理.
2. 本次任务开始状态处于就绪态的列队之后(安装进程调度算法来排列)
3. 当轮到本进程CPU会调度该进程, 此时进程会处于运行态, 在该状态中CPU执行进程中的数据. 处理的过程中分3种结果.
	- 第一种结果就是该进程是一个长作业任务, 在就绪态操作系统分配的时间片内进程还未执行完毕, 操作系统会剥夺当前进程的执行权限, 将该进程打回就绪态, 再按照一定的进程调度算法修改该进程下一此处于就绪列队的哪个位置. 
	- 第二种结果就是进程在就绪态由操作系统第一次刚提交进程任务时, 按照进程调度算法第一次分配给该任务的CPU执行时间片的时间内进程在运行态就被CPU执行完毕任务. 于是操作系统将会释放刚刚进程所占用的系统资源.
	- 第三种结果就是在进程被CPU执行的时间片内遇到了IO问题, 此时操作系统按照多道技术规定切换任务(剥夺该进程的CPU执行权限)并且保存该进程的当前执行状态. 此时该进程就处于阻塞态, 等到阻塞的时间完毕, 将会继续处于就绪态中的就绪队列中等待下一次被调用.(进程这种多状态的切换过程中操作系统将会通过进程调度算法又会计算该进程的作业状态并分配一定时间的时间片等待下一次的调用)
	
# 关于阻塞态的2个问题:
	- 什么时候会进入到阻塞态: 当你的进程引发Io操作的时候
	- 什么时候不会进入到阻塞态? 当你的时间片到的时候,就不会进行阻塞态

# 注意: 如果进入了阻塞态,要想下次继续运行,如果在用户主阻塞态之前有新的需求进来,那么这个阻塞态的进程会转为就绪态会排在这个新的进程后面,在新的进程被调度执行一定时间以后,才会接下来去调度你的进程进入运行态.

同步异步 & 阻塞非阻塞介绍:

# 两最重要的概念(掌握):
    - 同步和异步: 指的是任务提交的方式
        - 同步: 提交任务之后,原地等待任务的返回结果, 等待结果期间不做任何事情.
        - 异步: 提交之后不原地等待任务的返回结果,直接执行下一行代码. 结果由异步回调机制做处理.
        
    - 阻塞非阻塞: 指的是程序的运行状态
        - 阻塞:    阻塞态
        - 非阻塞:  就绪态, 运行态
    - 归纳: 上述概念的组合最高的一种组合就是`异步非阻塞`
    - 理想状态: 我们应该让我们的写的代码永远处于就绪态和运行态之间切换
posted @ 2020-04-22 22:57  给你加马桶唱疏通  阅读(207)  评论(0编辑  收藏  举报