(2)sched_slice()
该函数负责调度器每次执行调度时,为选定的进程分配运行时间
8#$%
注意注释里的 %
% 所在的 +Q 的 + 是随着是否有新的 % 加入
动态计算得到的,在 + 中 % 占用的 % 不是一次分配运行完的,
而是通过其所处的 %+ 并根据 在不同 的比例作为乘数通过向上递归,
分配 % 的一小部分供 % 运行。
B++++
+++#+++
B!?A
F@+.+Q+Q+1
C
这里为什么要判断 #O+Q?
+QB
说明 要么在 Q+Q$+ 上,要么 +QBR
都包含在 +Q#O+ 中,所以不能再累加一次了
/+QB
说明R 仅仅是关联到了R+Q 被该R+Q 管理,但是没有插入到R+Q:>' 中,
因此还不能被调度执行,是新加入的 ,但是虽然还不能被调度执行,但是既然挂在了该 +Q 上了,
还是会产生负载的,因为其最终还是要被加入到 +Q 上调度执行的,因此这里计算调度周期的时候,
还是把这个R 也算上了,因为随时都有可能将该 插入到 +Q 中。
F@B+++.+Q#O+-S#O+Q1H
根据之前将的 我们知道*
+%++Q?++ABTQ
/+%+?++AB"==
2+%+ 是根,因此其不需要 代表它插入到其他 或管理它的负载。
下面的向上递归循环是用于计算每次进程调度分配给 的实际运行时间*
B.R+Q1
.+Q1
.+Q1
.I.B1Q1
当递归到 B"== 的时候,
此时 B.B+%++%+?++AB1
#O+QBTQ。
因此R 在其R+Q 对应的 + 中的实际运行时间不是一次性分配执行完的,
而通过向上递归不停累乘 在 +Q 中的 比重,完成分配每次调度的实际执行时间。
举例说明*假设RB2+B
B+Q+BB
B/+Q+B0B
B2+Q+B/B/
B+Q+BB2
+B+.1.2/1./01.1B
由此可见 在 + 中总的实际运行时间为 ,但是每次调度的时候分给它的实际执行时间为 ,
这意味着在 + 内要调度 次才能执行完分配给 总的执行时间
+++.1CUV+++.1.HHB#O1向上递归遍历
+H
+H
+QB+Q+.1H这一步得到 所属于的 +Q
BT+Q#OH+Q 管理的所有 的 之和
.%.S#O+Q11C
B+Q#OH
说明该 是新关联到 +Q 上的,但还没有插入到 +Q 上,
虽然每次都不会调度它执行,但是它的负载一直是在的,总之还是一个要处理的任务。
++.T#O1H
BTH
G
B+++.#O1H
G
H
G