Linux:进程优先级

文章目录

基本概念

CPU资源分配的先后顺序,就是指进程的优先权(priority)。

优先权高的进程有优先执行权利。配置进程优先权对多任务环境的Linux很有用,可以改善系统性能。

还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,有可能改善系统整体性能。

查看进程优先级

我们可以使用ps -l查看进程信息:

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

UID : 代表执行者的身份

PID : 代表这个进程的代号

PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

PRI :代表这个进程可被执行的优先级,其值越小越早被执行

NI :代表这个进程的nice值

PRI & NI

PRI是比较好理解的,即进程的优先级,或者说就是程序被CPU执行的先后顺序,此值越小,进程的优先级别越高。

NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new) = PRI(old) + nice

这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行

所以,调整进程优先级,在Linux下,就是调整进程nice

nice其取值范围是[-20,19),一共40个级别。

需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice会影响到进程的优先级变化。可以理解nice值是进程优先级的修正数据。

更改优先级

我们可以使用top命令更改已存在进程的nice值,来更改程序的优先级。

我们编写以下程序:

编译并执行:

然后我们在另一个账户查看此进程信息:

我们可以看到该进程的PRI是80,NI是0。

我们执行top指令,打开资源管理器:

然后按r,会提醒我们输入想要改变优先级的进程的PID

输入PID后,回车,输入想要修改的NI值,回车并q退出。

这时我们再查看进程的优先级信息:

可以看到PID变成了 80 + NI

需要注意:我们每一此调整程序的优先级,都会从默认优先级调整,而不是当前优先级。

比如,我们像这样再修改该进程的优先级:

进程的优先级会被调整为 80 + 5 ,而不是 90 + 5:

另外一个需要注意的是:如果我们输入的NI值大于19或小于-20,会按照19或-20来调整。

Linux中进程优先级的实现原理

在之前我们提到,处于运行状态的进程的PCB会进入运行队列,链接在CPU结构体对象中,CPU挨个执行进程。

下图是Linux2.6内核中进程队列的数据结构:

一个CPU有一个runqueue,如果有多个CPU就要考虑进程个数的负载均衡问题。

我们所对应的优先级[60,99]在运行时会转换成[100,139]。

进程在进程优先级队列当中是从上往下,从左往右进行调度的,当runing中的进程被调度完之后,通过指针交换来继续调度waiting中的进程,以此循环,就构成了我们所看到的优先级队列。

其中还有一个位图bitmap,大小为五个整形元素,占有160个比特位,用来表示队列中140个位置上还有没有进程。这样可以快速判断某个优先级的进程是否运行完。

运行完的进程会进入等待队列,等全部进程都进入等待队列后,等待队列会变为活跃队列,原来的活跃队列变为等待队列。

上下文

CUP中有大量寄存器,进程会将数据交给寄存器进行计算,如果程序运行结束或时间片到了,该运行其他程序了,那么寄存器中的数据就会被全部写入该进程的PCB中,等再次运行到此进程时,再将PCB中存储的寄存器数据覆盖寄存器原来的数据进行计算。

CPU中存储的所有临时数据,叫做硬件上下文

当一个进程从CPU中离开,会把所有的硬件上下文都拷贝走,存储在PCB中,这个过程叫做保护上下文

`中存储的寄存器数据覆盖寄存器原来的数据进行计算。

CPU中存储的所有临时数据,叫做硬件上下文

当一个进程从CPU中离开,会把所有的硬件上下文都拷贝走,存储在PCB中,这个过程叫做保护上下文

而当一个进程被再次调度的时候,又会把自己的数据写入CPU中,覆盖原始的寄存器中的数据,这个过程叫做恢复上下文

相关推荐
tb_first1 小时前
k8sday13数据存储(1.5/2)
linux·运维·服务器·云原生·容器·kubernetes
逢生博客2 小时前
Ubuntu 安装 gvm 管理 Go 语言开发环境
linux·ubuntu·golang·gvm
多吃蔬菜!!!3 小时前
vscode 搭建C/C++开发环境搭建(linux)
linux·c语言·c++
李李李li4 小时前
Ubuntu 22.04 安装tensorrt
linux·tensorrt
phoenix09815 小时前
Linux入门DAY29
linux·运维
入秋6 小时前
Linux服务器安装部署 Nginx、Redis、PostgreSQL、Docker
linux·前端
Mr. Cao code6 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
zcz16071278216 小时前
Linux 网络命令大全
linux·运维·网络
the sun346 小时前
Reactor设计模式及其在epoll中的应用
linux·运维·服务器·c++
喜欢你,还有大家6 小时前
Linux笔记7——shell编程基础-1
linux·运维·笔记