Solaris Resource Manager 允许管理员控制:
用户或者某一应用程序所占有的虚拟内存的数量(这是所有进程的虚拟内存利用率在 lnode 层次的一个度量)。
某一用户组或者某一应用程序所占有的虚拟内存的数量(这是所有进程的虚拟内存利用率在 组长 lnode 层次的一个度量,而这些进程又是附加到组长和/或其子节点上的)。
某一单个进程所占有的虚拟内存的数量。
一个用户/lnode 可以同时运行的进程的数目。
用于记录虚拟内存利用率并向其分配限制的系统属性包括:
某一 lnode 的 memory.myusage 属性,等于当前附加到该 lnode 的所有进程的虚拟内存利用率的总和。
lnode 的 memory.usage 属性等于它的 memory.myusage 属性及其子 lnode 的 memory.usage 属性的总和。
memory.limit 属性应用于 memory.usage 属性。它对附加到 lnode 及其成员 lnode 的所有进程的内存利用率总和加以限制。
用于记录进程利用率并向其分配限制的系统属性是:
lnode 的 memory.plimit 属性是针对每一进程的限制,分别应用于附加到该 lnode 或其任意成员的每个进程的内存利用率。
每当某个进程试图增加其内存大小时,就受制于其所附加的 lnode 的内存限制(总和或者每一进程)。一个进程有五个方法可以用来尝试增加其内存大小:
调用一个诸如 malloc(3C) 的分配例行程序,可产生对 sbrk(2) 系统调用的调用。如果超过了某个内存限制,该调用就会返回一个错误,并把 errno 设定为 ENOMEM。
扩充堆栈,促成一个堆栈故障,这样通常会促使向进程提供另外一个内存页。如果超过了内存限制,将会向进程发送一个 SIGSEGV 信号。
使用 mmap(2)。
使用 fork(2)。一个子地址空间被复制,但仍被父进程所拥有。在复制过程中,新地址空间不会超过 memory.plimit,因为父节点必须已经在该限制内;但是,分配受 memory.limit 的制约。
使用 exec(2)。在 exec 过程中,内存利用率将随旧的地址空间被丢弃而首先减小。但如果新程序的地址空间更大,并产生超过限制的情况,则 exec 可能会失败。
Enterprise 10000 系统所提供的动态重新配置 (DR) 功能对于施加在 lnode 上的虚拟内存限制具有限制影响。特别地,DR 使得在系统运行期间在系统中增加或删除物理内存成为可能。(该系统的虚拟内存集包括所有物理内存,及配置在系统中的交换空间。)此外,可在任何 Solaris 系统上使用 swap(1M) 命令在系统上添加(-a)或删除(-d)交换空间。这样,虚拟内存的总量可在运行过程中增加或减少。
这对 Solaris Resource Manager 所施加的虚拟内存限制有一个间接的影响。因为虚拟内存是用绝对单位(而不是用份额单位)来管理的。有效限制并不随着系统资源在操作过程中的变化而变化。(注意,该性能不同于对进程的动态重新配置,有关讨论见于 动态重新配置。)
用于管理进程利用率(进程数目)的系统属性是:
某个 lnode 的 process.myusage 属性等于附加到该 lnode上的进程数目。
lnode 的 memory.usage 属性等于它的 memory.myusage 属性及其子 lnode 的 memory.usage 属性的总和。
process.limit 属性是应用于某个 lnode 的 process.usage 属性的一个限制;它可限制能附加到该 lnode 及所有同时运行的成员 lnode 上的进程的数目。
fork(2) 和 vfork(2) 系统调用用于创建新的进程。如果这造成超过进程限制,则该系统调用失败,并返回一个 EAGAIN 错误。多数程序都把 EAGAIN 的含义解释为系统资源的暂时缺乏,并可能在短暂睡眠后再次尝试 fork。如果 fork 失败是因为某个 Solaris Resource Manager 限制造成的,这就会造成在无限长时 间内进行循环,因为在受影响 lnode 的限制被固定之前,每次重新尝试都会返回一个 EAGAIN。