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

news2024/9/21 22:50:07

 

个人主页: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.coloradmin.cn/o/1264660.html

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

相关文章

吃火锅(Python)

题目描述 吃火锅 以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。 本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1。…

单片机复位电路

有时候我们的代码会跑飞,这个时候基本上是一切推到重来.”推倒重来”在计算机术语上称为复位.复位需要硬件的支持,复位电路就是在单片机的复位管脚上产生一个信号,俗称复位信号.这个信号需要持续一定的时间,单片机收到该信号之后就会复位,从头执行。 复位原理: 那么…

python基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的钢铁产业产品智能自动化检测识别系统

在前文的项目开发实践中,我们已经以钢铁产业产品缺陷检测数据场景为基准,陆续开发构建了多款目标检测模型,感兴趣的话可以自行阅读即可。 《YOLOv3老矣尚能战否?基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统&#xf…

人工智能原理复习--知识表示(一)

文章目录 上一篇知识概述命题逻辑谓词逻辑谓词逻辑的应用 下一篇 上一篇 人工智能原理复习–绪论 知识概述 知识就是人类认识自然界的精神产物,是人类进行智能活动的基础。 是经过加工的信息,包括事实、信念和启发式规则。 分类: 按作用可…

第22章 NIO编程

在本章中需要掌握NIO中的缓冲区的作用,并理解缓冲区中的数据处理模型,掌握Channel的作用,并结合缓冲区实现数据I/O操作,理解文件锁的作用,并且掌握字符编码处理支持类的使用,掌握Reactor设计模型&#xff0…

深信服AD负载均衡频繁掉线故障分析

一个由114.114.114.114引起的AD异常 客户反馈深信服负载均衡链路频繁掉线,具体故障现象如下 可以获取到IP地址、网关 两分钟掉一次,持续一个多月,求IT的心理阴影面积! 链路监视器只设置了一个114.114.114.114 处理流程&#xff…

Ps:子路径的上下排列以及对齐与分布

不论是一个形状图层(或图层的矢量蒙版)上的多个形状还是同一路径层上多个路径,只要对应“路径”面板的一个路径层,可以将这些路径称为该路径层的“子路径”,也称为“组件”。 当一个路径层上有两个以上的子路径时&…

『 Linux 』进程优先级

文章目录 什么是优先级Linux下的进程优先级PRI与NI使用top查看进程以及对进程的优先级的修改 进程优先级的其他概念竞争性与独立性并发与并行 什么是优先级 优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序; 一般优先级高的单位将优先占有该资源; 在进程当中进…

SELinux零知识学习三十七、SELinux策略语言之约束(1)

接前一篇文章:SELinux零知识学习三十六、SELinux策略语言之角色和用户(7) 四、SELinux策略语言之约束 SELinux对策略允许的访问提供了更严格的约束机制,不管策略的allow规则如何。 1. 近距离查看访问决定算法 为了理解约束的用途,先来看一下SELinux Linux安全模块(Lin…

chatgpt prompt提示词

ChatGPT 最近十分火爆,今天我也来让 ChatGPT 帮我阅读一下 Vue3 的源代码。 都知道 Vue3 组件有一个 setup函数。那么它内部做了什么呢,今天跟随 ChatGPT 来一探究竟。 实战 1.setup setup 函数在什么位置呢,我们不知道他的实现函数名称&…

PyCharm简介与安装

pyCharm的作用 PyCharm是一种Python的集成开发环境,带有一整套可以帮助用户在使用Python语言开发时提高效率的工具 pyCharm的集成 pyCharm的分类 PyCharm的下载 网址:https://www.jetbrains.com/pycharm/download/#sectionwindows PyCharm的安装

Jmeter--如何监控服务器资源

在我们做项目的性能测试时,需要查看相关服务器的资源使用情况;本文以apache-Jmeter-5.5版本为例,使用PerfMon进行服务器资源监控的方案由两部分来实现:ServerAgent部署在被测服务器,负责资源耗用数据的采集&#xff0c…

直接插入排序和希尔排序

前言 我们前面几期介绍了线性和非线性的基本数据结构。例如顺序表、链表、栈和队列、二叉树等~!本期和接下来的几期我们来详解介绍各个排序的概念、实现以及性能分析! 本期内容 排序的概念以及其运用 常见的排序算法 直接插入排序 希尔排序 一、排序的…

xv6 磁盘中断流程和启动时调度流程

首发公号:Rand_cs 本文讲述 xv6 中的一些细节流程,还有对之前文中遗留的问题做一些补充说明,主要有以下几个问题: 一次完整的磁盘中断流程进入调度器后的详细流程sched 函数中的条件判断scheduler 函数中为什么要周期性关中断 …

Java 基础学习(三)循环流程控制与数组

1 循环流程控制 1.1 循环流程控制概述 1.1.1 什么是循环流程控制 当一个业务过程需要多次重复执行一个程序单元时,可以使用循环流程控制实现。 Java中包含3种循环结构: 1.2 for循环 1.2.1 for循环基础语法 for循环是最常用的循环流程控制&#xff…

WPF Live Charts2 自学笔记

文章目录 前言实现效果微软平台的历史问题 WPF 项目搭建Nuget添加额外框架添加项目初始化livecharts配置其它LiveCharts2 案例简单案例Demo示例ViewViewModel GPU渲染 Github地址仓库 前言 LiveChart 是C# 上面很受欢迎的统计图 UI控件。最近在学WPFhalcon开发,想想…

【.NET全栈】.net的微软API接口与.NET框架源码

文章目录 0 前言1 微软官方.net接口学习2 .NET框架源码总结 0 前言 如果浏览器打不开链接,换一个浏览器打开。 我是 打不开微软的链接,使用: 可以打开!!! 1 微软官方.net接口学习 https://docs.microsoft…

【藏经阁一起读】(78)__《Apache Tomcat 的云原生演进》

【藏经阁一起读】(78) __《Apache Tomcat 的云原生演进》 目录 __《Apache Tomcat 的云原生演进》 一、读后感 二、文章知识点摘要 2.1、Tomcat的技术内幕和在喜马拉雅的实践 2.2、GraalVM static compilation in web container application&…

windows系统mobaxterm远程执行linux上ssh命令

命令如下 start "" "%~dp0\MobaXterm_Personal_23.4.exe" -newtab "sshpass -p root ssh root192.168.11.92 mkdir 33" -p 是密码 左边是用户名,右边是服务器ip 后面跟的是服务器上执行的命令 第一次执行的时候要设置mobaxt…

海翔云平台 getylist_login.do SQL 注入漏洞复现

0x01 产品简介 海翔云平台一站式整体解决方案提供商,业务涵盖 批发、连锁、零售行业ERP解决方案、wms仓储解决方案、电商、外勤、移动终端(PDA、APP、小程序)解决方案。 0x02 漏洞概述 海翔云平台getylist_login.do接口处存在SQL注入漏洞&am…