就绪态 | 指进程仅缺少处理器,只要获得处理机资源就立即运行 |
等待态 | 是指进程需要其他资源(除了处理机)或等待某一事件 |
下图为5种进程状态的转换:
而三种基本状态的转换如下:
就绪态—>运行态:获得处理机资源(分派处理机时间片)。
运行态—>就绪态:让出处理机(主动)。
运行态—>阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生。
阻塞态—>就绪态:进程等待的事件到来时,由中断处理程序进行 状态的转换(被动)。
(一)进程的组织有三部分,如下表:
组成部分 | 定义 |
---|---|
进程控制块(PCB) | 是进程实体的一部分,进程存在的唯一标志,系统唯有通过进程的PCB才能感知到该进程的存在 |
程序段 | 是指能被进程调度程序调度到CPU执行的程序代码段 |
数据段 | 是指进程对应的程序加工处理的原始数据,也可以是程序执行产生的中间或最终结果 |
(二)进程控制
定义:在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,是一个不可分割的基本单位。
1、进程的创建:创建原语
2、进程的终止:正常结束、异常结束、外界干预,都是终止原语
3、进程的阻塞和唤醒:正在执行的进程,由于期待的某些事件未发生,便调用阻塞原语(Block),由运行态变为阻塞态;当被阻塞进程所期待的时间出现时,调用唤醒原语(Wakeup),将等待该事件的进程唤醒。
(三)进程的通信
定义:进程通信是指进程之间的信息交换。PV操作时低级通信方式;高级通信方式是指以较高的效率传输大量数据的通信方式,有三种:共享存储、消息传递、管道通信。
(1)线程的基本概念:引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的是减小程序在并发执行时所付出的空间开销,提高操作系统的并发性能。
------线程最直接理解是“轻量级进程”,是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。
线程和进程可以从 调度、并发性、拥有资源、独立性、系统开销、支持多处理机系统等方面比较
为什么线程有利于提高系统并发性?
线程切换时可能会发生进程切换,也可能不发生,平均来说每次切换的开销减小了,所以能让更多的线程参与并发,且不会影响到响应时间的问题。
(2)线程的状态和转化
各个线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时具有间断性。
状态 | 内容 |
---|---|
执行状态 | 线程已获得处理机而正在运行 |
就绪状态 | 线程已具备各种执行条件,只需再获得CPU便可立即执行 |
阻塞状态 | 线程在执行中因某事件受阻而处于暂停状态 |
(3)线程的组织和控制由 线程控制块(TCB)、线程的创建、线程的终止组成。
--------被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。
线程的实现方式分为两类:用户级线程和内核级线程(内核支持的线程)
(4)多线程模型
就是三种模型来说,多对多模型是最优解,为什么呢?
多对多模型,线程管理是在用户空间进行的,效率高;当一个线程被阻塞后允许调度另一个线程运行,并发能力强;集成了a和b模型的优点,且克服了多对一模型并发度不高的缺点和一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。
(1)调度的概念
概念:处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法选择一个进程将处理机分配给它运行,以实现进程并发执行。处理机调度是多道程序操作系统的基础。
高级调度(作业调度) | 外存 —> 内存,从外存上处于后备队列的作业中挑选一个(或多个),给它(们)分配内存、输入/输出设备等必要资源,建立相应的进程,使它(们)获得竞争处理机的权利。 |
中级调度(内存调度) | 目的是提高内存利用率和系统吞吐量,将那些暂时不能运行的进程调至外存等待,此时进程的状态称为 挂起态。 |
低级调度(进程调度) | 按照某种算法从就绪队列中选取一个进程,将处理机分配给它。 |
(2)调度的目标
调度算法要考虑评价标准,下面介绍其中主要几种:
CPU利用率 | CPU利用率 = CPU有效工作时间 /(CPU有效工作时间 + CPU空闲等待时间) |
系统吞吐量 | 表示单位时间内CPU完成作业的数量 |
周转时间 | 周转时间 = 作业完成时间 – 作业提交时间 |
带权周转时间 | 带权周转时间 = 作业周转时间 / 作业实际运行时间 |
等待时间 | 是指进程处于等处理机的时间之和,等待时间越长,用户满意度越低 |
响应时间 | 是指从用户提交请求到系统首次产生响应所用的时间 |
(3)调度的实现
调度程序(调度器)如下图所示:
不能进行程序的调度与切换的情况有:在处理中断的过程中、进程在操作系统内核临界区中、其他需要完全屏蔽中断的原子操作过程中
应进行进程调度与切换的情况如:发生引起调度条件且当前进程无法继续运行下去时、中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前
进程切换往往在调度完成后立刻发生,它要求保存原进程当前断电的现场信息,恢复被调度进程的现场信息。
进程又是通过什么方式进行调度的?下表为你解答:
非抢占调度方式(非剥夺方式) | 是指 即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行 |
抢占调度方式(剥夺方式) | 若有某个更为重要重要或紧迫的进程需要使用处理机,则允许调度程序根据某种原则去暂停正在执行的进程,将处理机分配给这个更为重要或紧迫的进程 |
两种线程的调度 | |
---|---|
用户级线程调度 | 用户级线程的线程切换在同一进程中进行,仅需少量的机器指令。 |
内核级线程调度 | 内核级线程的线程切换需要完整的上下文切换、修改内存映像、使高速缓存失效,这就导致了若干数量级的延迟。(该线程超过了被赋予的时间片,就会被强制挂起) |
任何进程都是在操作系统内核的支持下运行的,与内核紧密相关;进程切换同样是在内核的支持下实现的。
(1)上下文切换:只发生在内核态,切换CPU到另一个进程需要保存当前进程状态并恢复另一个进程的状态,实质是指处理机从一个进程的运行转到另一个进程上运行。(上下文 实质某时刻CPU寄存器和程序计数器的内容)
上下文切换通常是计算密集型的,对系统来说意味着消耗大量的CPU时间。
(2)模式切换:是指用户态和内核态之间的切换,CPU逻辑上还可能在执行同一进程。
同步:也称直接制约关系,源于它们之间的相互合作,是指为完成某种任务而建立的两个或多个进程,因为需要在某些位置上协调他们的工作次序而等待、传递消息所产生的制约关系。
互斥:也称间接制约关系,当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。
可以看这个作者:仔仔木,生动且形象
互斥锁:一个进程在进入临界区时应获得锁,在退出临界区时释放锁;获得和释放锁是原子操作,互斥锁通常采用硬件机制实现。
信号量:信号量机制可以解决互斥与同步的问题,只能被两个原语wait(S)和signal(S)访问,也可称作 “P操作” 和 “V操作”。
整型信号量:该机制并未遵循 “让权等待” 的准则,而是使进程处于 “盲等” 的状态。
记录型信号量:是一种不存在 “忙等”现象的进程同步机制,且遵循 “让权等待” 的准则。
管程
管程的特性保证了进程互斥,无须程序员实现互斥,降低死锁发生的可能性;提供条件变量可灵活实现进程同步。
管程把对共享资源的操作封装起来,管程内的共享数据结构只能被管程内的过程所访问,且每次仅允许一个进程进入管程,从而实现进程互斥。
管程由四部分组成:
条件变量
条件变量和信号量的比较:
相似点:条件变量的 wait / signal 操作类似于信号量的 P / V 操作,可以实现进程的阻塞/唤 醒。
不同点:条件变量是 “ 没有值 ”的,仅实现了 “排队等待” 功能:而信号量是 “有值” 的,信号量的值反映了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。
定义:计算机系统中有很多独占性资源,同一时刻每个资源只能由一个进程使用,所以操作系统具有授权一个进程单独访问资源的能力。两个进程独占性的访问某个资源,从而等待另外一个资源的执行结果,会导致两个进程都被阻塞,并且两个进程都不会释放各自的资源,这种情况就是 死锁(deadlock)。
死锁的预防只需要破坏死锁产生的四个必要条件之一即可:
死锁的避免 属于事先预防策略,在资源动态的分配过程中,计算此次分配的安全性,若不安全,则不进入;安全,则进入。可以参照银行家算法。
简化资源分配图可检测系统状态S 是否为死锁状态,如下图;
死锁如何解除呢?方法有如下三种:
死锁解除方法 | 步骤 |
---|---|
资源剥夺法 | 挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源而处于资源匮乏的状态 |
撤销进程法 | 强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按照进程优先级和撤销进程代价的高低进行 |
进程回退法 | 让一(或多)个进程回退到足以回避死锁的地步,进程回退时资源释放资源而非被剥夺。要求系统保持进程的历史信息,设置还原点 |
关于死锁更详细的解释请点击这里看我的另一篇文章很详细
(1)进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块( PCB )三部分组成的。而程序是一组有序的指令集合,是一种静态的概念。
(2)进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命周期,是暂时存在的:而程序则是组代码的集合,是永久存在的,可长期保存。
(3)一个进程可以执行一个或几个程序,一个程序也可构成多个进程。进程可创建进程,而程序不可能形成新的程序。
(4)进程与程序的组成不同。进程的组成包括程序、数据和 PCB
饥饿:
饥饿(starvation):当 等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿.饥饿到一定程度的进程所赋予的使命即使完成也不再具有实际意义时称该进程被饿死(starved to death).
没有时间上界的等待
排队等待
忙式等待
忙式等待条件下发生的饥饿,称为活锁(live lock).
饥饿 vs 死锁
死锁进程处于等待状态,忙式等待的进程并非处于等待状态, 但却可能被饿死;
死锁进程等待永远不会释放的资源, 饿死进程等待可能被释放,但却不会分给自己的资源,其等待时间没有上界;
死锁一定发生了循环等待,饿死不然;
死锁至少涉及两个进程 , 饿死进程可能只有一个.
///下面对两种状态进行比较式的解释,如下五点:
1、概念
死锁:如果一组进程中的每一个进程都在等待由该进程中的其它进程才能引发的事件,那么该组进程是死锁的。
饥饿:指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。
2、产生原因
死锁:源于多个程序对资源的争夺,不仅对不可抢占资源进行争夺时会引起死锁,而且对可消耗资源进行争夺时,也会引起死锁。
饥饿:如果一个线程因为处理器时间全部被其它线程抢走而得不到处理器运行时间,这种状态被称之为饥饿,一般是由高优先级线程吞噬所有的低优先级线程的处理器时间引起的。
3、必要条件
死锁:互斥、不可剥夺、请求与保持、循环等待
饥饿:没有其产生的必要条件,随机性很强。并且饥饿可以被消除,因此也将忙等待时发生的饥饿称为活锁。
4、异同点
相同:二者都是由于竞争资源而引起的
不同:
从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死。
死锁进程等待永远不会被释放资源,饿死进程等待会被释放但却不会分配给自己资源,表现为等待时限没有上界(排队等待或忙等待)。
死锁一定发生了循环等待,而饿死不一定。
死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
在饥饿的情形下,系统中至少有一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。
5、举例
死锁:砍树你需要一个斧子,但是斧子需要木头来做,这就发生了死锁。
饥饿:排队过程中,总有人插队到你的前面,导致你一直处于排队状态,这就发生了饥饿。
银行家算法的主要思想是避免系统进入不安全状态。在每次进行资源分配时,它首先检查系
统是否有足够的资源满足要求,若有则先进行试分配,并对分配后的新状态进行安全性检查。若新状态安全,则正式分配上述资源,否则拒绝分配上述资源。这样,它保证系统始终处于安全状态,从而避免了死锁现象的发生。
并发进程的执行会产生相互制约的关系:一种是进程之间竞争使用临界资源,只能让它们逐个使用,这种现象称为互斥,是一种竞争关系;另一种是进程之间协同完成任务,在关键点上等待另一个进程发来的消息,以便协同致,是一种协作关系。