Linux进程控制块:task_struct
2026/9/19 1:40:39 网站建设 项目流程

一,进程优先级

1.1,基本概念

1,cpu资源分配的先后顺序,就是指进程的优先权。进程在已经能得到某种资源的前提下,得到某种资源的先后顺序。

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

3,有进程优先级,本质是因为资源不足,所以分配资源之前要确认优先级,可以决定进程得到某种资源的先后顺序。

1.2,怎么查看进程优先级

在Linux系统中,使用 ps -l 命令会输出以下内容:

从上面的输出的首行信息可以看到:

UID:代表执行者的身份。

PID:代表这个进程的标示符。

PPID:代表这个进程是由哪个进程发展衍生而来的,也就是这个进程的父进程的标示符。

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

NI:代表这个进程的nice值。

1.3,PRI和NI

1,PRI就代表进程的优先级,也就是程序被CPU执行的先后顺序,此值越小,进程的优先级越高。

2,NI是这个进程的nice值,其表示进程可被执行的优先级的修正数值。

3,PRI值越小越快被执行,那么加入nice值后,会使PRI变为:PRI (new) =PRI (old) +nice值。

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

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

6,nice值取值范围是 -20 --- 19;一共四十个级别。

1.4,调整进程优先级命令

1,top命令

这是创建的子进程的优先级:

执行top命令后按 “r” ---->输入进程PID ----> 输入nice值。

可以看到这个进程的 PRI 和 RI 被修改了。(输入的NI值为-20)

再次修改NI值(19),可以发现这个进程的PRI值并不是(60+19=79),而是(80+19=99),出现这种情况的原因是PRI(old)默认都是80,也可以看到进程优先级的调整变化范围是 [ 60,99 ],并且不能高频修改进程的优先级。

其他调整优先级命令:nice,renice 。

系统函数

1.5,补充概念

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
并行: 多个进程在多个CPU下分别,同时进xing运行,这称之为并行。
并发: 多个进程在⼀个CPU下采用进程切换的方式,在⼀段时间之内,让多个进程都得以推进,称
之为并发。
二,进程切换

CPU上下文切换:其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中,入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器,并开始下一个任务的运行,这一过程就是context Switch 。

参考Linux内核0.11代码:

时间片:

当代计算机都是分时操作系统,每个进程都有它合适的时间片(其实就是一个计数器)。时间片到达,进程就被操作系统从CPU剥离下来。

三,Linux2.6内核,进程O(1)调度队列

3.1,首先抛出两个问题:

1,在c语言定义的一个结构体中,有四个成员,哪一个成员的地址是最大的?

typedef struct A { int a; int b; int c; double d; }A;

a < b < c < d 。

2,如果只给了其中一个成员的地址,怎么算出这个结构体的起始地址?

#include<stdio.h> typedef struct A { int a; int b; int c; double d; }A; int main() { printf("%d\n", sizeof(A)); A obj = { 1,2,3,4.0 }; int* pc = &(obj.c);//已知成员c的地址 int* count = &(((A*)0)->c);//算出以0为起始地址,c成员的偏移量 A* pA = (A*)((int)pc - (int)count);//pc减去偏移量就是结构体A的起始地址 printf("%p\n", pA); printf("%d\n", pA->c);// 3 return 0; }

结论:c语言中,任何变量的地址数字,是开辟众多字节中,地址数据最小的那个。

组织进程:

task_struct就是Linux系统中的PCB(进程控制块),可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct双链表的形式存在内核里。

struct list_head就是Linux系统中的双链表,也就是task_struct里的一个成员struct list_head tasks。tasks里的两个指针并不指向task_struct结构体,而是指向struct list_head结构体,所以对进程的管理,就变成了对这个双链表的管理。

遍历链表时,怎么获取一个进程中的其他属性值呢?

前面我说过,只给出其中一个成员的地址,就可以算出这个结构体的起始地址,所以,我们已经知道了task_struct其中一个成员(struct list_head tasks)的地址,同样也可以算出task_struct这个结构体的起始地址,只要算出task_struct的起始地址就可以访问进程中的其他属性值。

3.2,一个CPU拥有一个runqueue

1,普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应)。

实时优先级:0~99(不关心)。

优先级数字,本质就是数组下标(优先级数字+40),优先级PRI数字范围是[ 60,99],对应的数组下表范围为[ 100,139],这就是我们要关心的普通优先级。

2,调度队列图解

3,活动队列

(1),时间片还没有结束的所有进程都按照优先级放在活动队列。

(2),nr_active:记录运行状态的进程总个数。

(3),queue[140]:一个元素就是一个进程队列,相同优先级的进程按照先进先出规则进行排队调度,所以,数组下标就是优先级。

(4),从该结构中,选择一个最合适的进程,过程是怎样的?

1,从0下标开始遍历queue[140];

2,找到第一个非空队列,该队列必定为优先级最高的队列;

3,拿到选中队列的第一个进程,开始运行,调度完成;

4,遍历queue[140]虽然是常数时间复杂度(数组大小固定),但还是太低效了。

(5),由于遍历queue[140]太低效,所以,就有了位图 bitmap[5]:一共140个优先级,140个进程队列,为了提高查找非空队列的效率,就可以用 5*32 个比特位表示队列是否为空(1表示该队列非空,0表示空),这样,就可以大大提高查找效率。

4,过期队列

(1),过期队列和活动队列结构一样。

(2),过期队列上放置的进程,都是时间片耗尽的进程。

(3),当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算。

5,active指针和expired指针

(1),active指针永远指向活动队列;expired指针永远指向过期队列。

(2),当活动队列上的进程时间片用完,就会根据优先级链入到过期队列。具体来说,进程在被调度执行时,操作系统会为其分配一个时间片(即允许该进程占用CPU运行的时间长度)。当这个时间片被消耗殆尽时,说明该进程本轮已经获得了足够的CPU执行时间,此时它就不能继续留在活动队列中占用资源了。于是,调度器会根据该进程当前的优先级,将它从活动队列中取出,并按照优先级高低链入到过期队列的相应位置。在过期队列中,所有进程同样按照优先级排列,优先级高的进程排在前面,等待下一轮调度时优先获得CPU资源。这样设计的目的是为了保证系统的公平性——每个进程都能轮流获得CPU执行机会,避免某些高优先级进程长期霸占CPU而导致低优先级进程出现"饥饿"现象。当活动队列中的所有进程都被处理完毕(即所有进程的时间片都用完并转移到过期队列)之后,调度器会将active指针和expired指针进行交换,使原来的过期队列变成新的活动队列,从而开始新一轮的调度循环。

(3),到这里就可以讲一下这个nice值了,为什么不能直接修改进程的优先级数字?是因为这样做的代价太大,所以就有了nice值(优先级修正数值)。当我们修改一个进程的nice值后,这个进程的优先级数字并不会立即改变,当这个进程被调度完(时间片耗尽),会根据nice值重新计算优先级数字,这个进程的优先级数字就会发生改变,然后根据这个优先级数字再链入到过期队列。当活动队列中的所有进程都被处理完毕,调度器会将active指针和expired指针进行交换,使原来的过期队列变成新的活动队列,从而开始新一轮的调度循环。此时,那些在上一轮中因时间片耗尽而被放入过期队列的进程,就会在新的活动队列中按照重新计算后的优先级数字参与调度,获得再次使用CPU的机会。通过这种方式,nice值虽然不直接修改优先级数字,却能在每一轮调度结束后间接地影响进程的优先级,从而实现对进程调度优先级的灵活调整,既保证了系统的公平性,又避免了频繁修改优先级数字带来的高昂代价。

6,总结

在系统中查找一个最合适调度的进程的时间复杂度是一个常数,不会随着进程增多而导致时间成本增加,我们称之为进程调度O)算法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询