| The operating system defines our computing experience.
It's the first software we see when we turn on the computer,
and the last software we see when the computer is turned off.
It's the software that enables all the programs we use. The
operating system organizes and controls the hardware on our
desks and in our hands, yet most users can't say with any certainty
precisely what it is that the operating system does.
The Bare Bones
It's important to realize that not all computers have operating
systems. The computer that controls the microwave oven in
your kitchen, for example, doesn't need an operating system.
It has one set of relatively simple tasks to perform, very
simple input and output methods (a keypad and an LCD screen),
and simple, never-changing hardware to control. For a computer
like this, an operating system would be unnecessary baggage,
adding complexity where none is required. Instead, the computer
in a microwave oven simply runs a single program all the time.
For computer systems that go beyond the complexity of the
microwave, however, an operating system can be the key to
greater operating efficiency and easier application development.
All desktop computers have operating systems. The most common
are the Windows family of operating systems, the UNIX family
of operating systems and the Macintosh operating systems.
There are hundreds of other operating systems available for
special-purpose applications, including specializations for
mainframes, robotics, manufacturing, real-time control systems
and so on.
At the simplest level, an operating system does two things:
It manages the hardware and software resources of the computer
system. These resources include such things as the processor,
memory, disk space, etc.
It provides a stable, consistent way for applications to deal
with the hardware without having to know all the details of
the hardware.
The first task, managing the hardware and software resources,
is very important, as various programs and input methods compete
for the attention of the central processing unit (CPU) and
demand memory, storage and input/output (I/O) bandwidth for
their own purposes. In this capacity, the operating system
plays the role of the good parent, making sure that each application
gets the necessary resources while playing nicely with all
the other applications, as well as husbanding the limited
capacity of the system to the greatest good of all the users
and applications.
The second task, providing a consistent application interface,
is especially important if there is to be more than one of
a particular type of computer using the operating system,
or if the hardware making up the computer is ever open to
change. A consistent application program interface (API) allows
a software developer to write an application on one computer
and have a high level of confidence that it will run on another
computer of the same type, even if the amount of memory or
the quantity of storage is different on the two machines.
Even if a particular computer is unique, an operating system
can ensure that applications continue to run when hardware
upgrades and updates occur, because the operating system and
not the application is charged with managing the hardware
and the distribution of its resources. Windows 98 is a great
example of the flexibility an operating system provides. Windows
98 runs on hardware from thousands of vendors. It can accommodate
thousands of different printers, disk drives and special peripherals
in any possible combination.
Within the broad family of operating systems, there are generally
four types, categorized based on the types of computers they
control and the sort of applications they support. The broad
categories are:
Real-time operating system (RTOS) - Real-time operating systems
are used to control machinery, scientific instruments and
industrial systems. An RTOS typically has very little user-interface
capability, and no end-user utilities, since the system will
be a "sealed box" when delivered for use. A very
important part of an RTOS is managing the resources of the
computer so that a particular operation executes in precisely
the same amount of time every time it occurs. In a complex
machine, having a part move more quickly just because system
resources are available may be just as catastrophic as having
it not move at all because the system is busy.
Single-user, single task - As the name implies, this operating
system is designed to manage the computer so that one user
can effectively do one thing at a time. The Palm OS for Palm
handheld computers is a good example of a modern single-user,
single-task operating system.
Single-user, multi-tasking - This is the type of operating
system most people use on their desktop and laptop computers
today. Windows 98 and the MacOS are both examples of an operating
system that will let a single user have several programs in
operation at the same time. For example, it's entirely possible
for a Windows user to be writing a note in a word processor
while downloading a file from the Internet while printing
the text of an e-mail message.
Multi-user - A multi-user operating system allows many different
users to take advantage of the computer's resources simultaneously.
The operating system must make sure that the requirements
of the various users are balanced, and that each of the programs
they are using has sufficient and separate resources so that
a problem with one user doesn't affect the entire community
of users. Unix, VMS, and mainframe operating systems, such
as MVS, are examples of multi-user operating systems.
It's important to differentiate here between multi-user operating
systems and single-user operating systems that support networking.
Windows 2000 and Novell Netware can each support hundreds
or thousands of networked users, but the operating systems
themselves aren't true multi-user operating systems. The system
administrator is the only "user" for Windows 2000
or Netware. The network support and all of the remote user
logins the network enables are, in the overall plan of the
operating system, a program being run by the administrative
user.
With the different types of operating systems in mind, it's
time to look at the basic functions provided by an operating
system.
Wake-Up Call
When the power to a computer is turned on, the first program
that runs is usually a set of instructions kept in the computer's
read-only memory (ROM) that examines the system hardware to
make sure everything is functioning properly. This power-on
self test (POST) checks the CPU, memory, and basic input-output
systems (BIOS) for errors and stores the result in a special
memory location. Once the POST has successfully completed,
the software loaded in ROM (sometimes called firmware) will
begin to activate the computer's disk drives. In most modern
computers, when the computer activates the hard disk drive,
it finds the first piece of the operating system: the bootstrap
loader.
The bootstrap loader is a small program that has a single
function: It loads the operating system into memory and allows
it to begin operation. In the most basic form, the bootstrap
loader sets up the small driver programs that interface with
and control the various hardware subsystems of the computer.
It sets up the divisions of memory that hold the operating
system, user information and applications. It establishes
the data structures that will hold the myriad signals, flags
and semaphores that are used to communicate within and between
the subsystems and applications of the computer. Then it turns
control of the computer over to the operating system.
The operating system's tasks, in the most general sense,
fall into six categories:
Processor management
Memory management
Device management
Storage management
Application interface
User interface
While there are some who argue that an operating system should
do more than these six tasks, and some operating-system vendors
do build many more utility programs and auxiliary functions
into their operating systems, these six tasks define the core
of nearly all operating systems. Let's look at the tools the
operating system uses to perform each of these functions.
Processor Management
The heart of managing the processor comes down to two related
issues:
Ensuring that each process and application receives enough
of the processor's time to function properly
Using as many processor cycles for real work as is possible
The basic unit of software that the operating system deals
with in scheduling the work done by the processor is either
a process or a thread, depending on the operating system.
It's tempting to think of a process as an application, but
that gives an incomplete picture of how processes relate to
the operating system and hardware. The application you see
(word processor or spreadsheet or game) is, indeed, a process,
but that application may cause several other processes to
begin, for tasks like communications with other devices or
other computers. There are also numerous processes that run
without giving you direct evidence that they ever exist. A
process, then, is software that performs some action and can
be controlled -- by a user, by other applications or by the
operating system.
It is processes, rather than applications, that the operating
system controls and schedules for execution by the CPU. In
a single-tasking system, the schedule is straightforward.
The operating system allows the application to begin running,
suspending the execution only long enough to deal with interrupts
and user input. Interrupts are special signals sent by hardware
or software to the CPU. It's as if some part of the computer
suddenly raised its hand to ask for the CPU's attention in
a lively meeting. Sometimes the operating system will schedule
the priority of processes so that interrupts are masked --
that is, the operating system will ignore the interrupts from
some sources so that a particular job can be finished as quickly
as possible. There are some interrupts (such as those from
error conditions or problems with memory) that are so important
that they can't be ignored. These non-maskable interrupts
(NMIs) must be dealt with immediately, regardless of the other
tasks at hand.
While interrupts add some complication to the execution of
processes in a single-tasking system, the job of the operating
system becomes much more complicated in a multi-tasking system.
Now, the operating system must arrange the execution of applications
so that you believe that there are several things happening
at once. This is complicated because the CPU can only do one
thing at a time. In order to give the appearance of lots of
things happening at the same time, the operating system has
to switch between different processes thousands of times a
second. Here's how it happens.
A process occupies a certain amount of RAM. It also makes
use of registers, stacks and queues within the CPU and operating-system
memory space.
When two processes are multi-tasking, the operating system
allots a certain number of CPU execution cycles to one program.
After that number of cycles, the operating system makes copies
of all the registers, stacks and queues used by the processes,
and notes the point at which the process paused in its execution.
It then loads all the registers, stacks and queues used by
the second process and allows it a certain number of CPU cycles.
When those are complete, it makes copies of all the registers,
stacks and queues used by the second program, and loads the
first program.
All of the information needed to keep track of a process when
switching is kept in a data package called a process control
block. The process control block typically contains:
An ID number that identifies the process
Pointers to the locations in the program and its data where
processing last occurred
Register contents
States of various flags and switches
Pointers to the upper and lower bounds of the memory required
for the process
A list of files opened by the process
The priority of the process
The status of all I/O devices needed by the process
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 come, though,
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.
Even 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.
Memory and Storage Management
When an operating system manages the computer's memory, there
are two broad tasks to be accomplished:
Each process must have enough memory in which to execute,
and it can neither run into the memory space of another process
nor be run into by another process.
The different types of memory in the system must be used properly
so that each process can run most effectively.
The first task requires the operating system to set up memory
boundaries for types of software and for individual applications.
As an example, let's look at an imaginary system with 1 megabyte
(1,000 kilobytes) of RAM. During the boot process, the operating
system of our imaginary computer is designed to go to the
top of available memory and then "back up" far enough
to meet the needs of the operating system itself. Let's say
that the operating system needs 300 kilobytes to run. Now,
the operating system goes to the bottom of the pool of RAM
and starts building up with the various driver software required
to control the hardware subsystems of the computer. In our
imaginary computer, the drivers take up 200 kilobytes. So
after getting the operating system completely loaded, there
are 500 kilobytes remaining for application processes.
When applications begin to be loaded into memory, they are
loaded in block sizes determined by the operating system.
If the block size is 2 kilobytes, then every process that
is loaded will be given a chunk of memory that is a multiple
of 2 kilobytes in size. Applications will be loaded in these
fixed block sizes, with the blocks starting and ending on
boundaries established by words of 4 or 8 bytes. These blocks
and boundaries help to ensure that applications won't be loaded
on top of one another's space by a poorly calculated bit or
two. With that ensured, the larger question is what to do
when the 500-kilobyte application space is filled.
In most computers, it's possible to add memory beyond the
original capacity. For example, you might expand RAM from
1 to 2 megabytes. This works fine, but tends to be relatively
expensive. It also ignores a fundamental fact of computing
-- most of the information that an application stores in memory
is not being used at any given moment. A processor can only
access memory one location at a time, so the vast majority
of RAM is unused at any moment. Since disk space is cheap
compared to RAM, then moving information in RAM to hard disk
can greatly expand RAM space at no cost. This technique is
called virtual memory management.
Disk storage is only one of the memory types that must be
managed by the operating system, and is the slowest. Ranked
in order of speed, the types of memory in a computer system
are:
High-speed cache - This is fast, relatively small amounts
of memory that are available to the CPU through the fastest
connections. Cache controllers predict which pieces of data
the CPU will need next and pull it from main memory into high-speed
cache to speed up system performance.
Main memory - This is the RAM that you see measured in megabytes
when you buy a computer.
Secondary memory - This is most often some sort of rotating
magnetic storage that keeps applications and data available
to be used, and serves as virtual RAM under the control of
the operating system.
The operating system must balance the needs of the various
processes with the availability of the different types of
memory, moving data in blocks (called pages) between available
memory as the schedule of processes dictates.
Device Management
The path between the operating system and virtually all hardware
not on the computer's motherboard goes through a special program
called a driver. Much of a driver's function is to be the
translator between the electrical signals of the hardware
subsystems and the high-level programming languages of the
operating system and application programs. Drivers take data
that the operating system has defined as a file and translate
them into streams of bits placed in specific locations on
storage devices, or a series of laser pulses in a printer.
Because there are such wide differences in the hardware controlled
through drivers, there are differences in the way that the
driver programs function, but most are run when the device
is required, and function much the same as any other process.
The operating system will frequently assign high-priority
blocks to drivers so that the hardware resource can be released
and readied for further use as quickly as possible.
One reason that drivers are separate from the operating system
is so that new functions can be added to the driver -- and
thus to the hardware subsystems -- without requiring the operating
system itself to be modified, recompiled and redistributed.
Through the development of new hardware device drivers, development
often performed or paid for by the manufacturer of the subsystems
rather than the publisher of the operating system, input/output
capabilities of the overall system can be greatly enhanced.
Managing input and output is largely a matter of managing
queues and buffers, special storage facilities that take a
stream of bits from a device, perhaps a keyboard or a serial
port, hold those bits, and release them to the CPU at a rate
slow enough for the CPU to cope with. This function is especially
important when a number of processes are running and taking
up processor time. The operating system will instruct a buffer
to continue taking input from the device, but to stop sending
data to the CPU while the process using the input is suspended.
Then, when the process needing input is made active once again,
the operating system will command the buffer to send data.
This process allows a keyboard or a modem to deal with external
users or computers at a high speed even though there are times
when the CPU can't use input from those sources.
Managing all the resources of the computer system is a large
part of the operating system's function and, in the case of
real-time operating systems, may be virtually all the functionality
required. For other operating systems, though, providing a
relatively simple, consistent way for applications and humans
to use the power of the hardware is a crucial part of their
reason for existing.
|