进程优先级、切换、调度

1. 进程优先级

当多个进程等待访问资源,需要排队,所以优先级可以确定访问资源的先后顺序。有优先级的原因就是资源狼多肉少。

在linux中优先级的本质也就是task_struct中一个整型字段(PRI),默认值是80,并且范围是[60,99],规则是数字越小优先级越高。

linux优先级允许被用户手动调整,但改变的不是PRI这个字段的值,这个是不允许改变的,改变的是task_struct中另一个整型字段(nice)。最后该进程的优先级通过这两个字段相加确定。注意nice的范围是[-20,19],刚好默认的PRI的值加上nice就得到了[60,99]的范围区间。

限制优先级范围的原因是规避进程饥饿问题

2. 进程的调度和切换

一些概念:

  1. 当一个进程在运行时,CPU不是必须要将这个进程的代码执行完,因为如果这样,遇到一个死循环代码,那么其他的进程就会崩溃。所以现在的操作系统都是基于时间片轮转执行的,当一个进程的时间片到了,CPU就会执行下一个进程。
  2. 进程的竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
  3. 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰,一个进程崩溃不会影响其他进程。
  4. 并行:多个进程在多个CUP下分别同时进行。
  5. 并发:多个进程在一个CUP中基于时间片的轮转执行,切换进程的方式,在一个时间段内,多个进程都得以推进。

切换:

当一个程序被CPU运行时,会产生大量的临时数据存放在CPU的寄存其中,当该进程的时间片到了之后,为了下次在运行的时候知道从哪开始运行和运行需要的数据,所以会将寄存器中的内容(也叫一个进程的硬件上下文)拷贝到task_struct中的一个区域,再第二次被调度运行时,又将里面的数据覆盖到CPU中的寄存器中来恢复上下文继续运行该程序。

调度:
我们先来看一下cup的运行队列
在这里插入图片描述
里面的queue[140],就是所需要维护的进程,其中0~99目前我们不关心,我们来看100-139,大家有没有发现个数刚好和优先级的个数[60,99]相等,没错,他们就是一一对应的,所以遍历这个数组就天然的先执行优先级高的进程。
在这里插入图片描述
为了提高遍历的效率就使用了int bitmap[5],一共32 * 5 = 160位,使用140位,刚好和队列对应,一位对应一个队列,1表示有,0表示没有。大大提高了效率。

这很简单的解决了优先级问题,但这种模式会容易造成进程饥饿,所以linux提供了两个这样的队列数组,一个叫活跃队列,一个叫过期队列。有一个指针指向活跃队列,一个指针指向过期队列。活跃队列就是CUP正在执行的进程,当该进程时间片到了就会按照优先级进入到过期队列等待第二次调度,在活跃队列执行的过程中,如果有新的进程加入,也是会按优先级进入过期队列。当活跃队列中没有了进程,我们只需要交换指针,原来的活跃队列就变成了过期队列,过期队列就变成了活跃队列,如此往返,效率仅仅为O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/458143.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏

蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…

spring cloud stream

背景 主要解决不同消息中间件切换问题。实现不同中间件的代码解耦。 链接: 支持的中间件 后文使用kafka测试。 引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream</artifactId></depende…

如何实现Vuex本地存储

在前端开发中&#xff0c;Vuex是一款非常强大的状态管理工具&#xff0c;但是默认情况下&#xff0c;Vuex的数据是存储在内存中的&#xff0c;刷新页面后数据将会丢失。这往往会导致用户在刷新页面后需要重新登录等繁琐的操作。本篇文章将教会您如何实现Vuex的本地存储&#xf…

华为配置访客接入WLAN网络示例(MAC优先的Portal认证)

配置访客接入WLAN网络示例&#xff08;MAC优先的Portal认证&#xff09; 组网图形 图1 配置WLAN MAC优先的Portal认证示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 某企业为了提高WLAN网络的安全性&#xff0c;采用MAC优先的外置Portal认…

利用k8s Infra 容器,解决pod网络故障注入的问题

目录 一、infra容器作用 二、pod网络故障注入问题 三、充分利用pod infra容器 一、infra容器的作用 我们知道&#xff0c;在kubernetes中&#xff0c;pod中容器的资源隔离主要通过namespace和cgroup来实现。那如果我们需要为pod中的容器共享某种资源应该怎么做。kubernetes …

uniapp小程序端使用计算属性动态绑定style样式踩坑

踩坑点: 使用uniapp编译小程序端动态绑定复杂style使用计算属性方式&#xff0c;return必须返回json字符串格式&#xff0c;不能返回object&#xff0c;否则会不起作用。 代码总览 视图层 逻辑层&#xff08;注意这里是使用的计算属性哈&#xff09; 这里我封装成了一个个性化…

Win32 SDK Gui编程系列之--弹出式菜单

1.弹出式菜单 例如,在命令提示窗口中点击鼠标右键,会出现如下图所示的弹出菜单(下拉菜单)。 这种弹出式菜单的实现很简单。不创建菜单栏,用CreatePopupMenu函数创建的菜单是最顶端的菜单就可以了。 菜单的显示使用TrackPopupMenu函数进行。 例如,点击鼠标右键显示弹出…

12.0 Zookeeper 数据同步流程

在 Zookeeper 中&#xff0c;主要依赖 ZAB 协议来实现分布式数据一致性。 ZAB 协议分为两部分&#xff1a; 消息广播崩溃恢复 消息广播 Zookeeper 使用单一的主进程 Leader 来接收和处理客户端所有事务请求&#xff0c;并采用 ZAB 协议的原子广播协议&#xff0c;将事务请求…

第2章 路由

学习目标 掌握注册路由的方式&#xff0c;能够独立完成路由的注册 掌握URL传递参数的方式&#xff0c;能够通过URL规则向视图函数传递参数 掌握转换器用法&#xff0c;能够根据业务需求灵活应用内置转换器或自定义转换器 掌握指定请求方式&#xff0c;能够在注册路由时指定请…

字节跳动官方出品AI,白嫖使用GPT4!

关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区头部专家博主&#xff0c;编程严选网创始人。具有丰富的引领团队经验&#xff0c;深厚业务架…

AnimateDiffusion文字生成图片--入门

AnimateDiffusion文字生成图片--入门 1. 安装2. 插件2.1 汉化插件2.2 中文提示词插件2.3 模型下载插件2.4 模型下载2.5 c站helper插件2.6 c站秘钥 3. 模型4. 总结 gitio: https://a18792721831.github.io/ 下面基本上所有的操作都需要访问外网&#xff0c;请自行解决外网。 1. …

ROS笔记一:工作空间和功能包

目录 工作空间 如何创建工作空间&#xff1a; 编译工作空间 设置环境变量 功能包 创建功能包 CMakeLists.txt package.xml 工作空间 ROS的工作空间是用来存放工程文件代码的文件夹 ROS的开发依赖于工作空间&#xff0c;包括编写代码、编译等都是在工作空间下进行的 工作空…