Linux 进程调度(三)之进程的优先级

目录

  • 一、概述
  • 二、进程的优先级
    • 1、基础概念
    • 2、优先级的意义
    • 3、查看优先级
    • 4、PRI 和 NI
    • 5、修改优先级
    • 6、控制进程的优先级的系统调用
    • 7、调整优先级的限制


一、概述

在 Linux 中,每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程优先级范围从 -20 到 +19,其中 -20 为最高优先级,+19 为最低优先级。

二、进程的优先级

1、基础概念

Linux 中的进程优先级分为静态优先级和动态优先级。

  • 静态优先级:静态优先级是在创建进程时分配的,通常由管理员或程序员指定。静态优先级决定了进程的基本优先级,可以通过 nice 命令来设置,范围为 -20 到 +19。较低的数值表示较高的优先级。例如,如果给一个进程设置了较低的优先级值如 -10,那么这个进程将具有较高的优先级。
  • 动态优先级:动态优先级是根据进程的行为和运行情况自动调整的。在 Linux 中,使用调度算法来动态调整进程的优先级。当一个进程使用 CPU 时间较长时,系统会降低它的优先级,让其他进程有更多的执行时间。而当一个进程处于等待 IO 等待状态时,系统会提高它的优先级,以便快速完成 IO 操作。

2、优先级的意义

因为 CPU 的空间归根结底还是寄存器, 而寄存器很小, 就注定了 CPU 的资源是有限的。 而进程的个数是多个的, 这就势必会导致进程之间的竞争关系。

操作系统为了保证进程之间的良性竞争, 他就会确认进程之间的优先级。如果我们的进程长时间得不到 CPU 资源, 该进程的代码长时间得不到推进, 就会出现饥饿问题。

进程的优先级本质上是 PCB(task_struct)内部属性中的一种属性,决定了进程获取某种资源的先后顺序。进程的 task_struct 在运行队列中排队,本质上就是确定获取 CPU 资源的先后顺序。

Linux 进程的优先级也是用来确定在多个进程同时运行时,哪个进程会获得更多的 CPU 时间片。

在 CPU 正常运行中,OS 给每一个CPU都维护一个运行队列,OS 把进程以”先进先出"的方式把进程的 PCB 放到运行队列中排队,等待 CPU 按照"时间片"的调度算法去调度进程(切换进程,来回剥离和恢复)。

不同的进程对 OS 本质上都是访问 OS 中的资源的访问。本质就是通过 OS 来实现对硬件资源的共享。但是硬件资源只有一套,进程有很多套,进程的共享不在同一时间上,所以造成了优先级。总之,进程所访问的 OS 的资源是有限的,OS 中进程大部分情况是大多数,所以需要优先级。

3、查看优先级

在 Linux 系统中:

  • ps -l 命令用于查看当前终端进程的信息
  • ps -al 命令用于查看全部的进程信息

下面是几个重要字段的意义:

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

4、PRI 和 NI

PRI 标识进程的优先级(Priority),NI 表示进程的 Nice 值。这两个值越小,表示要求获得的 CPU 时间越多。

对于优先级为数字的进程来说,PRINI 的值总是对应的,PRI 的取值范围为 0-39,而 NI 的取值范围为 -20 - 19,PRI 的值总是等于 20 + NI。这样,当 Nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。所以,调整进程优先级,在Linux下,就是调整进程 Nice 值,而不是调整 PRI 的值。

Nice 在英文中是“和善“的意思,这里进程的 Nice 值,也表示进程的和善程度,Nice 值越高就越和善,越和善的进程,越不会与别的进程争抢 CPU 资源。在内核的实现中,Nice 值是内核考虑调度哪个普通进程的一个权重因素。Nice 值越高的进程,被分配到的总运行时间片就会越短;相反,Nice 值越低,就表示该进程希望能得到更多的 CPU 资源。

注意,进程的 Nice 值不是进程的优先级,它们不是一个概念,但是进程 Nice 值会影响到进程的优先级变化。

5、修改优先级

先写一个 C 程序:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main()
{while(1){printf("this is a process, pid=%d\n", getpid());sleep(1);}return 0;
}

在这里插入图片描述

在这里插入图片描述

接下来在终端输入 top 命令,进入任务管理界面:

接下去按下 R/r 之后,就会跳出来下面这句话,这里的 renice 指的就是要重新修改进程,此时 shell 正在等待我们输入进程的 PID 值,那我们就可以输入上方的 4600:

在这里插入图片描述

然后,我们看到 shell 又在等待我们输入需要更改的 Nice 值:

在这里插入图片描述

比如输入 11,再用 ps 查看:

在这里插入图片描述

也就是说,Linux 系统支持用户调整优先级,但并不是让用户直接修改 PRI 值,而是修改 Nice 值。而 Nice 值 不是 优先级,而是优先级的修正数据。

所以真正的优先级应该是:PRI = PRI(old) + nice(old 指旧的优先级)

6、控制进程的优先级的系统调用

Linux 提供的修改和查看进程优先级的系统调用分别为:

int setpriority(int which, id_t who, int prio);
int getpriorit(int which, id_t who);

其中,whichwho 参数联合指定要操作的进程或进程组,setpriority() 中的参数 priogetpriority() 的返回值都是操作目标的 Nice 值。

因为 Nice 值可以是负数,所以,使用 getpriority() 系统调用之前需要先把 errno 显式设置为 0,如果返回值为负数,再联合 errno 区分是遇到错误,还是目标的 Nice 值本身就是负值。

7、调整优先级的限制

系统对进程的优先级调整,会施加一定的限制条件,防止被进程滥用。在 2.6.12 版本之后的 Linux 中,特权进程能够自由地修改任意进程的优先级,而非特权进程只能修改自身,或者同一个有效用户启动的其他进程,并且修改的幅度会受到系统限制的制约。

ulimit 命令的 -e 选项可以查看当前允许的调整范围,它的值表示优先级提高的上限若限制值为 LIMIT_N,则表示 Nice 值降低(优先级提高)时,能减少到的最小值为 20-LIMIT_N

默认的限制值是 0,也就是说不允许非特权进程提高进程的优先级,而只能降低。当这个值大于 20(默认优先级)时,表示非特权进程能够把自身或相同有效用户的进程的 Nice 值调整为负值。

利用优先级调整的功能,开发者就可以根据不同服务的功能特性,合理分配它们的运行优先级。例如,在服务器开发中,经常会有一种内部审计的进程或线程,负责在后台执行一些数据完整性的检查,并在发现错误时报告一些错误信息,提醒开发或运营人员的注意。这种服务的运行不应该抢占对外提供服务的进程的运行资源。这时,就可以把它的运行优先级降到最低,比如,把 Nice 值设置为 19。

在上面 top 命令的输出中,也可以找到一个 Nice 值为 -20 的进程 kworker,这是 Linux 的内核工作队列的工作线程。

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

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

相关文章

NBT:单细胞转录组新降维可视化方法PHATE

新降维可视化 NGS系列文章包括NGS基础、转录组分析 &#xff08;Nature重磅综述|关于RNA-seq你想知道的全在这&#xff09;、ChIP-seq分析 &#xff08;ChIP-seq基本分析流程&#xff09;、单细胞测序分析 (重磅综述&#xff1a;三万字长文读懂单细胞RNA测序分析的最佳实践教程…

vue 日期控件 100天内的时间禁用不允许选择

vue 日期控件 100天内的时间禁用不允许选择&#xff0c;可以从101天选起 比如&#xff0c;2024年8月9号开始&#xff0c;100天内禁止选择&#xff0c;第101天之后的日期可以选&#xff0c;效果如图所示 // 日期控件代码 加上 :picker-options"pickerOptions" <…

nestjs 全栈进阶--windows安装docker desktop

一. 下载软件 https://docs.docker.com/desktop/install/windows-install/ 根据你自己的电脑选择 二. 安装 双击下载的exe 点击ok 安装好后 桌面会有个这样的图标 三. 配置环境 因为docker desktop 是可以部署在windows 上来运行docker的应用服务的&#xff0c;其基于windo…

SOPHGO算能科技BM1684盒子占用空间满的问题解决

目录 1 问题由来 2 问题排查与解决 1 问题由来 安装软件的时候发现&#xff0c;软件根本安装不上了&#xff0c;用df -h看到根目录已经满了 rootbm1684:~# df -h Filesystem Size Used Avail Use% Mounted on overlay 5.8G 5.7G 0 100% / devtmpfs …

openfeign本地试用

目的&#xff1a;在本地搭建一个简单的openfeign使用场景&#xff0c;测试查询、新增等功能 平台&#xff1a;win10 技术栈&#xff1a;Springboot, SpringCloud, Nacos, Mybatis, MySql, Logback 框架作用说明&#xff1a; Nacos用于服务注册&#xff0c;将provider应用注…

Redis 的6种回收策略(淘汰策略)详解

Redis 的6种回收策略&#xff08;淘汰策略&#xff09;详解 1、Redis的六种淘汰策略1. volatile-lru2. volatile-ttl3. volatile-random4. allkeys-lru5. allkeys-random6. no-eviction 2、使用策略规则 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&am…

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗&#xff1f;就是那种拥有一个属于自己的影音库&#xff0c;不用担心被和谐&#xff0c;随时可以登录访问电脑上的各种文件&#xff0c;相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘&#xff0c;可以实现…

FFmpeg For Android入门NDK打印版本号

本文用到的FFmpeg for Android 的开发库&#xff0c;需要先在Ubuntu上完成编译&#xff0c;关于编译的过程参见我的上一篇文章。 Android Studio版本为Android Studio Dolphin | 2021.3.1 Patch 1 1.打开Android Studio&#xff0c;新建工程&#xff0c;选择Native C 最小API…

深耕编程语言18年,对话 Rust、TypeScript、Nushell 核心贡献者 Sophia Turner | Open AGI Forum

作者 | Annie Xu 采访 | 卢威 责编 | Echo Tang 出品丨GOSIM 开源创新汇 编程语言的种类令人眼花缭乱&#xff0c;但成功的、常用的编程语言却是凤毛麟角。在深耕编程语言研发 18 年的 Sophia June Turner 看来&#xff0c;编程语言成功的关键在于其研发团队的透明度和机制建…

【多线程基础】指令、进程调度、了解计算机是如何进行工作的

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

Qt QML 使用QPainterPath绘制弧形曲线和弧形文本

Qt并没有相关api直接绘制弧形文字&#xff0c;但提供了曲线绘制相关类&#xff0c;所以只能另辟蹊径&#xff0c;使用QPainterPath先生成曲线&#xff0c;然后通过曲线上的点来定位每个文字并draw出来。 QML具体做法为从QQuickPaintedItem继承&#xff0c;在派生类中实现paint…

8–9月,​Sui Move智能合约工作坊将在台北+线上举行

你对区块链和去中心化应用感兴趣吗&#xff1f;想深入学习Sui Move编程语言吗&#xff1f; 从8月10日到9月28日&#xff0c;Sui Mover社区将在每周六下午13:00–17:00举办精彩的工作坊&#xff0c;为期两个月&#xff0c;带你从零基础入门到高级进阶&#xff0c;全面掌握Sui M…

ARM 架构硬件新趋势:嵌入式领域的未来

目录 目录 一、ARM 架构概述 二、新趋势一&#xff1a;AI 加速器集成 三、新趋势二&#xff1a;更高效的电源管理 四、新趋势三&#xff1a;安全性增强 五、结语 随着物联网 (IoT) 和边缘计算的发展&#xff0c;ARM 架构在嵌入式系统中的应用越来越广泛。从智能手机到智能…

element table表格树形数据展示

element table表格树形数据展示 1、效果 2、代码 <el-table ref"pointMultipleTable" border class"table-box" :data"[damActiveObj]"row-key"id" :tree-props"{ children: children }" :expand-row-keys"expand…

入门 PyQt6 看过来(项目)在线购物项目说明

本文我们利用pyqt6制作一个在线售卖商品的系统&#xff0c;页面大致如下图效果&#xff1a; ​ 1 项目分析 本项目分为四个模块&#xff1a;主窗口&#xff0c;商品选购&#xff0c;下单结算&#xff0c;销售分析。&#xff08;本文暂不涉及登录&#xff09; 主窗口包含&…

JAVA—正则表达式

关于正则表达式的了解学习&#xff0c;以及用于校验格式&#xff0c;信息查找和替换分割内容。 目录 1.概述 2.书写规则 3.应用案例 4.用于信息查找 5.用于搜索替换&#xff0c;分割内容 1.概述 由一些特定的字符组成&#xff0c;代表一个规则 作用&#xff1a; 1.校验数据…

深度学习 —— 个人学习笔记17(锚框、多尺度锚框)

声明 本文章为个人学习使用&#xff0c;版面观感若有不适请谅解&#xff0c;文中知识仅代表个人观点&#xff0c;若出现错误&#xff0c;欢迎各位批评指正。 三十四、锚框 import torch import matplotlib.pyplot as plt from matplotlib_inline import backend_inlinetorch.…

RuoYi-Vue新建模块

一、环境准备 附:RuoYi-Vue下载与运行 二、新建模块 在RuoYi-Vue下新建模块ruoyi-test。 三、父pom文件添加子模块 在RuoYi-Vue的pom.xml中,引入子模块。 <dependency><groupId>com.ruoyi</groupId><artifactId>ruoyi-test</artifactId>&…

小程序背景图片无法通过 WXSS 获取

问题&#xff1a;pages/index/index.wxss 中的本地资源图片无法通过 WXSS 获取 可以使用网络图片&#xff0c;或者 base64&#xff0c;或者使用标签。 将图片转换为base64&#xff0c;地址 base64图片在线转换工具 - 站长工具 在这里把要使用的图片转换一把&#xff0c;然后将得…

JDBC连接Mysql数据库超详细讲解

JDBC连接Mysql数据库 如何导入驱动jar包 进入mysql官网 – https://www.mysql.com/ 点击下载找到方框内选项 点击 在项目文件夹创建lib文件 , 将下载好的驱动器导入 , 再添加到项目即可 步骤一&#xff1a;注册JDBC驱动 在Java中&#xff0c;要与数据库进行交互&…