【Linxu】--进程优先级和进程切换

张开发
2026/4/6 1:22:11 15 分钟阅读

分享文章

【Linxu】--进程优先级和进程切换
一、 进程优先级1、基本概念CPU对资源分配的先后顺序、其指的就是进程的优先权优先级高的进程那么就有优先执行的权利。配置进程优先级对于我们的多任务环境的Linux是很有必要的其可以改进我们操作系统的性能。而且其还可以将进程运行到指定的CPU上那么这样一来就可以将一些不重要的进程安排到某个CPU上这样就又可以大大的提高系统的整体的性能。那么其和我们前面提到的权限有何不同呢优先级VS权限权限决定的是能不能做这个事情优先级决定的是何时能做其可以做但是就是先后的问题此时进程已经可以得到某种资源 的前提下、得到某种资源的先后顺序设置优先级的好处可以提高我们对于资源的分配效率使得资源的分配更加公平合理。2、查看系统进程在Linux和unix系统中使用ps -l命令就会输出如下信息有几个信息我们前面已经很熟悉了UID表示执行这个进程的执行者的信息PID这个进程的编号PPID表示这个进程的父进程、即这个进程是由那个进程衍生发展而来的PRI表示这个进程的优先级、其值越小表示其优先级越高NI表示这个进程的nice值上面的PRI和NI就是我们进程优先级的信息了然后PRI我们已经知道了是优先级的等级那么NI是啥呢NI其实就是优先级的修正数值调整进程的优先级在Linux下就是对nice值进行修改。那么我们如何对nice值进行修改呢使用top命令可以进行更改。过程如下top后按r然后输入要修改的进程的PID然后输入nice值。可以看到我上面就将text这个进程的nice值修改成了10然后其PRI就变成了90。所以加入了nice值后就会使得PRI变成PRI(new)PRI(old)nice那么当我们的nice值为负值的时候那么我们进程优先级就会变小即优先级变高。但是我们也不能说去无限大的调整进程的优先级nice也是有一个范围值的。nice的范围值[-20,19]。然后PIR其基准值是80那么我们的进程优先级的范围就为[60,99]。一共四十个级别注意1、PRI(new)PRI(old) nice其中PRI(old)为80并不是前一次的PRI2、对于优先级的更改不能改变的太频繁和太狠原因我们的操作系统大部分是分时操作系统。分时操作系统给进程分配时间片相对公平公正的调度策略较为均衡的让不同的进程都可以在一段时间内都能得到CPU的资源补充竞争性系统进程数目众多、但是CPU的资源只有少量甚至只有一个、所以进程之间是具有竞 争属性的。为了高效完成任务更加合理竞争相关的资源就有了优先级。独立性多进程运行、其需要独享各种资源、各个进程之间互不干扰并行多个进程在多个CPU下分别、同时的运行并发多个进程在一个CPU下采用切换的方式、在一段时间之内、让多个进程可以推进二、进程切换CPU上下文切换其实际含义就是任务切换、或者CPU寄存器切换。当多任务内核决定运行另外的任务时候、它保存正在运行任务的当前状态、也就是CPU寄存器中的全部内容。这些内容会被报保存在任务自己的堆栈中、入栈工作完成后就会把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器、并开始下一个任务的运行、这一个过程就是上下文切换(context switch)。简单来说就是寄存器是共享的但是寄存器中的数据本质是进程私有的。实际上、操作系统是使用的链表的结构对其进行管理的、其链表结构如下上面就是我们对于进程组织的双向链表。Linux内核中会将所有的进程task_struct统一放在一张双链表中。但是前面我们提到我们的进程还有其运行队列阻塞队列等那么是否是可以链表存储呢/确实是这样我们的这些数据也可以是结构体的对象。然后我们的CPU都有一个调度队列struct runqueue{}如下所示我们就关注蓝色和红色部分首先有一个数组int arr[2]其存放的是array[0]和array[1]如上图。然后*activearray[0]*axpiredarray[1]然后这两个数组中有分别有三种数据nr_active:表示runqueue中是否有进程其记录的是进程的总个数。queue[140]这个就是存放我们的进程的结构体地址的队列其是按照进程的优先级进行存放的首先我们看到这个queue的大小是1400~99这个区间的我们不关心我们关心的是100~139这个区间的那么可以看到其大小刚刚好是我们nice的范围。那么我们对于进程的结构体地址的存放就是会将其nice100那么就是其存放的下标了。然后bitmap[5]这个也是一个进程队列但是其功能是帮助我们可以更高效率的查找到对应进程存储的位置。其实际上使用的原理是位图。就比如我们是一共140个位置那么我们设置32个比特位为一组那么我们设置5组就可以表示完我们的140个位置的了然后我们每次就使用8个位次进行计算我们每次都使用11111111和其进行位运算然后就可以加快我们判断那边有进程了。那么我们的操作系统是否就直接按照进程的优先级来决定进程的执行先后呢那么我们发现还有一个问题就是比如我们当前执行的程序的优先级是61的然后中途就源源不断的插入了优先级为60的进程那么我们的操作系统是否就会马上不干了跑去执行进程优先级为60的进程那么这样的话我们进程优先级为61的进程就会一直得不到CPU的运行这种叫做饥饿进程。那么这和我们分时操作系统的要求就违背了。我们发现我们上面的话有两个queue首先就是活跃进程array[0]我们CPU就是从这个里面寻找进程进行运行那么我们后面来的进程就会先被存入到那个过期进程中然后我们有一些运行的进程其时间片过期了那么我们也会将其记录到这个过期进程中然后当这个活跃进程的queue被执行完毕然后就会将这两个queue进行交换。

更多文章