Solaris 10 资源管理器开发者指南

第 2 章 项目和任务

本章介绍了工作负荷分层结构,并且提供了有关项目和任务的信息。本章包含以下主题:

项目和任务概述

Solaris OS 使用工作负荷分层结构组织系统中所执行的工作。任务是指表示工作负荷组件的进程集合。项目是指表示整个工作负荷的任务集合。在任何给定的时间,进程都只能是一个任务和一个项目的组件。下图说明了工作负荷分层结构中的关系。

图 2–1 工作负荷分层结构

图中显示了项目、任务和进程间的关系。

作为多个项目成员的用户可以同时运行多个项目中的进程。由某个进程启动的所有进程都会继承父进程的项目。在启动脚本中切换到新项目时,所有子进程都会在该新项目中运行。

正在执行的用户进程有关联的用户标识 (uid)、组标识 (gid) 和项目标识 (projid)。进程属性和功能是从用户、组和项目标识继承而来,从而形成任务的执行环境。

有关项目和任务的深入讨论,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 2  章 “项目和任务(概述)”。有关用于管理项目和任务的管理命令,请参见《系统管理指南:Solaris Containers-资源管理和 Solaris Zones》中的第 3  章 “管理项目和任务”

/etc/project 文件

project 文件是工作负荷分层结构的核心。project 数据库是在系统中通过 /etc/project 文件或在网络上通过名称服务(如 NIS 或 LDAP)来维护的。

/etc/project 文件包含五个标准项目。

system

此项目用于所有系统进程和守护进程。

user.root

所有的根进程都在 user.root 项目中运行。

noproject

此特殊项目用于 IPQoS。

default

缺省项目会指定给每个用户。

group.staff

此项目用于 staff 组中的所有用户。

要通过编程方式访问项目文件,请使用以下结构:

struct project {

  char      *pj_name;       /* name of the project */

  projid_t   pj_projid;     /* numerical project ID */

  char      *pj_comment;    /* project comment */

  char     **pj_users;      /* vector of pointers to project user names */

  char     **pj_groups;     /* vector of pointers to project group names */

  char      *pj_attr;       /* project attributes */

};

project 结构成员包括以下各项:

*pj_name

项目的名称。

pj_projid

项目 ID。

*pj_comment

用户提供的项目说明。

**pj_users

指向项目用户成员的指针。

**pj_groups

指向项目组成员的指针。

*pj_attr

项目属性。使用这些属性可为资源控制和项目池设置值。

通过项目属性,可以控制资源的使用情况。可以使用四种前缀对各种类型的资源控制属性进行分组:

有关资源控制的完整列表,请参见 resource_controls(5)

项目和任务的 API 函数

以下函数用于协助开发者处理项目。这些函数使用的各项用于描述 project 数据库中的用户项目。

endprojent(3PROJECT)

处理完成后,关闭项目数据库并取消分配资源。

fgetprojent(3PROJECT)

返回一个指针,该指针指向包含项目数据库中的项的结构。fgetprojent() 从流中读取行,而不是使用 nsswitch.conf 读取行。

getdefaultproj(3PROJECT)

检查项目关键字的有效性,查找项目并返回指向项目结构(如果找到)的指针。

getprojbyid(3PROJECT)

搜索 project 数据库中带有指定项目 ID 的数字的项。

getprojbyname(3PROJECT)

搜索 project 数据库中带有指定项目名称的字符串的项。

getprojent(3PROJECT)

返回一个指针,该指针指向包含项目数据库中的项的结构。

inproj(3PROJECT)

检查是否允许指定的用户使用指定的项目。

setproject(3PROJECT)

将用户进程添加到项目中。

setprojent(3PROJECT)

反绕 project 数据库,以允许重复搜索。

用于访问 project 数据库各项的代码示例


示例 2–1 列显 project 数据库中每项的前三个字段

本示例的要点包括以下内容:

#include <project.h>



struct project projent;

char buffer[PROJECT_BUFSZ]; /* Use safe buffer size from project.h */

	...

struct project *pp;



setprojent();  /* Rewind the project database to start at the beginning */



while (1) {

   pp = getprojent(&projent, buffer, PROJECT_BUFSZ);

	  if (pp == NULL)

          break;

    printf("%s:%d:%s\n", pp->pj_name, pp->pj_projid, pp->pj_comment);

		...

};



endprojent();   /* Close the database and free project resources */


示例 2–2 获取与调用方的项目 ID 匹配的 project 数据库项

以下示例调用 getprojbyid() 来获取与调用方的项目 ID 匹配的项目数据库项。然后,该示例将列显项目名称和项目 ID。

#include <project.h>



struct project *pj;

char buffer[PROJECT_BUFSZ]; /* Use safe buffer size from project.h */



main()

{

   projid_t pjid;

   pjid = getprojid();

   pj = getprojbyid(pjid, &projent, buffer, PROJECT_BUFSZ);

   if (pj == NULL) {

       /* fail; */

   }

   printf("My project (name, id) is (%s, %d)\n", pp->pj_name, pp->pj_projid);

}

与项目和任务关联的编程问题

编写应用程序时,请注意以下问题: