| Previous | Table of Contents | Next |
With the introduction of multiprocessors, and especially with our desire to incorporate large numbers of processors in SMP configurations, we decided that we needed a more sophisticated mechanism to adjust the priority of the tasks in the system to maximize the overall system performance. A group of researchers at IBMs Research Division in New York were working on a project they called a delay-cost scheduler. Working together with Research, we were able to create an AS/400 version of this scheduler, which is now incorporated into the SLIC of every AS/400 RISC system. The specifics of the algorithms used in this scheduler are fairly complex and are beyond what I can easily describe here. However, the algorithms of this dynamic priority scheduler allow tasks to execute out of priority-order sequence whenever the system performance will be enhanced and the cost of delaying any particular task will not be significant. The result has been more efficient utilization of the RISC processors, especially for the n-ways.
Now that we have covered the lowest level of task dispatching in an AS/400, we can begin to see how this function supports the higher concept of a process.
A process is a system object at the MI; it is called a process control space. Notice there is no equivalent OS/400 object, as we will see when we look at work management later in this chapter. The responsibility of an MI process is to tie together the resources needed to execute a program, or more accurately, the invocation of a program. Because programs are shared, multiple users can be executing the same program. Of course, each user has his or her own data that the program is using. Because a program needs some place to temporarily store the information or the variables used during its execution, we need to provide a work area for each invocation of a program. This responsibility falls to the MI process.
Before we look at the structure of a process itself, we need to understand the types of storage a program in execution uses. The use of compilers and HLLs significantly affects how programs execute, and a big factor is how the compiler allocates and addresses the programs variables. An HLL often has some form of declaration statements to identify the type of variables and where the compiler should allocate space for these variables.
To understand what a process must support, we want to look at the three separate areas in which current HLLs allocate their data. They are
Note that all three areas are referred to as storage areas, not memory areas. Any particular system may use a combination of registers, memory, and disk storage to implement these areas, hence the name storage.
Like the Original Program Model (OPM) discussed in Chapter 4, the original process model was designed to support languages such as RPG, Cobol, and CL. The original model reflected a structure where each process was a single unit of work and the programs executed by the process tended not to be very modular.
A process is implemented as a system object at the MI. In addition to all the control information, the object either contains the storage areas or points to the storage areas the process uses. The three types of storage areas needed by a process were supported by the original process model as follows:
Looking at the internals of the system object for an original MI process, which was also called a process control space, we would see two segments. The base segment contained much of the control information, along with the TDE for the process. The second segment was called the invocation work area (IWA) segment. The primary function of the IWA segment was to hold the call/return stack the process used.
This original process model served the types of applications written for the System/38 and early AS/400 very efficiently. However, the move to more block-structured languages and the desire to incorporate applications written to standards, as POSIX demonstrates, led to the development of the ILE process model.
| Previous | Table of Contents | Next |