Linux下 进程(三)(进程的优先级)

欢迎来到我的频道 【点击跳转专栏】

码云链接 【点此转跳】

文章目录

  • [1. 进程优先级的基本概念](#1. 进程优先级的基本概念)
  • [2. 查看系统进程](#2. 查看系统进程)
  • [3. PRI and NI](#3. PRI and NI)
    • [3.1 PRI](#3.1 PRI)
    • [3.2 NI&&用top修改NI](#3.2 NI&&用top修改NI)
  • [4 .与优先级有关的几个问题](#4 .与优先级有关的几个问题)
    • [4.1 优先级无法更改问题?](#4.1 优先级无法更改问题?)
    • [4.2 old pri是什么?](#4.2 old pri是什么?)
    • [4.3 优先级范围是多少?](#4.3 优先级范围是多少?)
    • [4.4 为什么是这个范围?](#4.4 为什么是这个范围?)
  • [5. nice&&renice命令修改优先级](#5. nice&&renice命令修改优先级)
  • [6. 函数方式修改优先级](#6. 函数方式修改优先级)
  • [7. 补充概念-竞争、独⽴、并⾏、并发](#7. 补充概念-竞争、独⽴、并⾏、并发)

1. 进程优先级的基本概念

优先级vs权限

权限 里,我们回答的是能不能的问题,在优先级 中,在进程已经能得到某种资源的前提下,优先级就是得到资源的先后顺序。


为什么要有优先级?

本质还是因为资源不足,分配资源的时候,就要合理分配,决定进程获得某种资源的顺序。


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

2. 查看系统进程

在linux或者unix系统中,⽤ps ‒l命令则会类似输出以下⼏个内容:
-l :以长格式显示进程详细信息(包括 F、S、UID、PID、PPID、C、PRI、NI、ADDR、SZ、WCHAN、TTY、TIME、CMD 等)

  • UID: 代表执行者的身份

我们通过ls -ln 可以 长格式列出文件和目录的详细信息,并以数字形式 显示用户 ID(UID)和组 ID(GID),而不是用户名和组名

上面的UID 就是进程执行这个的用户ID

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

PRINI与进程的优先级有关,都属于struct_task的一个属性。

3. PRI and NI

3.1 PRI

PRI也还是比较好理解的,即进程的优先级 ,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高 ;系统不允许 你直接修改 PRI 的数值。

3.2 NI&&用top修改NI

NI,就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值。

  • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行; 所以,调整进程优先级在Linux下,就是调整进程nice值
  • nice其取值范围-20至19,一共40个级别。

⽤top命令更改已存在进程的nice:

  • top
  • 进⼊top后按"r"‒>输⼊进程PID‒>输⼊nice值

修改前:

修改时:

修改后:

4 .与优先级有关的几个问题

4.1 优先级无法更改问题?

更改优先级是无法高频更改的 当我们短时间内多次更改优先级,系统会拒绝你更改,可以用超级用户进行修改,同时也可能和权限有关

  • 普通用户:只能降低自己进程的优先级;
  • root 用户 :可以任意设置 NI 值(包括负值)

4.2 old pri是什么?

old pri默认永久都是80 跟你此时的pri无关。


4.3 优先级范围是多少?

因为old pri永久都是80 nice值的范围是-20 ~ 19 所以优先级范围是60 ~ 99


4.4 为什么是这个范围?

我们目前主流系统都是 分时操作系统 ,在40左右的范围波动,在给进程分配时间片的时候,相对公平,而公平的调度策略,能较为均衡的让不同的进程能在一段时间内,都能得到CPU资源。所以改变优先级,就不能改的太狠,这么设计可以尽量避免优先级饥饿问题 ;而在工业控制领域,类似单片机 那种必须强制跑完全进程的 就叫 实时操作系统

5. nice&&renice命令修改优先级

nice 命令 ------ 启动时设置优先级

用于以指定 Nice 值启动一个新进程

语法:

bash 复制代码
nice -n <NI值> <命令>
  1. 以较低优先级运行备份脚本(不干扰前台任务)

    bash 复制代码
    nice -n 10 tar -czf backup.tar.gz /home
  2. 以较高优先级运行关键任务(需 root)

    bash 复制代码
    sudo nice -n -5 ./realtime_app
  3. 不指定 -n,默认加 10

    bash 复制代码
    nice ./my_script    # 等价于 nice -n 10 ./my_script

💡 注意:nice 不能启动负值 (除非用 sudo),因为普通用户无权提升优先级。


renice 命令 ------ 修改运行中进程的优先级

用于动态调整已有进程的 Nice 值

语法:

bash 复制代码
renice <NI值> -p <PID>        # 按进程 ID
renice <NI值> -u <用户名>     # 修改某用户所有进程
renice <NI值> -g <组ID>       # 修改某组所有进程
  1. 降低正在运行的压缩进程的优先级(让它"让路")

    bash 复制代码
    ps aux | grep zip          # 先查 PID,比如 1234
    renice 15 -p 1234
  2. 提升某个服务的优先级(需 root)

    bash 复制代码
    sudo renice -10 -p 5678
  3. 将用户 fcy 的所有进程设为低优先级

    bash 复制代码
    sudo renice 19 -u fcy

6. 函数方式修改优先级

c 复制代码
/*
 * 以下两个函数用于获取和设置进程(或进程组、用户)的调度优先级(Nice 值)。
 *
 * 所需头文件:
 *   #include <sys/time.h>
 *   #include <sys/resource.h>
 */

/*
 * int getpriority(int which, int who);
 *
 * 功能:获取指定目标的当前 Nice 值。
 *
 * 参数:
 *   - which: 目标类型,取值为:
 *       PRIO_PROCESS  ------ 目标是一个进程(who = PID)
 *       PRIO_PGRP     ------ 目标是一个进程组(who = PGID)
 *       PRIO_USER     ------ 目标是一个用户的所有进程(who = UID)
 *   - who: 根据 which 的不同,表示 PID / PGID / UID;
 *          若 who == 0,则表示当前进程 / 当前进程组 / 当前用户。
 *
 * 返回值:
 *   - 成功:返回 Nice 值(范围 -20 ~ +19)
 *   - 失败:返回 -1,并设置 errno(注意:Nice 值可能为 -1,需结合 errno 判断是否出错)
 */
int getpriority(int which, int who);

/*
 * int setpriority(int which, int who, int prio);
 *
 * 功能:设置指定目标的 Nice 值(即调整 CPU 调度优先级)。
 *
 * 参数:
 *   - which: 同 getpriority(),指定目标类型(PRIO_PROCESS / PRIO_PGRP / PRIO_USER)
 *   - who:   对应的目标 ID(PID / PGID / UID),0 表示当前
 *   - prio:  要设置的 Nice 值,必须在 [-20, 19] 范围内
 *
 * 返回值:
 *   - 成功:返回 0
 *   - 失败:返回 -1,并设置 errno(常见错误:EPERM 权限不足,ESRCH 进程不存在)
 *
 * 权限说明:
 *   - 普通用户只能将 prio 设为 ≥ 当前 Nice 值(即只能降低优先级);
 *   - root 用户可任意设置 [-20, 19] 范围内的值。
 */
int setpriority(int which, int who, int prio);

7. 补充概念-竞争、独⽴、并⾏、并发

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰(你其中一个进程挂了不会影响另一个)。

因为任何一个 进程都有自己独立的 内核数据结构进程自己的代码和数据 ,所以一个进程挂掉,不会影响另一个,所以进程有独立性

⚠️:父子关系也有独立性,所以子进程僵尸了,父进程依然不影响;即便是父进程挂了,子进程依然可以跑(父子之间pid不同,说明内核数据结构不同 ;代码只读,所以不影响独立性 ;数据相同时候只读 ,不同的时候发生写时拷贝 ,所以也不影响独立性

  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。

(上半部分是并发 ,下半部分是并行

相关推荐
安科士andxe5 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
小白同学_C8 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖8 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
2601_949146538 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天8 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS9 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师9 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp9 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
不做无法实现的梦~9 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
Elastic 中国社区官方博客10 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索