可更新 CPU 资源的分配通过一种被称作 Solaris Resource Manager SHR 调度程序的公平份额调度程序进行控制。
每个 lnode 均被分配一定数量的 CPU 份额。根据未决活动份额(活动是指 lnode 附加了正在运行的进程)的总数,按比例将与每个 lnode 相关联的进程分配给 CPU 资源。在分配资源时只考虑活动 lnode,因为只有它们才有正在运行的活动进程,并需要 CPU 时间。
当某个进程耗用 CPU 资源时,其 lnode 的 CPU 利用率属性就会增加。调度程序可定期调节所有进程的优先权,以强制 CPU 利用率的相对比率,将 CPU 份额的相对比率集中在各级别的所有活动 lnode 上。这样,用户至少可以期望最后总能获得使用 CPU 服务的授权,而无需考虑其他用户的行为。
该调度程序采用分层结构,因为它还能确保各组无需考虑其成员的行为而接收组授权。Solaris Resource Manager SHR 调度程序是一种长期运行的调度程序;它可确保所有用户和应用程序都能在该调度程序运行期间接收到公平的份额。这意味着,当一个小负荷用户开始请求 CPU 时,该用户就会收到比大负荷用户更多的资源,直到二者的相对利用率与其相对“公平”份额的分配比率相当为止。所以,您现在对自己的授权使用的越多,将来能使用的授权就越少。
此外,Solaris Resource Manager 有一个由系统管理员设定的、不跟踪过去利用率的衰减期。衰减模型是半衰期模型之一,即在寿命达到一半时有 50% 的资源已经衰减。这就能确保稳定而平均的用户不会受到短期且与进程密切相关的用户的惩罚。半衰期设定了调度程序的响应模式或期限;缺省值为 120 秒钟。长半衰期对较长的批任务等平均利用率更有益,而短半衰期则对交互用户更有益。较短的数值可在系统上产生更平均的响应,但是在系统内资源分配的计算和维护方面精度较低。无论管理设置如何,调度程序都会尝试防止资源缺乏,并确保甚至在极端条件下的合理行为。
Solaris Resource Manager SHR 调度程序相对于标准 Solaris 调度程序的主要优点在于,它是对用户或应用程序而非个别进程进行调度。与 lnode 相关联的每个进程都受到一组限制的制约。对于运行一个活动进程的单个用户的简单情形来说,这就相当于使每个进程都受到相应 lnode 中所列出的限制的制约。当有多个进程附加到一个 lnode 上时,如运行多个进程的组中的成员,则所有进程都受到列出的限制的制约。这样,用户或应用程序耗用的 CPU 不能超过其授权允许的范围,无论他们运行多少个并发进程。以份额数目对授权进行分配的方法既简单又容易理解,而更改某个用户的份额所造成的影响也是可以预测的。
SHR 调度程序的另一个优点就是,在管理各个线程的调度(从技术上看,在 Solaris 中被调度的实体是一个轻量进程 (LWP))的同时,可以在用户之间按比例分配 CPU 资源。
这些概念可通过以下方程进行阐述:
然后,new_SRM_priority 被映射到系统优先权。Solaris Resource Manager 优先权越高,系统优先权就越低,反之亦然。 CPU_usage 等每个衰减期都减少一半,并以最当前的利用率递增。
每个用户还有一组标志,这些标志是类似布尔的变量,可用于启用或禁用所选择的系统优先权(如登录)。这些标志可针对每个用户分别设定,也可从一个父节点 lnode 中继承而来。
某个用户的利用率、限制和标志可被任何用户阅读,但只能由有正确管理优先权的用户修改。
Solaris Resource Manager 从不浪费 CPU 可用性。无论某个用户的分配有多低,只要没有竞争用户,他就能使用所有可用 CPU。这样做的一种结果就是,用户可能会注意到性能不象通常那样平稳。如果某个具有非常低的 有效份额的用户正在没有竞争的条件下运行一个交互进程,则任务看起来会运行的很快。但是,只要有更高有效份额的另一个用户请求 CPU 时间,则该用户就能得到比第一个用户更高的优先权,这样,第一个用户就会注意到任务执行的速度明显放慢。尽管如此,Solaris Resource Manager 仍会继续运行一段时间,以确保合法用户不会被断开,而无法进行任何工作。由 Solaris Resource Manager 调度的所有进程(具有最大 nice 数值的进程除外)都将由该调度程序定时分配 CPU。另外,还有一种逻辑算法可预防刚刚登录的新用户被分配到从数学上看似“公平”,但实际上过多的 CPU 份额,并对现有用户产生影响。