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.
In this article, we'll tell you what a piece
of software must do to be called an operating
system, and show you how the operating system
works to turn a collection of hardware into a
powerful computing tool!
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.
Interface to the
World
Application Interface
Just as drivers provide a way for applications
to make use of hardware subsystems without having
to know every detail of the hardware's operation,
application program interfaces (APIs) let
application programmers use functions of the computer
and operating system without having to directly
keep track of all the details in the CPU's operation.
Let's look at the example of creating a hard disk
file for holding data to see why this can be important.
A programmer writing an application to record
data from a scientific instrument might want to
allow the scientist to specify the name of the
file created. The operating system might provide
an API function named MakeFile for creating
files. When writing the program, the programmer
would insert a line that looks like this:
MakeFile [1, %Name, 2]
In this example, the instruction tells the operating
system to create a file that will allow random
access to its data (1), will have a name typed
in by the user (%Name), and will be a size that
varies depending on how much data is stored in
the file (2). Now, let's look at what the operating
system does to turn the instruction into action.
The operating system sends a query to the
disk drive to get the location of the first
available free storage location.
With that information, the operating system
creates an entry in the file system showing
the beginning and ending locations of the file,
the name of the file, the file type, whether
the file has been archived, which users have
permission to look at or modify the file, and
the date and time of the file's creation.
The operating system writes information at
the beginning of the file that identifies the
file, sets up the type of access possible and
includes other information that ties the file
to the application.
In all of this information, the queries
to the disk drive and addresses of the beginning
and ending point of the file are in formats
heavily dependent on the manufacturer and
model of the disk drive.
Because the programmer has written her program
to use the API for disk storage, she doesn't have
to keep up with the instruction codes, data types,
and response codes for every possible hard disk
and tape drive. The operating system, connected
to drivers for the various hardware subsystems,
deals with the changing details of the hardware
-- the programmer must simply write code for the
API and trust the operating system to do the rest.
APIs have become one of the most hotly contested
areas of the computer industry in recent years.
Companies realize that programmers using their
API will ultimately translate into the ability
to control and profit from a particular part of
the industry. This is one of the reasons that
so many companies have been willing to provide
applications like readers or viewers to the public
at no charge. They know consumers will request
that programs take advantage of the free readers,
and application companies will be ready to pay
royalties to allow their software to provide the
functions requested by the consumers.
User Interface
Just as the API provides a consistent way for
applications to use the resources of the computer
system, a user interface (UI) brings structure
to the interaction between a user and the computer.
In the last decade, almost all development in
user interfaces has been in the area of the graphical
user interface (GUI), with two models, Apple's
Macintosh and Microsoft's Windows, receiving most
of the attention and gaining most of the market
share. The popular, open-source Linux operating
system also supports a graphical user interface.
There are other user interfaces, some graphical
and some not, for other operating systems.
Unix, for example, has user interfaces called
shells that present a user interface more
flexible and powerful than the standard operating
system text-based interface. Programs such as
the Korn Shell and the C Shell are text-based
interfaces that add important utilities, but their
main purpose is to make it easier for the user
to manipulate the functions of the operating system.
There are also graphical user interfaces, such
as X-Windows and Gnome, that make Unix and Linux
more like Windows and Macintosh computers from
the user's point of view.
It's important to remember that in all of these
examples, the user interface is a program or set
of programs that sits as a layer above the operating
system itself. The same thing is true, with somewhat
different mechanisms, of both Windows and Macintosh
operating systems. The core operating-system functions,
the management of the computer system, lie in
the kernel of the operating system. The
display manager is separate, though it
may be tied tightly to the kernel beneath. The
ties between the operating-system kernel and the
user interface, utilities and other software define
many of the differences in operating systems today,
and will further define them in the future.
The Future
One question concerning the future of operating
systems revolves around the ability of a particular
philosophy of software distribution to create
an operating system useable by corporations and
consumers together.
Linux, the operating system created and distributed
according to the principles of open
source, could have a significant impact
on the operating system in general. Most operating
systems, drivers and utility programs are written
by commercial organizations that distribute executable
versions of their software -- versions that can't
be studied or altered. Open source requires the
distribution of original source materials that can
be studied, altered and built upon, with the results
once again freely distributed.
The continuing growth of the Internet and the
proliferation of computers that aren't standard
desktop or laptop machines means that operating
systems will change to keep pace, but the core
management and interface functions will continue,
even as they evolve.