CPU调度层次

  1. 高级调度:是作业调度。将外村的作业加载到内存里,分配对应的资源,然后加入就绪队列
  2. 低级调度:将就绪队列中的进程调度到CPU执行
  3. 中级调度:为了提高内存的利用率和系统的吞吐量,将暂时不能运行的进程调到外存等待。也称为挂起状态

调度算法的目标

  1. 资源利用率:CPU有效的工作时间/(CPU有效的工作时间+空闲等待时间)
  2. 公平:避免发生饥饿现象
  3. 平衡:有的程序中会出现网络IO,磁盘IO,或者是CPU计算密集型,运行的时候要让他们都忙起来,相对平衡。这也是为什么IO行进程要先被调度执行的原因。
  4. 强制策略执行:有些进程必须按照设定的优先级或者指定时间来执行。即使是对其他的进程造成延迟也要执行。

批处理系统的目标

  1. 平均周转时间短:周转时间是指从作业提交,到作业完成时间;
  2. 系统吞吐量:单位时间内,完成的作业数量
  3. 处理机利用率

分时系统目标

  1. 响应时间快:作业提交到开始收到响应的时间
  2. 均衡性:用户提交的作业执行的复杂度肯定都不一样,系统根据不同的复杂度,调度执行,最后得到的响应时间应该是复杂的任务时间长,简单的任务响应时间短。

实时系统目标

  1. 能保证截止时间:
  2. 可预测性:可以预测用时

作业调度算法

  1. 先来先服务:短作业的可能排到后面,不能及时响应
  2. 短作业优先:多数都是短作业的话,对长作业不利;计算作业的长短麻烦,并且不准确
  3. 按照优先级调度:
  4. 高响应比:(等待时间+要求服务时间)/要求服务时间 ; 等待时间+要求服务时间 = 响应时间 ;缺点还是计算执行时间对系统有较大开销

进程调度任务

  1. 保存cpu现场信息。如程序计数器、多个通用寄存器的内容等
  2. 按照某一种算法选取进程。从就绪队列里面选一个出来,修改进程的状态为运行态
  3. 把cpu分配给进程。讲PCB中的数据恢复到寄存器上,把执行权限交给进程

进程调度机制

  1. 排队器:将就绪进程排成一个或多个队列
  2. 分配器:将就绪队列中的进程选一个出来】
  3. 上下文切换:切换有两个操作
    1. 将当前进程的cpu寄存器上的数据保存到PCB中
    2. 把新的进程现场信息装入各个对应寄存器中

在上下文切换的时候需要执行大量的load 和story等操作指令,这些指令即使是在现代的计算机上,执行的耗时时间也可以上千调指令。因此现在大多数计算机,一般都采用用两组或多组寄存器,其中一组寄存器是内核态使用,一组是应用程序使用。这样在上下文切换的时候,只需要改变指针,让他指向当前寄存器组就可以了

进程调度算法

  1. 轮转调度算法:每个一段时间就产生一次中断,激活进程调度程序,完成进程调度;时间片大小不好确定。
  2. 优先级调度算法:

    a.抢占式和非抢占式;非抢占式就要等到进程任务执行完成;

    b.静态优先级:系统开销小,但是不够精准;可能会出现低优先级的任务得不到调用

    c.动态优先级:解决了饥饿问题;动态计算更精准
  3. 多级返回队列:优先级越高的队列,时间片越小;如果没有执行完,就加入下一个队列的队尾;如果入到抢占式进程进来,就要吧当前正在运行的进程放大它所在队列的队尾;

影响调度的因素:

进程PCB中,就绪时间,开始时间,截止时间,处理时间,资源要求,优先级对调度都是有影响的。

所以,在实际代码中,即使你设置了线程优先级等参数,实际调用还是操作系统说了算。

OS之《CPU调度》的更多相关文章

  1. 《Tsinghua os mooc》第17~20讲 同步互斥、信号量、管程、死锁

    第十七讲 同步互斥 进程并发执行 好处1:共享资源.比如:多个用户使用同一台计算机. 好处2:加速.I/O操作和CPU计算可以重叠(并行). 好处3:模块化. 将大程序分解成小程序.以编译为例,gcc ...

  2. OS之进程管理 --- 死锁

    什么是死锁 在正常操作模式下,进程按如下顺序来使用资源: 申请:进程请求资源 使用:进程对资源进行操作 释放:进程释放资源 当一组进程中的每一个进程度在等待一个事件,而这事件只能有一组进程的另一个进程 ...

  3. [OS] 死锁相关知识点以及银行家算法详解

    因此我们先来介绍一下死锁: 死锁特征 当出现死锁时,进程永远不能完成,并且系统资源被阻碍使用,阻止了其他作业开始执行.在讨论处理死锁问题的各种方法之前,先深入讨论一下死锁的特征. ·必要条件 (1)互 ...

  4. OS | 死锁

    死锁的四个条件 互斥 占用等待 非剥夺 循环等待 死锁的解决方案 死锁预防 间接预防:防止前三个条件中的任何一个的发生 直接预防:防止循环等待的发生 死锁避免 进程启动拒绝:不启动任何一个可能发生死锁 ...

  5. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  6. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  7. Oracle死锁

    当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 ...

  8. 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...

    出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...

  9. 查找原始MySQL死锁ID

    转载地址:http://yueliangdao0608.blog.51cto.com/397025/1180917 如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以 ...

  10. mysql 5.6 read-committed隔离级别下并发插入唯一索引导致死锁一例

    今天,某个环境又发生了死锁,如下: *** (1) TRANSACTION:TRANSACTION 735307073, ACTIVE 0 sec insertingmysql tables in u ...

随机推荐

  1. 手撸MQ消息队列——循环数组

    队列是咱们开发中经常使用到的一种数据结构,它与栈的结构类似.然而栈是后进先出,而队列是先进先出,说的专业一点就是FIFO.在生活中到处都可以找到队列的,最常见的就是排队,吃饭排队,上地铁排队,其他就不 ...

  2. Jmeter、postman、python 三大主流技术如何操作数据库?

    1.前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性:例如商品搜索功能 自动化测试或性能测试中,某 ...

  3. 以太坊Rollup方案之 arbitrum(2)

    上一期简单介绍了一下rollup的一些基本内容以及aritrun交易的执行流程,这一期将介绍一下aritrum的核心技术 -- 交互式单步证明 这一期主要涉及到的是arbitrum的验证节点 arbi ...

  4. 排查sshfs挂载失败的问题

    排查sshfs挂载失败的问题 写代码在Linux上运行,但是熟悉的IDE(比如VS code)在自己的电脑上,可以使用sshfs把linux上的目录挂载到本地,再用VScode打开即可,可以使用下面的 ...

  5. KubeSphere 社区双周报 | Fluent Operator 发布 v2.5.0 | 2023.09.01-09.14

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  6. 使用 KubeKey 在 AWS 高可用部署 Kubernetes

    作者:李耀宗 介绍 对于生产环境,我们需要考虑 Kubernetes 集群的高可用性.本文教您部署如何在多台 AWS EC2 实例快速部署一套高可用的生产环境.要满足 Kubernetes 集群服务需 ...

  7. 入门级别 Nginx 常用配置清单

    本文为转发文章,转发来自"https://mp.weixin.qq.com/s/ipUHaFPcDfIM9MsyqDGSEg",觉得不错分享给大家 Nginx 是一个高性能的 HT ...

  8. 蚂蚁图团队GraphRAG支持社区摘要——Token相比微软直降50%

    今年5月份,我们在DB-GPT v0.5.6版本发布了蚂蚁首个开源GraphRAG框架,支持了多种知识库索引底座,并在文章<Vector | Graph:蚂蚁首个开源GraphRAG框架设计解读 ...

  9. 根据字符串,获取实体属性上的annotation,如:createTime” 找到对应实体属性中的 TableField(value = "create_time", fill = FieldFill.INSERT)

    根据字符串,获取实体属性上的annotation,如:createTime" 找到对应实体属性中的 TableField(value = "create_time", f ...

  10. 一份阅读量30万+免费且全面的C#/.NET面试宝典

    前言 C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺.扩充知识面和大家共同学习进步.该知识库主要由自己平时学习实践总结.网上优秀文章资料收集(这一部分 ...