【Linux】第十四站:进程优先级

文章目录

  • 一、Linux内核怎么设计各种结构
  • 二、进程优先级
    • 1.基本概念
    • 2.是什么
    • 3.为什么要有优先级
    • 4.批量化注释操作
    • 5.查看优先级
    • 6.PRI and NI
  • 三、位图与优先级

一、Linux内核怎么设计各种结构

我们前面所写的数据结构都是比较单纯的。

而linux中就比较复杂了,同一个结点可能既处于链表,也处于队列,也处于树中。是极其复杂的

我们可以这样简单的理解为,在一个PCB中,有链表的指针,也有队列的指针,也有树的指针等待。

即如下的情况

struct node
{
	struct node* prev;
	struct node* next;
};
struct task_struct
{
    //各种属性
    //....
    struct node link;
};

也就是和我们之前的是刚好相反的,我们是将指针给存储起来的

image-20231109144406946

这里的指针指向只是在内部的指针进行寻找进程的,如果我们想要找到这个进程的起点,我们可以这样做

(task_struct*)((int)p - (int)&((task_struct*)0->link))

这样就可以找到起始地址了

然后我们就可以直接去找到其他属性了

同样的,如果想将这个放到其他的结构体内,只需要将结点指针直接往里定义即可。

二、进程优先级

1.基本概念

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。(可能改善)
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能

2.是什么

优先级和权限的区别是什么?

优先级解决的是对于资源的访问,谁先访问,谁后访问?

权限解决的是能不能访问

3.为什么要有优先级

因为资源是有限的,进程是多个的,注定了,进程之间是竞争关系! ----竞争性

操作系统必须保证大家良性竞争,必须要确认优先级。

但是如果我们进程长时间得不到CPU资源,该进程的代码长时间无法得到推进----就出现了该进程的饥饿问题。

4.批量化注释操作

当我们注释代码的时候,可能会非常麻烦,所以,我们就需要批量化注释操作

操作如下

  1. 按住CTRL + V
  2. 通过HJKL左下上右四个方向键来选中区域。
  3. 按住Shift + i,即大写I,进入插入模式
  4. 按//
  5. 按ESC

如果我们想要取消批量化注释,那么操作如下

  1. 按住CTRL + V
  2. 通过HJKL选中区域
  3. 直接按d

5.查看优先级

我们可以用这个简单的代码来测试

image-20231109152911340

我们可以使用ps命令带上-l选项来查看到

ps -l

不过上述命令存在一个问题,就是我们是两个终端的,上面默认只能查看一个终端进程,如下所示

image-20231109153103884

为了可以查看到其他终端的进程,我们可以加上a选项

ps -al

image-20231109153145406

为了方便,我们可以将我们想要的那部分给拿出来

image-20231109153259181

在这里,我们重点查看的就是这两个

image-20231109153337834

这个PRI既是传说中的优先级。(priority单词的简写)

NI这个是进程优先级的修正数据(nice值)

下面是这些数据的含义

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值

对于UID,它才是linux系统中真正识别一个文件的东西。

因为linux系统根本不认文件名。只认UID

比如可以直接使用ls命令就可以看到UID,如果带上n就会显示UID

image-20231109154136535

在下面的这个PRI中,在linux中,这个数字是一个整数,这个PRI越小,优先级越高,越早被执行

image-20231109182422810

6.PRI and NI

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小,程的优先级别越高
  • 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  • 所以,调整进程优先级,在Linux下,就是调整进程nice值
  • nice其取值范围是-20至19,一共40个级别

注意事项

  • 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
  • 可以理解nice值是进程优先级的修正修正数据

如果要更改nice值,那么可以使用如下指令

nice
renice

具体使用方法可以使用man手册

我们也可以使用top命令来更改优先级

我们使用如下代码

image-20231109185958341

然后我们可以先查看一下默认优先级,为80

image-20231109190139453

然后我们现在更改优先级,先使用top命令,然后按一下R

image-20231109190247026

然后输入要更改优先级的PID,我们这里是2427

然后会让我们修改多少

image-20231109190359704

虽然我们知道修改范围是-20至19,但是我们可以先尝试一下-30

我们可以看到,这里我们没有权限,所以我们可以使用su指令先换为root在来尝试一下

image-20231109190446354

这一下,我们发现,修改成功了。最终结果如下所示

image-20231109190830008

不过我们会发现,虽然我们修改的是30,但是最终的结果是-20,也就是说不会超过这个范围

但是假如,我们继续再次调整之后,我们为他+100

image-20231109191958867

最终结果如下,是99

image-20231109192020821

可见,实际的最终的优先级PRI = PRI(旧) + NI,其中,这个旧的PRI一般都是80

三、位图与优先级

操作系统是如何根据优先级,开展的调度呢??

其实这是因为里面使用了一种哈希的做法

里面会有这样一个结构体

struct runqueue
{
	task_struct* running[140]
	task_struct* waiting[140]
	//........
}

在这个结构体中,两个数组

这个数组的大小一般是140个,但是[0,99]是其他种类的进程用的。只有[100,139]这40个刚好是我们优先级时候所用的

而我们的优先级一般会从[60,99],会先将这个转化为[100,139]之间

然后使用开散列去一一映射。这样就可以直接按照优先级排好队了

image-20231109194157023

不过这里我们只是使用了一个数组,但是我们上面还写一个数组是用来干什么呢?

这是因为有时候,当我们正在调度一个队列的时候,可能还有新的进程过来。这时候,我们既要向这个队列插入进程,又要移走进程,这不是一个好现象。

所以我们还维护了一个一模一样的镜像队列。

struct runqueue
{
	task_struct** run;
	task_struct** wait;
	task_struct* running[140]
	task_struct* waiting[140]
	//........
}

如上所示,run指向running,wait指向waiting。

这样的话,当我们正在调度run队列的时候,我们这个run队列就不可以插入数据了。只能根据优先级在wait队列中插入。

当run的队列一旦被处理完了,只需要将这两个指针的指向进行一次交换。此时我们就又有了一批需要处理的进程。

不过,在判断处理完的时候,我们现在只能一遍一遍的遍历,这里的话时间复杂度太高。我们可以在开一个位图,用来判断每一个位是否位空

struct runqueue
{
	bitset<140> isempty;
	task_struct** run;
	task_struct** wait;
	task_struct* running[140]
	task_struct* waiting[140]
	//........
}

这样我们就可以以O(1)的复杂度去调度进程

这样的算法也叫做,Linux内核的O(1)调度算法

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

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

相关文章

MATLAB|热力日历图

目录 日历图介绍&#xff1a; 热力日历图的特点&#xff1a; 应用场景&#xff1a; 绘图工具箱 属性 (Properties) 构造函数 (Constructor) 公共方法 (Methods) 私有方法 (Private Methods) 使用方法 日历图介绍&#xff1a; 热力日历图是一种数据可视化形式&#xf…

Vue中的 配置项 setup

setup 是 Vue3 中的一个全新的配置项&#xff0c;值为一个函数。 setup 是所有 Composition API&#xff08;组合式API&#xff09;的入口&#xff0c;是 Vue3 语法的基础。 组件中所用到的数据、方法、计算属性等&#xff0c;都需要配置在 setup 中。 setup 会在 beforeCre…

公众号开发实践:用PHP实现通过接口自定义微信公众号菜单

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

解决在表格数据行赋值给表单,会出现表单输入框无法输入的情况

1 直接赋值属性的方法 会出现表单输入框无法输入的情况 handleFixUpdate(row){this.resetForm("formFixUpdate");console.log(this.formFixUpdate)this.formFixUpdate.repairId row.repairIdthis.formFixUpdate.itemId row.itemIdthis.formFixUpdate.repairMan …

Linux开发工具之编辑器vim

文章目录 1.vim是啥?1.1问问度娘1.2自己总结 2.vim的初步了解2.1进入和退出2.2vim的模式1.介绍2.使用 3.vim的配置3.1自己配置3.2下载插件3.3安装大佬配置好的文件 4.程序的翻译 1.vim是啥? 1.1问问度娘 1.2自己总结 vi/vim都是多模式编辑器&#xff0c;vim是vi的升级版本&a…

Flink SQL TopN语句详解

TopN 定义&#xff08;⽀持 Batch\Streaming&#xff09;&#xff1a; TopN 对应离线数仓的 row_number()&#xff0c;使⽤ row_number() 对某⼀个分组的数据进⾏排序。 应⽤场景&#xff1a; 根据 某个排序 条件&#xff0c;计算 某个分组 下的排⾏榜数据。 SQL 语法标准&am…

启动Hbase出现报错

报错信息&#xff1a;slave1:head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewanggiqi-regionserver-slavel.out’ for reading: No such file or direslave2: head: cannot open/usr/local/hbase-2.3.1/bin/../logs/hbasewangqiqi-regionserver-slave2.out’ for …

无人机航迹规划:六种最新智能优化算法(DBO、LO、SWO、COA、LSO、KOA)求解无人机路径规划MATLAB

一、六种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为…

《网络协议》03. 传输层(TCP UDP)

title: 《网络协议》03. 传输层&#xff08;TCP & UDP&#xff09; date: 2022-09-04 22:37:11 updated: 2023-11-08 15:58:52 categories: 学习记录&#xff1a;网络协议 excerpt: 传输层、UDP、TCP&#xff08;可靠传输&#xff0c;流量控制&#xff0c;拥塞控制&#xf…

如何使用 NFTScan NFT API 在 zkSync 网络上开发 Web3 应用

zkSync 是由 Matter Labs 创建的&#xff0c;是一个以用户为中心的 zk rollup 平台&#xff0c;它是以太坊的第 2 层扩展解决方案&#xff0c;使用 zk-rollups 作为扩展技术&#xff0c;与 optimistic rollups 一样&#xff0c;zk-rollups 将会汇总以太坊主网上的交易并将交易证…

基于CSP的运动想象EEG分类任务实战

基于运动想象的公开数据集&#xff1a;Data set IVa (BCI Competition III)1 数据描述参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134224005?spm1001.2014.3001.5501 EEG 信号时频空域分析参考前文&#xff1a;https://blog.csdn.net/qq_4381153…

基于PHP语言的会员系统搭建(Docker版)

1、操作系统 准备&#xff1a; ubuntu22机器 基础&#xff1a;docker:【精选】Docker微服务-基础_v2/_catalog-CSDN博客 2、安装Docker # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/…

java项目之公廉租房维保系统(ssm框架)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的公廉租房维保系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 一、业主管理功能 该部分内容提…

【应用前沿】360QPaaS 精彩亮相首届中国航空制造设备博览会 | 数智航空

近日&#xff0c;首届“中国航空制造设备博览会”&#xff08;CAEE2023&#xff09;在宁波国际会展中心顺利召开&#xff0c;本届大会以“数智产融 开放发展”为主题&#xff0c;以“新技术、新产品、新服务、新企业”为定位&#xff0c;以特色化、专业化、品牌化、高端化为方向…

[MySQL] MySQL库的基础操作

文章目录 一、数据库的创建 1、1 库的创建 1、2 字符集与校验规则 1、2、1 查看字符集与校验规则 1、2、2 字符集与校验规则的设置 1、2、3 校验规则对数据库的影响 二、数据库的操作 2、1 查看数据库 2、2 删除数据库 2、3 修该数据库 2、4 数据库删除和备份 2、5 显示创建语…

覆盖13个行业,数据分类分级标准汇编更新啦!(附下载)

2016年11月&#xff0c;《网络安全法》明确将“数据分类”作为网络安全保护法定义务之一。 2021年9月&#xff0c;《数据安全法》再次具体确立了“数据分类分级保护制度”及其基本原则。 2021年11月&#xff0c;《个人信息保护法》、《网络数据安全管理条例(征求意见稿)》相继出…

Linux开发工具之编译器gcc/g++

文章目录 1.查看版本2.程序的翻译3.gcc指令3.1gcc hello.c -o hello3.2gcc -E hello.c -o hello.i3.3gcc -S hello.c -o hello.s3.4gcc -c hello.c -o hello.o3.5gcc hello.o -o hello 4.动静态库[详讲链接阶段]4.1初步认识4.2动态链接4.3静态链接 1.查看版本 gcc -v. 2.程序…

Bean作用域

从笔者之前的博客&#xff0c;我们可以看出 Spring 是⽤来读取和存储 Bean&#xff0c;因此在 Spring 中 Bean 是最核⼼的操作 资源&#xff0c;所以接下来我们深⼊学习⼀下 Bean 对象&#xff1a;Bean作用域&#xff01; 限定程序中变量的可用范围叫做作用域&#xff01;或者…

Maven依赖包冲突的两种排查和解决方案

1、识别冲突 观察错误消息&#xff1a;Maven在构建过程或者是项目启动过程中&#xff0c;大概率会输出关于版本冲突的警告或错误消息。当然也有小概率是在运行到指定代码时才会产生的包冲突导致异常报错。 使用mvn dependency:tree命令&#xff1a;这个命令可以展示项目中的所…

Adobe Illustrator 2021 下载及安装教程

目录 下载地址&#xff1a; 安装教程&#xff1a; 下载地址&#xff1a; Adobe Illustrator 2021安装包 链接&#xff1a;https://pan.baidu.com/s/1UIzjbS5pRuL7Zpt9RrU5lQ 提取码&#xff1a;lxwj 安装教程&#xff1a; 1、下载压缩包,解压文件 2、双击Set_up.exe&#…