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

Linux进程优先级

1. 基本概念

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

2. 查看系统进程

linux 或者 unix 系统中,用 ps –l 命令则会类似输出以下几个内容:
我们很容易注意到其中的几个重要信息,有下:
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的 nice

3. PRI and NI

PRI(priority) 也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小进程的优先级别越高.
NI ? 就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值,PRI值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(new)=PRI(old)+nice,其中PRI(old)为优先级的默认值80.这样,当nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行 ,所以,调整进程优先级,在Linux 下,就是调整进程 nice值 ,但Linux的调度器设计者并不想让用户过多的参与优先级的调整,所以n ice其取值范围是-20 19 ,一共 40个级别,所以优先级的取值范围为[60,99] 40个级别。

4. top调整优先级

我们有一个test程序,运行起来后输入指令ps -al 来查看其原始PRI值为80

而后输入指令top进入资源管理器,并输入 r 表示想要改变某个进程的优先级

之后输入要修改的nice值,如-20即可,最后输入 q 退出top资源管理器

再次输入指令ps -al 来查看其PRI值变为60,NI值为-20

其他概念
1. 竞争性 : 系统进程数目众多,而 CPU 资源只有少量,甚至 1 个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
2. 独立性 : 多进程运行,需要独享各种资源,多进程运行期间互不干扰
3. 并行 : 多个进程在多个 CPU 下分别,同时进行运行,这称之为并行
4. 并发 : 多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

5. 进程调度队列

在CPU中,存在大量的寄存器,比如:

eax/ebx/ecx/edx:用于存储临时数据,比如函数返回值
eds/ecs/fg/gs:段寄存器,区分代码与数据
eip:也就是pc指针,指明当前代码执行到那个位置
浮点数寄存器:浮点数运算
ebp/esp:构建栈区

程序在运行的时候,会存储大量的数据,比如当前执行到哪一行代码,上一个语句运算的结果是什么,函数调用到第几层了,等等。这些数据都存储在CPU的寄存器中。CPU中存储的所有临时数据,叫做硬件上下文。当一个进程从CPU中离开,会把所有的硬件上下文都拷贝走,存储在PCB中,这个过程叫做保护上下文。而当一个进程被再次调度的时候,又会把自己的数据写入CPU中,覆盖原始的寄存器中的数据,这个过程叫做恢复上下文

其中nr_active表示当前run_queue总共含有几个进程

queue[140]就是运行队列的主体,我们将其划分为两个区间[0, 99]这段区间暂不讲解,[100, 139]这个区间用于放正在排队的进程的PCB.这个区间刚好有40个元素,而我们的优先级也刚好有40个,也就是说一个优先级的进程对应一个下标。其实这个数组本质是一个指针数组,类型是task_struct*,即指向PCB类型的指针,每个指针指向一个链表,链表内存储着所有该优先级的进程的PCB。当运行队列调度进程的时候,从下标100开始,也就是从高优先级开始调度,然后遍历这个链表,把高优先级的链表执行完,再去执行下一个优先级的链表的进程。

bitmap[5]是一个五个元素的int数组,其是一个位图,一个int有32字节,5×32=160,比140大一些。其用一个位图来表示某个下标对应链表有没有进程,有就是1,没有就是0。此时就可以通过遍历位图,来快速判断一个queue的某个下标位置有没有进程,进而得出要不要去遍历该下标的链表。

其实run_queue中有两个运行队列,在上图中你会发现,这是两个相同的队列,一个叫做活跃进程队列,一个叫做过期进程队列。active指针指向的队列就是活跃进程队列,expired的指针指向的队列就是过期进程队列.

假设现在CPU正在执行下标为110的链表的进程,也就是优先级为70的进程,此时刚好又有很多优先级为70的进程进来了,结果CPU一直在执行这个优先级的进程。最后70优先级以后的进程,一直拿不到CPU资源,导致进程饥饿问题。为了解决该问题,run_queue就设计了两个运行队列,CPU只执行活跃进程队列中的进程,而新来的进程进入过期队列,此时新来的进程就不会影响正在执行的进程。

当CPU把活跃进程队列的进程执行完后,此时expired与active指针进行交换,那么活跃进程与过期进程就交换了,此时CPU就去执行新的活跃进程队列。这样的两个队列轮流执行,一个负责执行,一个负责接受新进程的结构.

http://www.lryc.cn/news/388758.html

相关文章:

  • 每日一题——Python实现PAT乙级1096 大美数(举一反三+思想解读+逐步优化)3千字好文
  • 无锁编程——从CPU缓存一致性讲到内存模型(1)
  • C++编程(七)继承
  • 【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering
  • 【TB作品】atmega16 计算器,ATMEGA16单片机,Proteus仿真
  • C++的IO流操作
  • MacOS升级指定Python版本的pip
  • 音频Balance源码总结
  • CesiumJS【Basic】- #043 绘制脉冲线(Entity方式)- 需要自定义着色器
  • Linux命令 wc(word count)-l(lines)用于统计文件中的行数。
  • 数据结构 - C/C++ - 链表
  • sheng的学习笔记-AI-高斯混合模型(GMM)
  • OFDM的缺点与关键技术
  • 电脑录音软件哪个好?7款录制音频工具大盘点,赶快学起来!(2024)
  • 【Android面试八股文】你说你使用Leakcanary进行内存泄漏检测,那你能说一说Leakcanary的原理吗?
  • 蒂升电梯职业性格和Verify认知能力SHL测评答题攻略及薪资待遇解密!
  • window上部署sql server改动端口、和sqlserver的一些还原、批量插入存储过程的命令
  • 【单片机与嵌入式】stm32串口通信入门
  • 启动Redis服务器
  • uniapp中使用threejs加载几何体
  • 【SQL注入】 数据库基础
  • 文件操作~
  • 身边的故事(十二):阿文的故事:消失
  • 智能扫地机器人程序中出现的问题可以参考的解决方案
  • 如何借用物联网快速实现高标准农田信息化
  • 计算机网络基础入门
  • uniApp vue2 vue3配置代理
  • 运维锅总详解RocketMQ
  • 【Linux】使用ntp同步时间
  • 【FedMut】Generalized Federated Learning via Stochastic Mutation