(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.mzph.cn/news/177148.shtml

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

相关文章

Nginx Openresty通过Lua+Redis 实现动态封禁IP

需求 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单。对于黑名单中的 IP ,我们将拒绝提供服务。并且可以设置封禁失效时间 环境准备 linux version: centos7 / ubuntu 等 redis version: 5.0.5 nginx version: nginx…

智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于正余弦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.正余弦算法4.实验参数设定5.算法结果6.参考文献7.…

学习知识回顾随笔

文章目录 如何远程连接MySQL数据库1.创建用户来运行,此用户从任何主机连接到mysql数据库2.使用IP地址来访问MySQL数据库 如何远程访问Django项目Web应用什么是Web应用应用程序的两种模式Web应用程序的优缺点 HTTP协议(超文本传输协议)简介HTT…

FLASK博客系列4——再谈路由

最近好像拖更有点久了。抱歉抱歉~ 今天我们继续来聊聊路由(其实就是我上次偷懒剩下一点没讲完)。 通过上次的文章,我们基本了解了Flask中的路由,是不是比较简单呢?别急,今天来点猛料。 一、路由之HTTP方法绑…

C++之STL库:string类(用法列举和总结)

前言 大家在学习STL库的时候一定要学会看英文文档&#xff0c;俗话说熟能生巧&#xff0c;所以还得多练&#xff01; 在使用string类之前&#xff0c;要包含头文件#include <string>和using namespace std; 文档链接&#xff1a;string - C Reference 一、string——构造…

Springboot日志-logback

logback-spring.xml的配置项 共有一个父标签、两种属性、三个节点: 一个父标签&#xff1a;configuration 两种属性&#xff1a;contextName和property 三个节点&#xff1a;appender、root、logger 日志级别 日志级别从低到高分为TRACE < DEBUG < INFO < WARN &…

filebeat日志收集工具

elk:filebeat日志收集工具和logstash相同 filebeat是一个轻量级的日志收集工具&#xff0c;所使用的系统资源比logstash部署和启动时使用的资源要小得多 filebeat可以运行在非Java环境&#xff0c;它可以代理logstash在非Java环境上收集日志 filebeat无法实现数据的过滤&…

Programming Abstractions in C阅读笔记:p197-p201

《Programming Abstractions in C》学习第64天&#xff0c;p196-p201总结。 一、技术总结 很难&#xff0c;唯有继续往下看才能让其变容易。 二、英语总结 1.psychologically是什么意思&#xff1f; 答&#xff1a; (1))psychology > psychological > psychologica…

名词解释之EID和SR

大家在聊辅助驾驶时&#xff0c;经常会发现有名词叫SR&#xff0c;或者EID&#xff0c;理想的环境感知界面叫EID&#xff0c;而其他很多车型里大家管那个界面叫SR。我们下面具体看下这两个词具体指什么。 SR是“Situational Awareness”的缩写,意思是环境感知或场景认知。 SR系…

【JMeter】配置元件

1. 元件的分类 HTTP Request Default 作用&#xff1a; 可以配置成通用的信息&#xff0c;可复用 ​​​​​​​ JDBC Connection Configuration 作用&#xff1a;连接数据库 前提&#xff1a; 下载好对应数据类型的jar包 ​​​​​​​ HTTP Header Manager信息头管理…

微信小程序推送服务号消息(一)【Go+微信小程序+微信服务号+微信开放平台】

一、需求场景 业务需要给微信小程序用户在某些场景推送微信服务号消息&#xff0c;例如&#xff1a;订单即将超时&#xff0c;电子合同签约超时等&#xff1b; 二、开发准备 1、开通微信服务号 入口&#xff1a;微信公众平台 1.1 在服务号中获取推送消息所需的配置信息&#…

免费部署开源大模型 ChatGLM-6B

参考&#xff1a;【大模型-第一篇】在阿里云上部署ChatGLM3-CSDN博客 ChatGLM 是一个开源的、支持中英双语的对话语言模型&#xff0c;由智谱 AI 和清华大学 KEG 实验室联合发布&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。ChatGLM3-6B 更…

基于JavaWeb+SSM+Vue校园综合服务小程序系统的设计和实现

基于JavaWebSSMVue校园综合服务小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 摘 要 I Abstract II 第一章 绪 论 1 1.1选题背景 2 1.2研究现状 3 1.3研究内容 …

易基因: MeRIP-seq等从m6A RNA甲基化角度揭示NFATc1对破骨细胞的调控机制|研究速递

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 双膦酸盐类药物是强效骨吸收抑制剂&#xff0c;是治疗骨质疏松症、多发性骨髓瘤、骨转移等疾病的首选药物。这些药物通过抑制甲羟戊酸通路和促进破骨细胞凋亡来促进骨吸收。双膦酸盐类药…

使用jenkins和tomcat创建并部署maven项目

准备三台服务器&#xff1a; 192.168.58.139 部署tomcat 详细参照&#xff1a;http://t.csdnimg.cn/Yp2z2 192.168.58.140 部署gitlab 详细参照&#xff1a;http://t.csdnimg.cn/Sb1uz 192.168.58.153 部署Jenkins 详细参照…

P8A005-A008系统加固

系统账户数据库安全 预备知识】 数据库研究跨越于计算机应用、系统软件和理论三个领域&#xff0c;其中应用促进新系统的研制开发&#xff0c;新系统带来新的理论研究&#xff0c;而理论研究又对前两个领域起着指导作用。 【实验步骤】 网络拓扑&#xff1a;server2008-bas…

【Unity基础】8.简单场景的搭建

【Unity基础】8.简单场景的搭建 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;场景资源 &#xff08;1&#xff09;Import资源包 今天我们将手动去搭一个简单的场景&#xff0c;当…

IP-Adapter:文本兼容图像提示适配器,用于文本到图像扩散模型

IP-Adapter这是一种有效且轻量级的适配器&#xff0c;用于实现预训练文本到图像扩散模型的图像提示功能。只有 22M 参数的 IP 适配器可以实现与微调图像提示模型相当甚至更好的性能。IP-Adapter 不仅可以推广到从同一基本模型微调的其他自定义模型&#xff0c;还可以推广到使用…

机器学习(1)机器学习类型和机器学习的主要概念

0.前提 深度学习&#xff08;Deep Learing&#xff09;是机器学习&#xff08;Machine Learning&#xff09;领域中的一个新的研究方向&#xff0c;在如今的时代研究深度学习的大模型是十分热门的。我不知道有多少人有关注到最近openai的事件啊&#xff0c;说个比较让我惊讶的…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(1)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; 03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; 03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;2&#xff09; 开始学习机器学习啦&#xf…