(Linux2.6内核)进程调度队列与切换

 

个人主页:Lei宝啊 

愿所有美好如期而遇


我们首先来了解几个概念

1. 进程在CPU上运行的时候,一定要运行完才行吗?答案是否定的,我们大部分的操作系统,主流就是分时操作系统,即基于时间片进程轮转执行的。

时间片是什么呢? 

就是进程有一个执行时间,这个时间到了就算没执行完,也不会继续执行,而是会执行下一个进程,每个进程都有自己的时间片,时间片到了就下一个进程。

2. 竞争性:系统进程很多,但是CPU只有少数,我们大部分人用的只有一个,为了更高效完成任务,需要合理竞争相关资源,于是就有了优先级。

  独立性:进程相互之间是独立的,多进程同时运行相互之间不会影响。

     并行:多个进程在多个CPU下分别,同时运行。

     并发:多个进程在一个CPU下通过进程切换的方式,在一段时间内,让多个进程同时推进,称之为并发。

进程的切换

        我们要先知道CPU里有很多的寄存器,这些寄存器用来计算进程的代码和数据,寄存器也可以存储数据,eip这个寄存器存储将要执行的下一行代码的地址,CPU执行到哪一行,那行的代码和数据就会输入寄存器,寄存器计算后会返回一个结果,同时在寄存器内产生大量临时数据,这个临时数据我们叫做进程的硬件上下文。

        在一个进程时间片结束时,会将CPU寄存器中的临时数据保存在task_struct中,下一次执行时,将数据覆盖在寄存器上,继续上一次的执行,如果是首次执行的寄存器,会从头开始执行,每个进程的数据都是私有的,寄存器中上一个进程留下的临时数据不会被下一个进程读取,下一个进程会将自己的数据在寄存器上进行覆盖。

所有的保存是为了最终数据的恢复,所有的恢复都是为了继续上次的运行。

进程的调度

我们说,一个程序本质就是二进制文件,是文件就保存在磁盘中,而想要运行这个程序,就要先将其加载到内存中,而加载到内存中,就要被操作系统所管理,于是操作系统建立了他的PCB,也就是task_struct,然后将程序加载到内存中,描述了这个程序之后,将其连入数据结构中进管理,于是这个可执行程序的代码和数据+内核数据结构就构成了进程,而进程要想被CPU运行,就要先进入CPU的运行队列进行排队,而排队的进程也有优先级,Linux实现进程调度的算法,既要考虑优先级,还要考虑饥饿问题,以及效率。

上图就是Linux2.6内核中进程队列的数据结构。

首先,queue[140]这个数组中的每个元素都是task_struct*类型,也就是指向进程的进程控制块,这个数组我们只会用到下标100~139,40个下标对应了我们40个优先级,下标越靠前,优先级越高。

CPU在执行进程时,就会去遍历这个数组,如果不为NULL,就说明这个优先级有队列,就会开始执行这个队列的进程,这个队列的进程执行完或者时间片结束,就会离开这个队列,于是活跃队列中的进程越来越少,直到全部为NULL。

我们定义一个 struct q这样的结构体,再用这样一个结构体定义一个数组,我们的active以及expired都是struct q*类型,分别指向这个数组的元素,active指向的活跃队列,expire指向过期队列,CPU执行活跃队列里的进程时,当有优先级高的进程就绪时,不会进入活跃队列,而是进入过期队列中对应下标中,当活跃队列中的进程时间片结束,但是没有执行完,也会按照优先级进入过期队列相应的下标中,当活跃队列全部为空时,执行swap(&active,&expired),交换指针,过期队列也就变成了活跃队列,活跃队列变成过期队列,CPU不会直接去访问这个数组中的结构体,而是通过这两个指针去访问队列。

再一个,CPU不会去遍历queue,而是通过其他算法,也就是通过我们的bitmap数组,32*5共160个字节,我们使用其中140个bit位,对应queue中的每个下标,如果下标为空,那么对应在bitmap中的那个bit位就是0,不为空就是1,因为bitmap有5个字节,我们会通看这个数组的每一个元素是否为0,为0,直接下一个元素,省去了遍历32个位,不为0,我们就通过位运算去取到bit位为1的位置,然后CPU去执行!这样就再次提高了效率,Linux进程调度的算法以及其结构非常优秀!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初次尝试http OAuth2验证的请求

第一次对接OAuth2验证的接口, 莫不着门道,后面获取token成功后,发现其实不难, 用postman举例: 其实挺简单。用客户端id秘钥 获取token---》后面的请求带上token 1,在head中增加 Authorization头 内容格式如上图&…

JAVA文件IO, File类, 字符流,字节流

文章目录 文件IO1. File2. IO流2.1 字符流2.1.1 Reader2.1.2 Writer 2.2 字节流2.2.1 InputStream2.2.2 FileInputStream2.2.3 利用Scanner进行字符读取2.2.4 OutputStream 文件IO I: Input, 从硬盘往内存读数据 O: Output, 从内存往硬盘输出数据 1. File Java 中通过 java…

服务器如何做好入侵防护

不管是企业还是个人,网上业务都需要依赖于服务器,服务器一旦被黑客入侵,企业会面临很多安全风险,比如业务被中断、数据被窃取、被加密勒索、服务器不稳定等影响。入侵防护,主机安全也是目前网络安全防护的一个重点。关…

通义千问 Qwen-7B-Chat-Int4 模型本地化部署

如需在本地或离线环境下运行本项目,需要首先将项目所需的模型下载至本地,通常开源 LLM 与 Embedding 模型可以从 HuggingFace 下载。 以本项目中默认使用的 LLM 模型 THUDM/ChatGLM2-6B 与 Embedding 模型 moka-ai/m3e-base 为例: 下载模型…

基于YOLO模型建筑工地个人防护设备目标检测

使用安全装备可以保护他们免受建筑工地的意外事故。据统计,每年有数以万计的工人在建筑工地受到严重伤害,造成终生困难。然而,通过自我监控来确保工人穿戴个人防护装备非常重要。在这方面,需要一个准确和快速的系统来检测工人是否…

怎么在电脑上做工作计划?

对于职场人士来说,想要提高工作效率,提前做好工作计划是非常有必要的。我们可以将所有的任务和工作计划都记录下来,并通过设定提醒时间来提醒自己,可以帮助我们更有效地管理时间,从而不会错过重要的工作和任务。 而在…

视觉测量基础

1. 相机模型 1.1 坐标系转换原理 世界坐标系(world Coords):点在真实世界中的位置,描述相机位置。 相机坐标系(Cameras Coords):以相机光学系统中心(镜头中心)为原点,建立相机坐标系。 图像物理坐标系(Film Coords):经过小孔成…

【Python 训练营】N_12 打印菱形图案

题目 打印菱形图案 分析 先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。 答案 # 方法一 for i in range(4):block **(2*i1)print({:^7}.format(block))…

前端面试灵魂提问

1.自我介绍 2.在实习中,你负责那一模块 3.any与unknow的异同 相同点:any和unkonwn 可以接受任何值 不同点:any会丢掉类型限制,可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查,所以在使用一个…

【扫雷】C语言实现扫雷小游戏

扫雷 游戏资源介绍游戏功能介绍游戏代码编写教程游戏功能测试自动排雷测试地雷标记测试取消标记测试踩雷判定测试重复游戏测试胜利判定测试 头文件游戏主体文件用户主体文件 游戏资源介绍 本次对之前的扫雷游戏进行了重新编写与更新,在此次的游戏实现中新增加了剩余…

uniapp中uni.navigateBack返回后刷新页面数据

文章目录 一、前言1.1、[uni.navigateBack](https://uniapp.dcloud.net.cn/api/router.html#navigateback) 二、方法2.1、父页面设置钩子函数onBackPress2.2、uni.$emit和uni.$on监听通知数据变更2.2.1、子页面2.2.2、父页面 2.3、onShow钩子函数处理数据2.3.1、子页面2.3.2、父…

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一: 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…

集合框架(二)LinkedList的常见使用

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍LinkedList的常见使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 目…

vue3+ts 实现时间间隔选择器

需求背景解决效果视频效果balancedTimeElement.vue 需求背景 实现一个分片的时间间隔选择器,需要把显示时间段显示成图表,涉及一下集中数据转换 [“02:30-05:30”,“07:30-10:30”,“14:30-17:30”]‘[(2,5),(7,10),(14,17)]’[4, 5, 6, 7, 8, 9, 10, …

Windows10系统卸载服务和删除服务

记录一下Windows10系统卸载服务和删除服务 最近在使用自己win电脑的时候 发现服务里存在很久之前就没有使用的应用,对应的文件夹也都已经删除了,但是在win服务里一直存在,不知道会不会影响性能,看着吧还是强迫自己删掉好一些&…

安防视频监控/视频融合/云存储EasyCVR页面数据显示不全该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

linux文件管理命令_切换创建复制移动删除查看修改

1.3 文件管理命令 1.3.1 cd:切换目录(change directory) cd 绝对路径/相对路径 # 根目录 [rootlocalhost ~]# cd / # 家目录 [rootlocalhost /]# cd [rootlocalhost /]# cd ~ # 父级目录 [rootlocalhost /]# cd .. # 返回上一次目录 [roo…

C++中的模板

模板概论 c提供了函数模板 (function template.) 所谓函数模板,实际上是建立一个通用函 数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数 就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不…

人工智能_AI服务器安装清华开源_CHATGLM大语言模型_GLM-6B安装部署_人工智能工作笔记0092

看到的这个开源的大模型,很牛,~关键让我们自己也可以部署体验一把了,虽然不知道具体内部怎么构造的但是,也可以自己使用也挺好. 可以部署在自己的机器上也可以部署在云服务器上. 安装以后,是可以使用python代码进行提问,然后返回结果的,这样就可以实现我们自己的chat应用了, …

TiDB 在咪咕云原生场景下的实践

导读 咪咕是中国移动旗下的视频科技公司,门户系统是其核心业务之一。 为满足用户的多样化需求,咪咕计划对其数据库进行升级。 经过对中国主流国产数据库的测试评估后,咪咕选择了 TiDB,并成功将其落地于门户系统云化项目。 TiDB 为…
最新文章