Caché Specialized System Tools and Utilities
Process Management
[Back] [Next]
Go to:

All Caché programs and applications are run by a process. A process is identified by a system-generated integer process ID (referred to as a pid).

A process can be either a foreground (interactive) process, or a background (non-interactive) process. A background process is initiated in Caché ObjectScript using the JOB command. The process issuing the JOB command is known as the parent process, the initiated background process is known as the child process. A background process may also be referred to as a “jobbed process” or a “spawned process”.
Processes hold and release shared resources using locks. In Caché ObjectScript a process acquires and releases locks using the LOCK command. To view the current locks, refer to the system-wide lock table, described in the Lock Management chapter of Using Caché ObjectScript.
This chapter describes the following aspects of process management:
For other aspects of process management, refer to the %SYS.ProcessQuery class.
Caché provides optimal defaults for all aspects of process management. Changing these process defaults should be done with caution, and only for specific special circumstances.
Batch Mode
A process executes either in Direct Mode (the default) or in Batch Mode. Batch Mode should only be used for special and extreme circumstances.
A process that will access large portions of a database may be set as a Batch Mode process to limit its impact on other (non-batch) processes running on the system. Specifically, a Batch Mode process is prevented from overwhelming the database cache with the database blocks that it reads or modifies. For example, a data compaction utility might appropriately run in Batch Mode.
A Batch Mode process is not the same as a jobbed process. A jobbed process is generated using the JOB command. A jobbed process is a non-interactive process running in background.
You can use the %SYSTEM.Util.SetBatch() method to establish a process as executing in batch mode. You can specify a process by its pid, or default to the current process. SetBatch() takes a Boolean argument: 0=direct mode (the default), 1=batch mode. SetBatch() returns the prior mode setting.
It is strongly recommended that a Batch Mode process be assigned a LOW priority to limit competition for CPU resources. SetBatch(1) does not change the current process priority. The default process priority is NORMAL.
Streams in Batch Mode
Because stream data can be of any length, Caché automatically puts a process that is reading a data stream into Batch Mode for the duration of the stream read. This is a safeguard to prevent the process from exhausting the shared buffer pool. At the conclusion of the stream read, Caché automatically reverts the process to its prior mode. This operation should be invisible to the user.
Process priority determines how multiple concurrent processes compete for CPU resources. A process with a higher priority has preferential access to CPU time.
Priority is an integer value. The range of integer values is platform-dependent, as follow: Windows has a priority range of 1 to 15, with NORMAL=8. OpenVMS has a priority range of 0 to 15, with NORMAL=4. UNIX® has a priority range of -20 to 20, with NORMAL=0. Commonly, only three integer values are used: LOW, NORMAL, and HIGH. NORMAL priority is the default for user processes. NORMAL priority uses load balancing to adjust CPU usage.
You can determine the current priority of a process using the Priority property of the %SYS.ProcessQuery class.
Changing the priority of a process is almost never needed and can compromise system stability.
The SetPrio() Method
You can use the %SYSTEM.Util.SetPrio() method to change the priority for the current process or another process identified by pid. You specify a positive or negative integer to increment or decrement the current priority by that amount. On Windows, the minimum priority is 1; attempting to decrement a priority to less than 1 sets priority to 1. NORMAL priority is 8. The maximum priority is 15. SetPrio() returns the new priority level set. (Note that attempting to increment past 15 may reset priority to 1 or have other unpredictable results. A SetPrio() return value of >15 does not reflect the actual priority set.)
The ^%PRIO Utility
You can use the older ^%PRIO utility to determine the priority for the current process and to set the priority to a LOW, NORMAL, or HIGH value.
To determine the current priority, you can issue the following command: DO ^%PRIO. A subsequent argumentless WRITE command will return the current priority as follows: %PRIO=8.
To set the priority of the current process, issue one of the following commands: DO LOW^%PRIO, DO NORMAL^%PRIO, or DO HIGH^%PRIO (commands are case-sensitive). The set priority values returned (on Windows) are: LOW=4, NORMAL=8, HIGH=13.
SetBatch(1) does not change the current process priority. However, if a process is in Batch Mode (1), using the above commands to raise the current process priority changes the process mode from Batch Mode (1) to Direct Mode (0).
To set both the Batch Mode and the priority for the current process, specify DO SET^%PRIO(priority,mode), where priority,mode is a case-sensitive string, with priority=LOW, NORMAL, or HIGH, and mode=BATCH or NOBATCH. You can specify either one or both of the comma-separated options. For example: DO SET^%PRIO("LOW,BATCH"). This command allows you to change the process priority without affecting the mode status of a Batch Mode process.
Jobbed Process Priority
The JOB command provides an option to set the priority for a jobbed (background) process. If not specified, the child process takes the parent process base priority adjusted by a system-defined job priority modifier. For example, on Windows a parent process with NORMAL priority (priority=8) initiates a child process with a priority=7, due to the job priority modifier. A jobbed process with a priority of HIGH competes on an equal basis with interactive processes for CPU resources.
Global Buffer Pool
All running processes share the global buffer pool. Cache prevents Batch Mode processes from monopolizing the entire global buffer pool. Cache reserves a specified percentage of the global buffers for use by concurrent non-Batch Mode processes. These are known as reserved global buffers. The percentage of the global buffer pool that is reserved is configurable. Therefore, a process that reads or modifies extremely large quantities of data should run as a Batch Mode process to prevent monopolizing of the entire global buffer pool.