程序活着的标志是进程,把进程总结为一个公式:进程=程序+状态。
多个进程在内存中运行过程就像一场社交活动,需要交流,为了保证社交活动能够正常进行就要对进程的行为作出干预(调度)。因此需要对单个进程、多个进程的交流进行管理。
(一)进程
1.什么是进程
关于进程的定义有很多,其中一个定义是:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
其实进程也就是程序在内存中运行时的标志,当一个程序被执行时,它从外存被调入到内存中工作,通过进程来标志它的工作状态。因此需要创建小本本一样东西来记录它的状态,这个东西就要做进程控制块(Process Control Block,PCB),一旦PCB被创建了,也就意味着该程序的进程创建了。
2.进程为什么会出现
由于多道批处理操作系统的出现,多个程序可以并发运行,并且可共享资源,这导致了它们失去了封闭性。一旦失去封闭性,某个程序执行的命令、使用的变量都会受到其他程序的影响,因此引入进程来管理程序的运行状态。
3.进程有哪些特征
每个程序运行都会创建一个进程,进程通过PCB来记录动态运行时的状态,既然PCB用于记录,那么要符合一定的约束条件,记录必须描述,才便于管理。由此可得出进程的特征:
- 动态性,这是一个进程的生命周期
- 并发性,多个程序可并发执行,使得多个进程可并发运行
- 独立性,每个进程都是独立的模块,运行自己的生命周期
- 异步性,由于进程是独立运行的,由于其运行速度不一致导致异步
- 结构性,进程是由程序段、数据段和PCB组成
4.如何创建一个进程
程序放在外存中,当用户运行某个程序时,该程序会从外存调入到内存中,这是进程创建的过程。具体实现过程如下图所示:
进程创建过程PCB记录进程的基本描述信息、控制和管理等一系列信息。其中一项——进程当前状态,不断更新进程的生命状态。进程有5种生命状态:新建、就绪、运行、阻塞和终止。
进程一旦被创建就加入到就绪队列等待调度,此时进程获得除处理机以外的所有资源,只要进程获得处理机便进入到运行态;进程在运行一个时间片周期后,没有执行完毕,重新调回就绪队列中,如果执行过程中需要获取如打印机这类资源,则调入阻塞队列;只要进程等待事件到来,便重新加入就绪队列中。
5.什么是线程
线程是“轻量级进程”。如果把进程比作工厂,那么线程就是工厂里的生产线,生产线上的元件是共享资源。
同进程一样,线程可以创建和撤销子线程,多个线程之间可以并发执行,同时它也有就绪、阻塞和运行三种状态。
6.线程实现了什么
由于进程的并发性,使得其在创建、相互切换等花费较大的时空开销,引入线程,目的就是为了实现减小程序在并发执行时所付出的时空开销。
体现在以下方面:
- 调度。引入线程后的操作系统,以线程作为独立调度的基本单位,而进程作为拥有资源的基本单位,如此,在同一进程内切换线程不会引起进程的切换,但是不同进程切换线程,会引起线程切换;
- 资源。进程是拥有资源的基本单位,线程共享进程内的资源,这大大减少了资源开销;
- 并发。多个线程可并发执行,提高系统吞吐量;
- 通信。进程间通信需要进程同步和互斥手段辅助,线程间直接读/写进程数据段来进行通信。
(二)调度
1.进程调度史
在多道批处理系统中,进程并发运行,争夺处理机,为了解决这个问题,使用处理机调度,利用公平、高效的算法选择一个进程运行。
程序执行往往经历三级调度:
- 作业调度:辅存与内存之间的调度,每个作业只调入一次,调出一次,每次调入分配内存、输入\输出等必要资源;
- 中级调度:将暂时不用进程调到外存等待,此时的进程还拥有资源,一旦内存空闲且需要运行,则重新调入内存;
-
进程调度:按照某种策略从就绪队列中选择一个进程运行
调度层次
2.调度方式
如果某个进程A正在CPU上执行时,有一个优先级更高的进程B进入就绪队列,如何分配CPU?两种方式,第一种,等待A的时间片用完或者进入阻塞态后,才把CPU分配给B,第二种,直接暂停A,把CPU分配给B。
这两种方式分别称为非剥夺调度方式和剥夺调度方式:
非剥夺调度方式相比较剥夺调度方式来说优雅一些,比如你在排队在窗口买火车票,有个人很着急,他越过排在你后面的所有人,直接排在你后面,等你买完票后轮到他买,这就像非剥夺调度,而另一种人则直接把你从买票窗口推开,直接买票,这是剥夺式调度。
3.调度算法
操作系统中有6中常用的调度算法:
-
先来先服务:哪个进程优先进入就绪队列,就先执行哪个进程。
image.png -
短作业优先:根据进程运行时间长短选择最短的进程,这种算法下有非剥夺式短作业优先和剥夺式短作业优先。
非剥夺式短作业优先:qq在处理机上执行,就绪队列中微信的运行程序比它短,但是微信等待qq从处理机上退出后才获得处理机;
剥夺式短作业优先:由于就绪队列中的微信运行时间比qq短,直接暂停qq,把处理机分配给微信。
image.png
- 优先级调度:PCB中记录每个进程的优先级,将处理机分配给优先级高的进程,同短作业优先一样,这种算法下也有非剥夺式优先级调度和剥夺式优先级调度。
- 高响应比优先调度:这种调度方式常用与作业调度,根据公式选择响应比高的作业运行。
- 时间片轮转调度:主要用于分时系统,所有进程在就绪队列排队,每个进程依次定时使用处理机,如果规定时间范围内进程没有完成,则重新排队。
- 多级反馈队列调度:该算法结合优先级调度和时间片轮转调度,将就绪队列分为不同级别优先级,对优先级不同的队列运行时间不同,优先级高的队列运行时间短,优先级低的队列运行时间长。
如图:
1.在优先级为3的队列上有3个进程等待运行,有1个进程在CPU上处理,当时间片用完时这些程序都没有执行完毕,则依次进入优先级为2的队列等待调度;2.qq、wechat在优先级为2的队列执行完毕,直接退出,而浏览器和lol没有执行完毕,它们进入第三个队列等待调度。
(三)进程同步
1.进程之间的关系
多个进程并发运行,它们之前有什么联系?协助和竞争,也就是同步和互斥。
同步:多个进程为了完成同个任务而相互等待,它们之间是相互合作关系。
互斥:多个进程因争夺某一临界资源而等待,只有一个进程使用完后,另一个程序才能使用,它们是竞争关系。
2.解决同步、互斥的方法
解决同步、互斥问题的原因主要是为了保护数据,避免产生与最终预期不一致的结果。
1.软件实现方法
2.硬件实现方法
3.信号量
(四)死锁
1.死锁是什么
计算机内部资源有限,如果多个进程并发执行,且每个进程在执行一开始获得部分资源,执行过程中需要申请其他资源,此时申请的资源被其他程序占用,使得多个进程无法向前推进,形成死锁。
比如两辆车同时过河,它们上桥行驶一半后发现对方,但都不退让,使得双方都没办法继续先前行驶。
image.png
2.死锁产生的原因
系统资源的竞争和进程推进顺序非法。
系统资源的竞争:计算机内部存在不可剥夺的资源,一旦多个进程争夺这些资源,就有可能造成死锁;
进程推进顺序非法:进程执行过程中会不断请求和释放资源,如果某一进程对资源需求量大,不断请求该资源,使得其他进程无法请求足够资源,也会导致死锁。
3.什么条件下会产生死锁
死锁产生的必要条件:
- 互斥条件:进程之间存在竞争关系;
- 不剥夺条件:进程只能主动释放资源,不能在运行中被剥夺;
- 请求并保持条件:已有资源的进程在执行过程中申请被其他程序占用的资源;
- 循环等待条件:每个已获得资源的进程同时被其他进程请求资源,形成循环链。
4.避免死锁的策略
避免死锁的策略以破坏以上四个必要条件为目的,在三个不同时机(事前、事中和事后)提出不同的策略。
这三个时机分别对应:死锁预防、死锁避免和死锁检测。
image.png image.png
网友评论