Each process has a status associated with
it. Many processes consume no CPU time until they get some
sort of input. For example, a process might be waiting for
a keystroke from the user. While it is waiting for the keystroke,
it uses no CPU time. While it's waiting, it is "suspended".
When the keystroke arrives, the OS changes its status. When
the status of the process changes, from pending to active,
for example, or from suspended to running, the information
in the process control block must be used like the data in
any other program to direct execution of the task-switching
portion of the operating system.
This process swapping happens without direct
user interference, and each process gets enough CPU cycles
to accomplish its task in a reasonable amount of time. Trouble
can begin if the user tries to have too many processes functioning
at the same time. The operating system itself requires some
CPU cycles to perform the saving and swapping of all the registers,
queues and stacks of the application processes. If enough
processes are started, and if the operating system hasn't
been carefully designed, the system can begin to use the vast
majority of its available CPU cycles to swap between processes
rather than run processes. When this happens, it's called
thrashing, and it usually requires some sort of direct user
intervention to stop processes and bring order back to the
system.
One way that operating-system designers reduce
the chance of thrashing is by reducing the need for new processes
to perform various tasks. Some operating systems allow for
a "process-lite," called a thread, that can deal
with all the CPU-intensive work of a normal process, but generally
does not deal with the various types of I/O and does not establish
structures requiring the extensive process control block of
a regular process. A process may start many threads or other
processes, but a thread cannot start a process.
So far, all the scheduling we've discussed
has concerned a single CPU. In a system with two or more CPUs,
the operating system must divide the workload among the CPUs,
trying to balance the demands of the required processes with
the available cycles on the different CPUs. Asymmetric operating
systems use one CPU for their own needs and divide application
processes among the remaining CPUs. Symmetric operating systems
divide themselves among the various CPUs, balancing demand
versus CPU availability even when the operating system itself
is all that's running.
If the operating system is the only software
with execution needs, the CPU is not the only resource to
be scheduled. Memory management is the next crucial step in
making sure that all processes run smoothly.