Linux进程优先级

admin2024-07-01  20

1. 基本概念

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

2. 查看系统进程

linux 或者 unix 系统中,用 ps –l 命令则会类似输出以下几个内容:
Linux进程优先级,第1张
我们很容易注意到其中的几个重要信息,有下:

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

Linux进程优先级,第2张

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

Linux进程优先级,第3张

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

Linux进程优先级,第4张

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

Linux进程优先级,第5张

其他概念

5. 进程调度队列

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

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

Linux进程优先级,第6张

Linux进程优先级,第7张

其中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就去执行新的活跃进程队列。这样的两个队列轮流执行,一个负责执行,一个负责接受新进程的结构.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!