Solaris Resource Manager 允许管理员控制:
用户或者某一应用程序所占有的虚拟内存的数量(这是所有进程的虚拟内存利用率在 lnode 层次的一个度量)。
某一用户组或者某一应用程序所占有的虚拟内存的数量(这是所有进程的虚拟内存利用率在组头目 lnode 层次的一个度量,而这些进程又是附加到组头目和/或其子用户的)。
某一单个进程所占有的虚拟内存的数量。
一个用户/lnode 可以同时运行的进程的数目。
有若干系统属性,可以用于记录虚拟内存的利用率,以及向其指派限制。
用于管理内存利用率的系统属性为
某一 lnode 的 memory.myusage 属性,等于当前附加到该lnode 的所有进程的虚拟内存利用率的总和。
一个 lnode 的 memory.usage attribute 等于它的 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 的 process.usage 属性等于其 process.myusage 属性及其子 lnode 的 process.myusage 属性的总和。
process.limit 属性是一个限制,应用于一个 lnode 的process.usage 属性,以便对可以同时附加到该 lnode 及其所有成员 lnode 的进程的数目加以限制。
fork(2)、fork1(2)和 vfork(2)系统调用用于创建新的进程。如果有可能导致超过进程限制,则系统调用失败,返回一个 EAGAIN 错误。大多数程序将 EAGAIN 错误解释为系统资源暂时短缺,请再次尝试 fork,可能需要先睡上一小觉。如果 fork 失败是由于某个 Solaris Resource Manager 限制,则有可能导致无限时间的循环,因为每次尝试都会返回 EAGAIN,一直到为受影响的 lnode 的限制得到固定。