前言:
初步了解进程之间的链接和访问
关于Linux中task_struct实例化的对象是怎么链接的,每个节点之间是如何访问以及节点内部的成员如何访问?我们做一个基本的了解。
tast_struct可以看作一个数据结构,其内部有包含许多种数据结构,那么它是如何包含许多数据结构的呢?每个节点之间是如何链接的呢?
比如双链表的结构,每个节点并不直接存储链表的前后指针,而是将前后指针封装成一个成员变量,通过访问成员变量访问前后节点,同理,对于多叉树结构,每个节点并不直接存储子树的指针,而是将子树的指针封装成一个节点成员。
比如上面的节点t_s1和t_s2,它们之间的链式结构是通过成员变量link实现的,各自的link分别存储两个指针(前后节点的成员link的指针)。
求结构体偏移量
结构体成员的地址减去结构体的地址就等于该成员的偏移量,如果结构体的地址为0,则该成员的地址就恰好等于它在结构体中的偏移量了。
访问节点内的成员:现在我们假设t_s1的link变量已知,我们对其取地址(&t_s1.link),然后计算出该地址的偏移量offsset = (tast_struct*)0->link。然后我们可以得出t_s1的地址为(tast_struct*)( (char*)(&t_s1.link) - (char*)offsset )。根据t_s1的地址,我们就可以对t_s1的成员进行访问了。
访问其他节点:假设t_s1link变量已知,我们可以通过link的成员变量next和prev访问 t_s1的前后两个节点的成员变量link,基于此,我们可以访问在链表上任意节点的成员变量link,于是可以得到任意节点的地址,便可访问任意节点的其他成员变量。
进程的优先级
是什么?
cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先级和权限的区别:
优先级是指进程对同一个资源的访问,谁先谁后。
权限是指能不能。
为什么要有?
因为系统的资源相比于进程的数量是很有限的,进程之间需要竞争访问资源,为了保持进程之间的竞争是合理的、有序的,所以要给进程设置优先级。
如果不给进程设置优先级,进程对资源的访问是混乱的,会造成有的进程一直访问不了对应的资源,从而在用户层面造成软件长时间卡顿。
怎么实现的?
在用户操作层面:通过PRI和NI
我们在终端输入指令ps -l,
UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小优先级越高,越早被执行
NI :代表这个进程的nice值
PRI是不能被修改的,但可以通过修改NI的值修改进程的优先级。
PRI and NI
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
nice其取值范围是-20至19,PRI(old)一直都是系统默认的优先值且不变。
需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化,可以理解nice值是进程的修正数据
底层实现原理
Linux Kernel调度器的过去,现在和未来-电子头条-EEWORLD电子工程世界
O(1)调度器:Linux2.6版本的核心算法_linux o(1)调度-CSDN博客
修改进程的优先级
1.nice命令
nice命令可以用来启动一个进程,并设置其优先级。在命令行中输入”nice -n priority command”,其中priority为一个整数值,范围为-20到19,数值越小表示优先级越高。
示例:
nice -n 10 ./myprogram上述命令将启动一个名为”myprogram”的程序,并设置其优先级为10。
2.renice命令
renice命令可以修改已经运行的进程的优先级。在命令行中输入”renice -n priority PID”,其中priority为新的优先级值,PID为进程的ID。
示例:
renice -n 5 1234上述命令将进程ID为1234的进程的优先级修改为5。
3.top命令
注意:普通用户无法修改进程的优先级。
为什么我们重置的优先值输入是100,最后却是99呢?操作系统为了不让程序员乱改优先值,限制了nice值的范围,最大值为19,最小值为-20,超过范围按极限值算。
我们再继续修改myproc的优先值,
发现最后修改的PRI值不是从99-6=93,也不是从74+7=81,而都是以80为最初的PRI值,进行修改。