【Linux】进程优先级

目录

  • 一、优先级的基本概念
  • 二、进程优先级的查看
  • [三、PRI 与 NI](#三、PRI 与 NI)
    • [3.1 PRI](#3.1 PRI)
    • [3.2 NI](#3.2 NI)
    • [3.3 PRI的计算](#3.3 PRI的计算)
    • [3.4 NI的范围](#3.4 NI的范围)
    • [3.5 PRI的范围](#3.5 PRI的范围)
  • 四、进程优先级的设置
    • [4.1 用top命令更改已存在进程的nice值](#4.1 用top命令更改已存在进程的nice值)
    • [4.2 使用nice命令](#4.2 使用nice命令)
    • [4.3 使用renice命令](#4.3 使用renice命令)
  • 结尾

一、优先级的基本概念

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

    进程的优先级是进程得到某种资源的先后顺序。

  2. 为什么要有优先级的概念?

    本质上就是因为资源不足,在学校中,学生有成千上万个,但是食堂的窗口只有几十上百个,所以学生吃饭需要在窗口前排队,排队的本质就是确认优先级。

  3. 操作系统中是如何确定进程的优先级的?

    进程的PCB中有一个int变量,它的数值越小,进程的优先级越高。


二、进程优先级的查看

ps命令用于显示当前系统中的进程状态,当带上了-l选项,则会显示包括进程的优先级(PRI)与进程优先级的修正值(NI)


三、PRI 与 NI

3.1 PRI

PRI就是进程优先级,也就是进程被CPU执行的先后顺序,PRI的值越小越快被执行。

3.2 NI

NI是nice值,也就是进程优先级的修正值。

3.3 PRI的计算

在Linux中,PRI不能被直接修改,需要通过对NI的修改,间接的修改PRI。

PRI的计算方式:PRI(新)= PRI(旧)+ NI

在Linux中,这里的PRI(旧)并不是进程的上一个PRI值,而是固定的一个值80。

3.4 NI的范围

在Linux中,NI的范围为 -20 ~ 19。

nice值最小为-20,当修改的nice值小于-20时,统一被修改为-20。

nice值最小为19,当修改的nice值大于19时,统一被修改为19。

3.5 PRI的范围

在Linux中,默认的PRI的值为80,并且由于NI的范围是 -20 ~ 19,所以PRI值的范围为60 ~ 80。

问题:为什么要将PRI的值设置在一定的范围内呢?
解答:因为操作系统调用进程的时候,为了让进程能够较为均衡的得到调度。如果没有范围限制,并将某些进程的优先级设置的非常高,这些进程会长时间占用CPU资源,导致其他进程无法获得到足够长的运行时间,出现进程饥饿的现象。


四、进程优先级的设置

4.1 用top命令更改已存在进程的nice值

top打开任务管理器,输入r重新调整nice值,告诉它我们要修改进程的PID,再输入修改进程的nice为多少。

如果想将进程的优先级调低,操作系统会让你随便调,如果想将进程的优先级调高,操作系统会阻止,除非在使用root或是普通账号在使用sudo的情况下,可以将进程的优先级调高。


4.2 使用nice命令

nice命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序。同样要将进程的优先级提高需要使用sudo命令提权才能做到。

语法nice -n <nice_value> <command>

复制代码
<nice_value>:希望设置的nice值。
<command>:要启动的命令或程序。

4.3 使用renice命令

renice命令用于修改已经运行的进程的优先级。与nice命令不同,renice可以作用于已经运行的进程。同样要将进程的优先级提高需要使用sudo命令提权才能做到。

语法renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]

  • -p pid 重新指定进程的 id 为 pid 的进程的优先级
  • -g pgrp 重新指定进程群组(process group)的 id 为 pgrp 的进程(一个或多个) 的优先级
  • -u user 重新指定进程拥有者为 user 的进程的优先级

结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。

希望大家以后也能和我一起进步!!🌹🌹

如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

相关推荐
唯独失去了从容39 分钟前
WebRTC服务器Coturn服务器的管理平台功能
运维·服务器·webrtc
roman_日积跬步-终至千里3 小时前
【K8s基础】K8s下的Helm和Operator:包管理器与运维程序化
运维·容器·kubernetes
PassLink_5 小时前
[Kaggle]:使用Kaggle服务器训练YOLOv5模型 (白嫖服务器)
运维·服务器·yolo
朴拙数科5 小时前
MongoDB Atlas与MongoDB连接MCP服务器的区别解析
服务器·数据库·mongodb
极小狐6 小时前
极狐GitLab 合并请求依赖如何解决?
运维·git·ssh·gitlab·github
程序猿(雷霆之王)6 小时前
Linux——进程间通信
linux·运维·服务器
riveting7 小时前
SD2351核心板:重构AI视觉产业价值链的“超级节点”
大数据·linux·图像处理·人工智能·重构·智能硬件
易保山8 小时前
MIT6.S081 - Lab10 mmap(文件&内存映射)
linux·操作系统·c
NoneCoder8 小时前
HTML 模板技术与服务端渲染
服务器·servlet·html
禅与Bug的修复艺术8 小时前
JAVA后端开发常用的LINUX命令总结
java·linux·面试·java面试·后端开发·java后端·面试经验