进程管理:Process 与 Job 对象
介绍 Process 与 Job 的整体设计
实现 Process 和 Job 对象的基本框架,支持树状结构
作业Job
概要
作业是一组进程,可能还包括其他(子)作业。作业用于跟踪执行内核操作的特权(即使用各种选项进行各种syscall),以及跟踪和限制基本资源(例如内存,CPU)的消耗。每个进程都属于一个作业。作业也可以嵌套,并且除根作业外的每个作业都属于一个(父)作业。
描述
作业是包含以下内容的对象:
- 对父作业的引用
- 一组子作业(每个子作业的父作业既是这个作业)
- 一组成员进程
- 一套策略(Policy)
由多个进程组成的“应用程序”可作为单个实体,被作业基于一套策略进行控制。
作业策略Job Policy
策略policy 可在Kernel运行时动态修改系统的各种配置(setting)。作业策略主要涉及作业安全性和资源使用的条件(Condition)限制。
策略的行为PolicyAction
策略的行为包括:
- Allow 允许条件
- Deny 拒绝条件
- AllowException 通过 debugt port 生成异常,异常处理完毕后可恢复执行且运行条件
- DenyException 通过 debugt port 生成异常,异常处理完毕后可恢复执行
- Kill 杀死进程
应用策略时的条件 PolicyCondition
应用策略时的条件包括:
- BadHandle: 此作业下的某个进程正在尝试发出带有无效句柄的syscall。在这种情况下,
PolicyAction::Allow
并且PolicyAction::Deny
是等效的:如果syscall返回,它将始终返回错误ZX_ERR_BAD_HANDLE。 - WrongObject:此作业下的某个进程正在尝试发出带有不支持该操作的句柄的syscall。
- VmarWx:此作业下的进程正在尝试映射具有写执行访问权限的地址区域。
- NewAny:代表上述所有ZX_NEW条件的特殊条件,例如NEW_VMO,NEW_CHANNEL,NEW_EVENT,NEW_EVENTPAIR,NEW_PORT,NEW_SOCKET,NEW_FIFO和任何将来的ZX_NEW策略。这将包括不需要父对象来创建的所有新内核对象。
- NewVMO:此作业下的某个进程正在尝试创建新的vm对象。
- NewChannel:此作业下的某个进程正在尝试创建新通道。
- NewEvent:此作业下的一个进程正在尝试创建一个新事件。
- NewEventPair:此作业下的某个进程正在尝试创建新的事件对。
- NewPort:此作业下的进程正在尝试创建新端口。
- NewSocket:此作业下的进程正在尝试创建新的套接字。
- NewFIFO:此工作下的一个进程正在尝试创建一个新的FIFO。
- NewTimer:此作业下的某个进程正在尝试创建新的计时器。
- NewProcess:此作业下的进程正在尝试创建新进程。
- NewProfile:此作业下的一个进程正在尝试创建新的配置文件。
- AmbientMarkVMOExec:此作业下的某个进程正在尝试使用带有ZX_HANDLE_INVALID的zx_vmo_replace_as_executable()作为第二个参数,而不是有效的ZX_RSRC_KIND_VMEX。
进程Process
进程是传统意义上程序的一个运行实例,包含一组指令和数据,这些指令将由一个或多个线程执行,并拥有一组资源。在具体实现上,进程包括如下内容:
- Handles :大部分是进程用到的资源对象的句柄
- Virtual Memory Address Regions:进程所在的内存地址空间
- Threads:进程包含的线程组
进程包含在作业(Job)的管理范畴之中。从资源和权限限制以及生命周期控制的角度来看,允许将由多个进程组成的应用程序视为一个实体(即作业)。
生命周期(lifetime)
进程有自己的生命周期,从开始创建到直到被强制终止或程序退出为止。可通过调用Process::create()
创建一个进程,并调用Process::start()
开始执行 。该进程在以下情况下停止执行:
- 最后一个线程终止或退出
- 进程调用
Process::exit()
- 父作业(parent job)终止了该过程
- 父作业(parent job)被销毁(destroied)
注:Process::start()
不能被调用两次。新线程不能被添加到已启动的进程。