第二十章 进程管理
所有 IRIS
程序和应用程序都由进程运行。进程由系统生成的整数进程 ID
(称为 pid
)标识。
进程可以是前台(交互式)进程,也可以是后台(非交互式)进程。使用 JOB
命令在 ObjectScript
中启动后台进程。发出 JOB
命令的进程称为父进程,启动的后台进程称为子进程。后台进程也可以称为“作业进程”或“派生进程”。
进程使用锁持有和释放共享资源。在 ObjectScript
中,进程使用 LOCK
命令获取和释放锁。
本章描述进程批处理模式和进程优先级。
注意: IRIS
为进程管理的各个方面提供最佳默认值。应谨慎更改这些进程默认值,并且仅适用于特定的特殊情况。
批处理模式
进程在默认模式(有时称为交互模式,与用户交互无关)或批处理模式下执行。只有在没有更好工具的特殊情况下,才应使用批处理模式。
可以将访问数据库大部分的进程设置为批处理模式进程,以限制其对系统上运行的其他(非批处理)进程的影响。具体地说,可以防止批处理模式进程读取或修改的数据库块使数据库缓存不堪重负。例如,数据压缩实用程序可能适当地在批处理模式下运行。
批处理模式处理与作业处理不同。使用JOB
命令生成作业进程。作业进程是在后台运行的非交互进程。
可以使用在方法打开的%SYSTEM.Process.BatchFlag()
将当前进程设置为在批处理模式下执行。BatchFlag()
带有一个布尔参数:0
=直接模式(默认),1
=批处理模式。不带参数的BatchFlag()
返回当前模式设置。
优先级
进程优先级决定多个并发进程如何竞争CPU
资源。具有较高优先级的进程优先访问CPU时间
优先级是一个整数值。整数值的范围取决于平台,如下所示:Windows
的优先级范围为1
到15
,NORMAL=8
。Unix
®的优先级范围为-20
到20
,NORMAL=0
。通常,只使用三个整数值:低、正常和高。普通优先级是用户进程的默认优先级。普通优先级使用负载平衡来调整CPU
使用率。
可以使用类中%SYS.ProcessQuery
的Priority
属性来确定进程的当前优先级。
注意:几乎从不需要更改进程的优先级,并且可能会影响系统的稳定性。
SetPrio()
方法
可以使用在方法的SYSTEM.Util.SetPrio()
来更改当前进程或由PID标识的另一个进程的优先级。可以指定一个正整数或负整数来按该值递增或递减当前优先级。在Windows
上,最小优先级为1
;尝试将优先级递减到小于1
会将优先级设置为1
。正常优先级为8
。最大优先级为15
。SetPrio()
返回新的优先级设置。(请注意,尝试递增到超过15
可能会将优先级重置为1
或产生其他不可预测的结果。SetPrio()
返回值大于15
并不反映实际设置的优先级。)
^%PRIO 实用程序
可以使用较旧的^%PRIO
实用程序来确定当前进程的优先级,并将优先级设置为低、正常或高的值。
若要使用^%PRIO
进行调用和更改,必须具有%DB_IRISsys
资源的写权限。
要确定当前优先级,可以发出以下命令:DO ^%PRIO
。随后的无参数写入命令将返回当前优先级,如下所示:%PRIO=8
。
要设置当前进程的优先级,请发出以下命令之一DO LOW^%PRIO
, DO NORMAL^%PRIO
, or DO HIGH^%PRIO
(命令区分大小写)。(在Windows
上)返回的设置优先级值为:Low=4、Normal=8、HIGH=13
。
%SYSTEM.Process.BatchFlag()
更改当前进程优先级。但是,如果进程处于批处理模式 (1
),则使用上述命令提高当前进程的优先级会将进程模式从批处理模式 (1
) 更改为直接模式 (0
)。
要为当前进程设置批处理模式和优先级,请指定 DO SET^%PRIO(priority,mode)
,其中 priority,mode
是区分大小写的字符串,priority=LOW
、NORMAL
或 HIGH
,mode=BATCH or NOBATCH
。可以指定一个或两个以逗号分隔的选项。例如:DO SET^%PRIO("LOW,BATCH")
。此命令允许更改进程优先级而不影响批处理模式进程的模式状态。
作业进程优先级
JOB
命令提供了一个选项来设置 jobbed
(后台)进程的优先级。如果未指定,则子进程采用由系统定义的作业优先级修饰符调整的父进程基本优先级。例如,在 Windows
上,由于作业优先级修饰符,具有 NORMAL
优先级(优先级 = 8
)的父进程启动优先级 = 7
的子进程。优先级为 HIGH
的 jobbed
进程与交互式进程平等竞争 CPU
资源。