项目分类语义

项目分类语义用于对项目进行分类和分配。

对于每个 exec()、initp()、setuid() 和 setgid() 子例程,将使用项目分配规则对进程进行重新分类,以确定是否应更改当前的项目分配。 如果未装入项目分配规则或无法成功应用规则,那么使用当前项目标识。

缺省的项目系统标识是零(0)。 将在启用记帐之前把它应用到基本系统进程,并且可以使用它来表示常规系统开销。 分配了项目标识后,子进程将使用 fork() 内核服务和 creatp() 内核服务从父进程那里继承项目。

initp() 内核服务与 exec() 子例程在应用程序过滤器的使用方法上有所不同。 对于前者,使用启动的内核进程的命令名来执行分类。 该命令名可以通过 ps 命令查看。 而对于后者,那么使用可执行文件的 FID(inode + 设备编号)以及策略指定的标准路径名的 FID 执行分类。 只能使用在策略装入时间可以计算的 FID。

如果通过显式命名应用程序的规则对进程进行分类,那么应将项目标识应用于进程及其子进程,因为目的在于对一批工作进行标记。 这意味着着进程中的后续 exec()、setgid() 和 setuid() 子例程及其子进程不会对项目进行重新分类。 这些进程在内部用一个粘性位识别,它表明这些进程是通过显式命名应用程序的规则进行分类的。 这个粘性位可以通过 ps -P 命令查看。

以下是运行 ps -P 命令后的输出示例。 dev 项目前面的星号(*)表示它连接有一个粘性位:

UID    GID    PID    TTY    TIME    PROJECT    SUBPROJ    CMD
0      0      16922  pts/1  0:00    *dev       0          ps
0      0      19206  pts/1  0:00    *dev       0          acctras
0      0      22286  pts/1  0:00    *dev       0          ksh 

当您装入一个新的策略文件时,将对系统中的所有进程进行重新分类(带有粘性位的进程除外)。 带有粘性位的进程是无法更改的。

把一个不同的项目标识分配给进程时,进程记帐记录将写入 acct 文件,这样就可以精确地报告项目的资源使用情况。 每当发生这种情况时,进程的记帐统计信息将复位为零。