当前位置: 首页 > news >正文

【Linux】进程优先级:谁先 “上车” 谁说了算

这种方式的核心问题是:数据与链表指针紧耦合,不同结构体要单独写链表逻辑,代码完全无法通用,冗余且维护成本高


而侵入式链表正好相反:把通用链表节点 “嵌入” 到数据结构体内部—— 数据结构体是主体,链表节点是它的一个 “成员”(链表逻辑通过这个嵌入的节点实现)。

侵入式链表的核心是 “通用链表节点嵌入数据结构体,数据是主体,同一套链表逻辑可复用管理任意结构体,灵活且无冗余”。

通过节点指针 + 偏移量计算,反向获取结构体对象

代码语言:javascript

AI代码解释

(task_struct *)(start - (size_t)&((task_struct *)0)->link)->other

解析

  1. (task_struct *)0**:*将地址 0 强转为`task_struct`,虚拟结构体基址
  2. (size_t)&((task_struct *)0)->link**:**计算link在结构体中的偏移量(强转size_t确保数值运算)
  3. start - (size_t)&((task_struct *)0)->link**:**节点地址减偏移量,得结构体起始地址
  4. (task_struct *)(...)**:*将结果强转回`task_struct,最终访问other`成员
③ 问题:在进程管理中,为什么通常用链式结构存储 PCB(进程控制块)?

进程管理中选择链式结构存储 PCB,是适配进程动态特性与内核管理需求:

  1. 适配进程动态生命周期:进程会频繁创建 / 销毁,链式结构增删节点仅需修改指针(时间复杂度 O (1)),无需像数组那样扩容、移动元素;
  2. 适配内核内存环境:PCB 可分散存储在非连续内存中(内核中大块连续内存稀缺),链式结构靠指针串联节点,无需连续地址空间;
  3. 支持灵活的进程管理:可轻松实现进程的排序、筛选(如按优先级遍历)、状态切换(如就绪队列 / 阻塞队列的重组),操作成本低;
  4. 复用通用链表逻辑:通过侵入式链表,一套增删查逻辑可管理 PCB、文件等多种内核对象,减少代码冗余。
2、进程优先级
① 进程优先级是什么?

进程优先级是CPU 调度进程的 “先后规则”:系统会给不同进程分配优先级,优先级高的进程能更优先获得 CPU 等资源的访问权(即 “谁先访问、谁后访问”)。 它和 “权限” 是不同概念:

  • 优先级→ 决定资源访问的顺序(谁先用 CPU);
  • 权限→ 决定资源访问的资格(能不能用某个文件 / 设备)。

简单说,进程优先级是 “资源调度的先后顺序规则”,用来让系统更高效地分配 CPU 时间。

② 为什么要有进程优先级?

因为资源是有限的,但进程是多个的,进程之间天然存在资源竞争关系(竞争性)。 操作系统需要通过 “进程优先级” 实现良性竞争

  • 避免进程长期抢不到 CPU 资源(即 “饥饿问题”),否则进程代码无法推进,在用户层会表现为 “应用无响应”;
  • 让更重要的进程优先获得资源,提升系统整体的效率与响应性。
3、如何查看进程优先级?

在 linux 或者 unix 系统中,用 ps –l 命令则会类似输出以下几个内容:

我们很容易注意到其中的几个重要信息,有下:undefined

  • UID: 代表执行者的身份
  • PID: 代表这个进程的标识符
  • PPID:代表这个进程是由哪个进程发展衍生而来的,亦即父进程的标识符
  • PRI:代表这个进程可被执行的优先级,其值越小越早被执行
  • NI:代表这个进程的nice值,会影响进程的优先级(PRI
【UID是什么】

在操作系统中,UID(用户标识符)是系统唯一识别用户的标识:

  • 昵称(用户名)是给人看的,可能存在重复;
  • 但 UID 是系统分配的数字编号(比如 Linux 中 root 的 UID 固定为 0),每个用户的 UID 在系统内是唯一的,不会重复。

所以系统实际是通过 UID 来区分不同用户的,而不是依赖可能重复的用户名。

从图中我们可以看到,ls指令加上-n选项后,对应的文件拥有者和文件所属组的位置被1001这样的数字替代了,1001就代表了当前文件拥有者的UID也就是用户的唯一标识符

【UID和PID的区别】

维度

UID(用户标识符)

PID(进程标识符)

核心作用

唯一标识用户,明确进程 / 文件的所属者

唯一标识进程,定位具体运行的进程实例

对应对象

用户(如 Linux 中 root 的 UID 固定为 0)

进程(每个运行的程序对应至少一个 PID)

唯一性范围

系统内用户唯一,不会重复

系统内进程唯一,进程结束后 PID 可复用

典型使用场景

  1. 控制文件 / 资源的访问权限2. 区分不同用户的进程
  1. 操作进程(如kill PID终止进程)2. 查看进程状态(如ps -p PID)
4、如何理解PRI and NI
  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高
  • NI呢?就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值
  • PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(new)=PRI(old)+nice每次调整 old 都是以默认的 80 开始调整
  • 这样,当 nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
  • 所以,调整进程优先级,在 Linux 下,就是调整进程 nice 值
  • nice 其取值范围是 -20 至 19,一共 40 个级别

从图中可以看到进程默认优先级是80,也就代表了我们所能调整的最终优先级范围是60,99

< 进程 nice 值与优先级调整说明 >

虽然进程优先级可以通过修改 nice 值调整,但不能无限制提升优先级(比如无法通过 “大幅修改 nice 值” 让进程一直被调度)—— 因为 Linux 对 nice 值的调整范围做了限制,仅允许在[-20, 19]区间内调整(nice 值越小,进程优先级越高)。这是系统为避免单个进程过度抢占资源、保证整体稳定性而设置的约束,不会开放过度的优先级干预权限。

5、如何修改进程优先级?
< top调整进程优先级 >
  1. 启动 top:在终端输入top,进入进程监控界面;
  2. 进入优先级调整模式:按下键盘上的r键(代表 “renice”,调整 nice 值);
  3. 输入目标进程的 PID:此时界面会提示 “PID to renice:”,输入要调整的进程 PID 后按回车;
  4. 输入新的 nice 值:接着提示 “Renice PID 目标 PID to value:”,输入想要设置的 nice 值(范围[-20,19]),按回车完成调整。
http://www.cnnetsun.cn/news/171029.html

相关文章:

  • 19、Windows Server 2003 WMI:安全改进与服务管理
  • Excalidraw群组与锁定功能使用场景解析
  • Excalidraw反向代理Nginx配置样例
  • 21、深入探索ADSI:管理Windows目录服务的利器
  • 24、深入了解 WMI:功能、使用与脚本编写指南
  • Excalidraw PWA安装教程:变成桌面应用
  • 18、深入探究文件系统对象(FSO)的使用与实践
  • 27、深入探索WMI关联查询及脚本编写
  • 36、高效管理Windows系统:脚本助力用户与系统信息处理
  • Excalidraw高可用集群架构设想
  • 青少年近视率超50%!全方位守护孩子明亮视界
  • 在SAP系统中创建物料 860000000000000082(物料描述为“8680月球广寒宫坦克车”)时,系统报出了一个错误
  • 在 SAP SD(销售与分销)模块中,销售合同 / 订单的抬头(Header) 和行项目(Item) 核心数据表如下,按 “核心表 + 扩展表” 分类说明,同时区分销售合同(Contract,类型 W
  • Excalidraw手绘白板神器:AI赋能下的技术设计新体验
  • Excalidraw在教育场景的应用:教师也能轻松上手
  • 海思芯片OpenHarmony系统移植:Sensor传感器模块HDF驱动配置HCS文件详解
  • 《Python == 与 is 的真相:从基础语义到底层机制,一篇让新手顿悟、老手沉默的深度解析》
  • Excalidraw HTTPS加密传输:保障通信安全
  • Excalidraw容器化部署:Kubernetes集群完美适配
  • 7、脚本开发与使用全攻略
  • 14、ADSI数据访问与对象枚举全解析
  • 必须精通了hyperf才算学会了swoole吗?
  • Excalidraw与Figma对比:哪个更适合早期原型设计?
  • 02.03.01.快速开始篇(Astra-SDK案例 使用Eclise开发工具:创建Makefile项目方式 DepthReaderEventCPP)
  • Excalidraw二维码分享:移动端访问一键直达
  • 基于Springboot粮仓管理系统【附源码+文档】
  • 基于Springboot笔记本分享平台【附源码+文档】
  • 浩瀚宇宙,2025正是引力场文场的起点
  • Excalidraw热键大全:高手都是这样快速操作的
  • SQLite Unions 子句详解