进程调度

进程调度是操作系统的核心功能之一,以下为你详细介绍:

进程调度的概念

进程调度是指操作系统按照一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。其主要目的是提高CPU利用率、增加系统吞吐量、减少进程等待时间和提高系统响应速度等。

进程调度的时机

  • 正在执行的进程执行完毕。
  • 执行中进程自己调用阻塞原语将自己阻塞起来进入睡眠等状态。
  • 执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了V原语操作激活了等待资源的进程队列。
  • 执行中进程提出I/O请求后被阻塞。
  • 在分时系统中时间片已经用完。
  • 在执行完系统调用等系统程序后返回用户进程时。
  • 就绪队列中的某进程的优先级变得高于当前执行进程的优先级(在可剥夺式调度中)。

进程调度算法

  • 先来先服务调度算法(FCFS):按进程进入就绪队列的先后顺序分配CPU,先进入的进程先执行。该算法简单,但不利于短进程,常用于批处理系统。
  • 短作业(进程)优先调度算法(SJF/SPF):对短作业或短进程优先调度。可降低平均周转时间,但对长进程不利,且需要事先知道进程的运行时间,实际中较难实现。
  • 优先级调度算法
    • 非抢占式优先权算法:系统把处理机分配给优先权最高的进程后,该进程一直执行直至完成或因事件放弃处理机。常用于批处理系统或对实时性要求不严的实时系统。
    • 抢占式优先权调度算法:当有更高优先权的进程进入就绪队列时,立即暂停当前进程,将处理机分配给新的高优先级进程。常用于严格的实时系统及对性能要求高的批处理和分时系统。
  • 高响应比优先调度算法:综合考虑进程的等待时间和服务时间,响应比 =(等待时间 + 服务时间)/服务时间。既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。
  • 轮转调度算法:将CPU的处理时间分成固定大小的时间片,就绪进程按FCFS原则排队,每个进程轮流获得一个时间片的处理机时间。如果进程在时间片内未完成任务,则排到就绪队列末尾等待下一次调度。时间片长度的选取很重要,会影响系统开销和响应时间。
  • 多级反馈队列调度算法:设置多个就绪队列,各队列优先级不同,优先级越高的队列时间片越小。新进程先进入第一队列,按FCFS原则排队等待调度,若在一个时间片内未完成,则转入下一级队列,如此下去,最后一级队列采用时间片轮转方式运行。该算法不必事先知道进程所需执行时间,能满足各种类型进程的需要。

进程调度的切换过程

  • 保存当前进程的上下文:包括程序计数器、寄存器的值、进程状态等信息,以便后续恢复进程执行。
  • 选择下一个要执行的进程:依据调度算法从就绪队列中挑选进程,如优先级调度选优先级最高的进程,时间片轮转则按顺序选择下一个进程。
  • 恢复选中进程的上下文:将选中进程的上下文信息从内存中读出,恢复到相应硬件部件中,使进程能从上次暂停处继续执行。
  • 更新进程控制块(PCB)信息:更新选中进程的PCB中进程状态等信息,同时更新其他进程的PCB信息,如将被换下进程的状态从运行态变为就绪态或阻塞态。

进程调度的方式

  • 非抢占式调度:进程获得CPU后一直运行,直到主动放弃CPU,如执行完毕、进入阻塞状态或主动调用系统调用让出CPU。实现简单,但可能导致系统响应时间长,其他就绪进程等待久。
  • 抢占式调度:系统可根据策略,如优先级、时间片等,强制暂停当前进程,将CPU分配给其他更需要的进程。能保证系统对紧急事件快速响应,提高实时性和公平性,但实现复杂,系统开销大。
#牛客创作赏金赛##离家近房租贵VS离家远但房租低,怎么选#
操作系统I 文章被收录于专栏

操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的核心程序,是用户与硬件之间的桥梁,也是计算机系统的核心组成部分。

全部评论

相关推荐

学而思网校25届春季校园招聘正式启动!在学而思网校你能获得什么?●人才培养强势赋能●内外训资源丰出●职业发展畅通多元●岗位多元化产品实习面经分享:学而思AIGC(来自牛客)面了大概四十分钟左右,八股问的很少,但是问的很深入,项目问的特别细致1.问项目的路由权限是如何做的,追问token过期了怎么处理,追问各个细节2.从发送请求到页面处理,有哪几个步骤3.路由权限守卫的细节,点击某一个页面如何触发,触发过程4.追问项目细节,给了几个实例、错误,问我怎么解决5.路由懒加载和图片懒加载怎么实现的,性能优化有哪些方法6.css中实现分栏布局,举出三种方法7.口述代码(给了页面布局的三种情况,怎么让他们对齐,清除浮动)8.绝对定位和相对定位的差别,实际应用9.浏览器存储机制10.网络攻击11.性能优化(口述代码)12.vue2,3的区别【内推投递通道】https://app.mokahr.com/m/campus-recruitment/tal/140048?recommendCode=DSp3z1d1&hash=%23%2Fjobs#/jobs【推荐码】DSp3z1d1(优先处理特权)建议大家尽早投递,锁定名额大家投递完后可以在评论区评论例如java已投,我看到会及时回复,后续有问题也可以直接联系我。 #春招#                                           #实习#                                           #暑期实习#               
点赞 评论 收藏
分享
模块化开发是一种软件开发的方法论,通过将软件系统划分为独立的模块,每个模块可以独立地设计、开发、测试和维护。这种开发方式可以提高代码的可重用性、可维护性和可扩展性,从而加快开发速度、降低开发成本。常见的模块化开发规范包括:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&uuid=07d53be4cd034a4ab270d500feebcc8d#牛客AI配图神器#CommonJS规范:CommonJS旨在解决JavaScript在服务端开发中的模块化问题,提出了使用require和module.exports等关键字进行模块定义和导出的规范。AMD规范:AMD(Asynchronous Module Definition)是一种在浏览器端异步加载模块的规范,它通过定义define函数来创建和导出模块,并通过require函数进行模块的异步加载。ES6模块化规范:ES6(ECMAScript 2015)是JavaScript的一个版本,其中引入了原生的模块化规范。ES6模块化规范使用import和export关键字来定义和导出模块,具有静态导入和导出的特性,可以在编译时进行静态分析。UMD规范:UMD(Universal Module Definition)是一种通用的模块化规范,它在支持CommonJS、AMD和全局变量等多种模块化环境下实现了兼容性。UMD规范可以使模块在不同的环境中都能正常运行。以上是常见的模块化开发规范,开发者可以根据具体项目的需求选择适合的规范进行模块化开发。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务