后端处理

队列的后端由 qdaemon 开始;qdaemon 确定已经轮到某个作业接受处理、设置队列后端的执行环境、构造后端的参数向量,并通过 forkexec 使后端开始执行。

后端的并发实例数由 /etc/qconfig 配置文件中此队列的节中是否存在 file 参数来控制。 如果 file 参数存在,那么对该队列只能存在一个后端实例;这是因为在 qdaemon 已确定可以处理该作业时,它将只尝试为该后端设置执行环境。 设置后端执行环境的一部分工作包括在 file 参数指定的文件或设备上打开后端的标准输出。 如果 qdaemon 已经为前一个作业执行了此操作,而且那个作业还在执行,那么 qdaemon 不能获得 file 参数指定的文件或设备的锁,因此,不能在该文件或设备上打开后端的标准输出。 所以,qdaemon 将使作业保留在队列中,并等待前一个作业执行完毕且释放该文件或设备。 这就是假脱机系统提供和控制对设备的串行访问的方式。

如果没有 file 参数或设置为 FALSE,那么 qdaemon 将在 /dev/null 上打开后端的标准输出,并立即执行作业。 在这种情形下,不存在很明显可以进行串行访问的文件或设备,因此作业不会堆积在队列上。 qdaemon 一设置好执行环境,提交给此队列的作业就将立即得到处理。 如果没有 file 参数,那么将有效地禁用对任何本地文件或设备的串行访问。

例如,远程打印机队列就是一个很常见且很具代表性的没有 file 参数的队列。 在这种情形下,可串行访问的资源实际上存在于另一个主机上;本地队列并没有任何理由尝试任何类型的控制。 这种类型队列的后端(缺省情况下为基本操作系统下的 rembak 程序)只是将作业通过网络发送给远程队列,并让它处理串行访问控制。

在基本操作系统下,本地打印队列的缺省后端是 piobe。 多个队列可以均指定同一个后端。 在这种情形下,可以存在多个 piobe 并发实例;将 piobe 指定为后端的每个队列都可能生成一个 piobe 实例。 然而,如果两个或多个队列还给 file 参数指定了相同的值,那么会应用串行访问限制。 如果 qdaemon 已获取另一个 piobe实例的锁定,那么 qdaemon 将无法获取对指定文件或设备的锁定。 因为此限制而不能处理作业的队列将显示 DEV_BUSY 的队列状态。 只要 qdaemon 可以获取对 file 参数指定的文件的锁定,状态就会更改为 RUNNING