前言:
现在大家对“先进先出作业调度算法”大概比较讲究,你们都需要剖析一些“先进先出作业调度算法”的相关知识。那么小编在网络上搜集了一些关于“先进先出作业调度算法””的相关内容,希望各位老铁们能喜欢,各位老铁们一起来学习一下吧!进程什么是进程
我们编写的程序都是静态文件,经过编译之后产生可执行文件,当我们运行可执行文件后,则会被装载到内存中,然后CPU会执行程序中的指令,那么这个运行中的程序就是进程,进程是执行程序的动态过程。 简单来说就是 进程是系统中运行的应用程序,进程是资源分配的最小单位,进程包含了以下几个特征:
动态性:简单来说 进程是执行程序的动态过程,而程序是进程运行的静态文件。并发性:多个进程实体同存于内存中,能在一段时间内并发运行,引入进程的目的也是为了使程序的执行和其他程序的执行并发执行。独立性:进程实体是一个能够独立运行的基本单位,也是系统中独立获得资源和独立调度的基本单位。异步性:进程按各自独立的、不可预知的速度向前推进,或者说按照异步方式进行推进。结构特征:从结构上来看,进程实体由程序段、数据段及进程控制块三部分组成。进程状态
系统中的进程并发运行,并且需要竞争锁资源相互依赖、相互制约所以进程在执行过程中会出现运行--暂停--运行的间断性, 例如:张三正在撸代码,这个时候类了想削个苹果吃,只能暂停撸代码,去削苹果。
上面描述了进程有运行-暂停-运行的间断性,说明进程是有状态变化的,那接下来跟着二胖看看进程都有哪些状态吧。 进程有三种基本状态:就绪状态、执行状态、阻塞状态
除了上图的三种基本状态,还有创建状态 和 结束状态,另外还有一种挂起状态,用户可以主动挂起,也可能是操作系统因为某些原因挂起线程,引起线程挂起的原因有以下几种:
用户请求:用户在程序运行期间发现了可疑问题,想暂停进程;如果线程处于就绪状态则暂不接受调度父进程请求:父进程希望考察、修改子进程或者当要协调各子进程间的活动时要挂起子进程操作系统操作:检查运行中资源的使用情况及进行记账,以便改善系统运行的性能缓解内存紧张:为了缓解内存紧张的情况,将内存中处于阻塞状态的进程换至外存上负荷调节:当系统中的负荷较重时 系统过会把一些不重要或不紧迫的进程挂起,保证系统仍然能正常运行
挂起状态分为了两种:就绪挂起状态 和 阻塞挂起状态,它们的区别是 就绪挂起状态的线程还在内存中,而阻塞挂起状态的线程则是在外存中。
下图是各个状态之间的流转图:
下面详细描述一下各个状态转换的信息
创建-->就绪状态:新创建的进程已经分配了除了CPU以外所有必要的资源后,当前线程就处于就绪状态就绪状态-->执行状态:进程调度为处于就绪状态的进程分配了CPU之后,该进程就由就绪状态变为执行状态执行状态-->就绪状态:在分时系统中,正在执行的进程时间片用完被暂停执行,或者抢占式调度方式中,进来的线程优先级比正在执行线程的优先级高;以上请求会把正在执行线程状态改为就绪状态执行状态-->阻塞状态:正在执行的进程因出现某种事件而阻塞,例如:I/O事件阻塞状态-->就绪状态:等待事件已经发生并且完成,例如I/O事件请求完成,进程有阻塞状态变为就绪状态进程控制块
进程控制块(process control block, PCB) 是进程实体的一部分,是操作系统中最重要的数据结构,描述进程情况及控制进程运行所需的全部信息 那PCB中都存储了哪些信息呢?
进程标识信息进程标识符:标识各个进程,每个进程都有一个并且唯一的标识符用户标识符:提供用户进程访问CPU相关信息当CPU中断/线程切换时,CPU中各个寄存器的信息会保留到对应线程的PCB中,以便线程恢复执行时重新执行。进程调度信息进程当前状态、优先级、调度所需的其他信息、阻塞原因。进程控制信息程序和数据的地址、进程同步和通信机制、资源清单、链接指针。
系统中通常可拥有很多进程控制块PCB,为了进行有效管理则需要将它们组织起来,那是怎么组织的呢?
链表方式:把具有相同状态的PCB链接成一个队列,这样就形成了 就绪队列、阻塞队列等索引方式:系统根据所有进程的状态建立索引表:就绪索引表、阻塞索引表等,索引项再指向对应的PCB
进程控制
进程控制一般有操作系统内核实现,目的是为了防止用户破坏操作系统以及类试PCB等关键数据,主要控制创建和撤销进程以及实现进程状态的转换。
进程创建操作系统允许一个进程创建若干个新进程,新进程又可以创建新进程 最终会行程树形的进程图。 子进程可以继承父进程所拥有的所有资源,当子进程撤销时,应将从父进程那里获得的资源归还给父进程,父进程撤销时,则需要撤销所有子进程。进程创建过程如下:申请空白PCB,为新进程分配唯一的标识符,如果PCB申请失败则创建失败为进程分配资源,给进程的程序和数据、用户栈分配内存空间初始化PCB如果进程就绪队列能够容纳新进程,则新创建的进程插入到就绪队列进程终止引起进程终止的事件包括了正常结束、异常结束、外界干预。进程终止过程如下:根据被终止线程标识符查找该进程的PCB,读取该进程状态如果是执行状态则立即终止进程执行,选择一个新进程,把CPU分配给它如果有子孙进程,则将所有子孙进程终止将该进程所有用的资源归还给父进程或系统把被终止进程的PCB从所在队列中移出进程阻塞正在执行的进程当出现某个阻塞事件时,由于无法继续执行,于是进程便通过调用阻塞原语block()把自己阻塞,进程的阻塞是进程自身的一种主动行为。阻塞过程如下:根据线程标识符查找该进程的PCB,读取该进程状态如果该进程处于运行状态,则停止执行,并把PCB中的状态由执行改为阻塞插入阻塞队列进程唤醒唤醒和阻塞是一对作用相反的动作,自己不可能唤醒自己的,所以阻塞进程必须有其他进程调用唤醒原语来唤醒阻塞进程。唤醒过程如下:根据线程标识符查找该进程的PCB把阻塞进程从等待事件阻塞队列中移出,将PCB中状态由阻塞改为就绪插入到就绪队列中进程调度
进程调度就是CPU调度,大部分操作系统都是多任务的,进程数量往往多余CPU数,进程之间则存在了竞争CPU资源,系统按照某种算法把CPU动态分配给某一就绪进程。所以CPU的利用率很大程度上取决于进程调度性能的好坏。 进程调度的主要功能就是选择占有CPU的进程、进行进程上下文的切换,进程上下文切换则是将正在执行进程的上下文保存在该进程的PCB中,以便以后该进程恢复执行。将刚选中进程的运行现场恢复起来,并将处理机的控制权交给被选中进程,使其执行。
程序从提交到完成经历了哪些调度呢?高级调度:作业调度,决定哪些后备状态的作业调入到主机内存,准备执行低级调度:进程调度,决定给就绪队列中哪个进程将获得CPU,并执行将CPU分配给该进程的操作中级调度:把进程调入到外存,或者把进程调入到内存
进程调度都有哪些方式呢非剥夺式分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件(如提出I/O请求)而阻塞时才把处理机分配给另一进程。剥夺式当一个进程正在运行时,系统可以基于某种原则剥夺已分配给它的CPU,将之分配给其他进程。那系统剥夺的原则有哪些呢?优先权原则:优先权高的进程可以剥夺优先权低的进程而运行短进程优先原则:短进程到达后可以剥夺长进程的运行时间片原则:一个时间片用完后更新调度调度算法有哪些呢
进程调度采用什么算法与整个系统的设计目的是一致的,不同的系统有不同的设计目标,所以采用的调度算法也不尽相同。主要考虑的是系统吞吐量、系统资源利用率、用户能容忍响应时间
1.先进先出算法
先进先出算法(FIFO)是把CPU分配给最先进入就绪队列的进程,进入就绪队列的先后顺序依次排队。分配到CPU的进程会一直执行下去,直到该进程完成或发生某事件而阻塞。
FIFO算法比较容易实现,表面上也公平,但是服务质量不佳,容易引起短进程不满,一般作为辅助调
度算法
2.最短作业优先调度算法 从就绪队列中选择下一个CPU执行期最短的进程,为之分配CPU并执行。
虽然最短执行时间可获得较好的调度性能,但是依赖的下一个CPU执行时间比较难以准确知道,只能根据每一个进程的执行历史来预测。并且对长作业的执行也不太友好。
3.最高响应比优先调度算法
最高响应比优先级调度算法是一个非剥夺的调度算法 ,响应比高的优先执行,按照此算法每个进程都有一个响应比。该算法兼顾到了短任务和长任务, 短任务要求服务时间短,所以相对来说对短进程有利。 长任务等到时间较长 也会提高对应的响应比也是有机会得到CPU进行执行的。 公式如下:
4.优先级调度算法
优先级调度算法是一种比较常见的调度算法,进程调度时,会将CPU分配给就绪队列中优先级最高的进程,有两种方法确定优先级:
静态优先级算法:在进程创建时确定,创建之后不能修改,一般根据进程的类型、进程对资源的需求、用户申请的优先级来确定进程优先级。动态优先级算法:进程创建时先确定一个优先级,随着执行时间的变化,优先级不断的动态调整。动态计算系统有一定的开销,通常根据占有CPU的长短和等待CPU的长短动态调整。
5.时间片轮转调度算法
轮转调度算法则是最古老、最简单、最公平并且使用最广的算法。每个进程被分配一个时间段也被成为时间片。 如果时间片用完,进程还在运行,那么将会把此进程从 CPU 释放出来,并把 CPU 分配另外一个进程。如果该进程时间片结束之前阻塞或结束,则CPU立即进行切换。
时间片设置太短会导致过多的进程切换,降低了CPU效率;设得太长又可能引起对短的交互请求的响应时间变长,将时间片设为20-50ms通常是一个比较合理的这种方案
6.多级反馈队列轮转算法
多级反馈队列轮转算法是综合考虑了轮转算法和优先级调度算法,通常设置多个队列,每个队列优先级从高到底,系统总是最先调度优先级最高的队列,仅该队列为空时才调度次高优先级队列,依次类推,只要较高优先级队列有进程进入,立即转到进程调度,及时调度较高优先级队列进程。进程在其生命周期中可能在多个队列中存在。通常刚创建的进程和因请求I/O未用完时间片的进程排在最高优先级队列,在队列中运行2~3时间片未完成的进程排入下一个较低优先级队列。多级队列反馈算法能较好地满足各类进程的用户要求,既能使分时用户进程得到满意的响应,又能使批处理用户的进程获得较合理的周转时间。调度过程如下图:
什么时候进行调度呢?当前执行的进程运行完毕之后 则会触发进程调度执行进程调用阻塞原语将自己阻塞CPU时间片用完了在抢占式优先级调度时 高优先级的进程进入就绪队列线程线程是什么?
线程是进程的一个实体,是被独立调度和分派的基本单位,同一个进程中的多个线程共享除了程序计数器、一组寄存器和栈之外的所有资源。
为什么引入线程
已经有进程了,为什么还需要线程呢?
进程是一个资源拥有者,在进程创建、撤销和切换中,系统需要付出较大的时空开销。所以系统中所设置的进程数目不宜过多,进程切换的频率也宜过高。 为了使多个程序更好的并发执行,同时又尽量减少系统的开销所以考虑是否可以把 将进程的两个属性(拥有资源独立单位、可以独立调度和分派)分开处理即对作为调度和分派的基本单位 不同时作为独立分配资源的单位以便能轻装运行,对拥有资源的基本单位又不频繁地对之进行切换,在这种思想下产生了线程的概念。
线程的优点创建新线程话费时间少,不需要另行分配资源,创建速度比创建进程的速度快,且系统开销也少线程之间切换花费时间少同一个进程内的线程共享内存和文件,线程之间通信无序调用内核,不需要额外的通信机制,通信更简便、快速线程模型
因为我们有两种类型的线程用户线程和内核线程为了让这些线程一起工作,它们之间存在一种关系,这种关系是通过使用多线程模型建立的。建立这种关系有三种常见的方法。多对一模型、一对一模型、一对多模型
多对一模型
多对一模型就是 多个用户线程对应一个内核线程 优点:多个用户线程与一个内核线程关联或映射。线程管理是在用户级别完成的,因此效率更高 缺点:
如果一个用户线程阻塞了,则内核线程对应的其他线程也会被阻塞由于一次只能有一个线程访问内核线程,因此多个线程无法在多处理器系统中并行运行。即使我们有多个处理器,一个内核线程也只能在一个处理器上运行。因此,用户线程也将仅在映射的内核线程正在运行的处理器中运行。一对一模型
一对一模型:一个用户线程对应一个内核线程 优点: 解决了多对一模型的两个缺点,当一个线程阻塞,不会影响其他线程 缺点:创建一个用户线程则需要创建一个内核线程,系统开销增大可能会影响程序的性能
多对多模型
多对多模型:用户线程和内核线程是多对多的关系 优点:
每当用户线程进行阻塞系统调用时,其他线程都不会被阻塞。根据需要可以有任意多个用户线程。此外,线程可以在多个处理器上并行运行。我们不需要创建与用户线程一样多的内核线程。因此,由于创建内核线程而导致的任何额外开销都没有问题。此处支持的内核线程数特定于应用程序或计算机。线程实现
线程主要的实现方式有用户空间实现、内核空间实现。
用户空间实现
用户线程是由用户实现,内核级线程对用户级线程一无所知。内核级线程就像管理单线程进程一样管理用户级线程 结构图如下:
用户线程的优点:
线程的调度不需要内核直接参与,控制简单。可以在不支持线程的操作系统中实现。创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。允许每个进程定制自己的调度算法,线程管理比较灵活。线程能够利用的表空间和堆栈空间比内核级线程多。同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题
用户线程的缺点:
资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用内核空间实现
内核线程是由操作系统管理的,线程的创建、终止和管理都是由操作系统负责。
内核线程优点:
当有多个处理机时,一个进程的多个线程可以同时执行。在一个进程当中,如果某个内核线程发起系统调用而被阻塞,并不会影响其他内核线程的运行;
内核线程的缺点:
由内核进行调度线程的创建、终止和切换都是通过系统调用的方式来进行,因此对于系统来说,系统开销比较大;
标签: #先进先出作业调度算法