Unit 1 Operating System: An: Structure Nos
Unit 1 Operating System: An: Structure Nos
Unit 1 Operating System: An: Structure Nos
OVERVIEW
Structure Page Nos.
1.0 Introduction 5
1.1 Objectives 6
1.2 What is an Operating System? 6
1.3 Goals of an Operating System 8
1.4 Generations of Operating Systems 8
1.4.1 0th Generation
1.4.2 First Generation (1951-1956)
1.4.3 Second Generation (1956-1964)
1.4.4 Third Generation (1964-1979)
1.4.5 Fourth Generation (1979-Present)
1.5 Types of Operating Systems 13
1.5.1 Batch Processing Operating System
1.5.2 Time Sharing
1.5.3 Real Time Operating System (RTOS)
1.5.4 Multiprogramming Operating System
1.5.5 Multiprocessing System
1.5.6 Networking Operating System
1.5.7 Distributed Operating System
1.5.8 Operating Systems for Embedded Devices
1.6 Desirable Qualities of OS 16
1.7 Operating Systems : Some Examples 16
1.7.1 DOS
1.7.2 UNIX
1.7.3 Windows
1.7.4 Macintosh
1.8 Functions of OS 18
1.8.1 Process Management
1.8.2 Memory Management
1.8.3 Secondary Storage Management
1.8.4 I/O Management
1.8.5 File Management
1.8.6 Protection
1.8.7 Networking
1.8.8 Command Interpretation
1.9 Summary 22
1.10 Solutions/Answers 22
1.11 Further Readings 24
1.0 INTRODUCTION
Computer software can be divided into two main categories: application software and
system software. Application software consists of the programs for performing tasks
particular to the machine’s utilisation. This software is designed to solve a particular
problem for users. Examples of application software include spreadsheets, database
systems, desktop publishing systems, program development software, and games.
On the other hand, system software is more transparent and less noticed by the typical
computer user. This software provides a general programming environment in which
programmers can create specific applications to suit their needs. This environment
provides new functions that are not available at the hardware level and performs tasks
5
Introduction to Operating related to executing the application program. System software acts as an interface
Systems and Process
Management
between the hardware of the computer and the application software that users need to
run on the computer. The most important type of system software is the operating
system.
An Operating System (OS) is a collection of programs that acts as an interface
between a user of a computer and the computer hardware. The purpose of an operating
system is to provide an environment in which a user may execute the programs.
Operating Systems are viewed as resource managers. The main resource is the
computer hardware in the form of processors, storage, input/output devices,
communication devices, and data. Some of the operating system functions are:
implementing the user interface, sharing hardware among users, allowing users to
share data among themselves, preventing users from interfering with one another,
scheduling resources among users, facilitating input/output, recovering from errors,
accounting for resource usage, facilitating parallel operations, organising data for
secure and rapid access, and handling network communications.
This unit presents the definition of the operating system, goals of the operating
system, generations of OS, different types of OS and functions of OS.
1.1 OBJECTIVES
After going through this unit, you should be able to:
• understand the purpose of an operating system;
• describe the general goals of an operating system;
• discuss the evolution of operating systems;
• describe various functions performed by the OS;
• list, discuss and compare various types of OS, and
• describe various structures of operating system.
• To control the allocation and use of the computing system’s resources among
the various users and tasks, and
• Assure that when there are several active processes in the computer, each will
get fair and non-interfering access to the central processing unit for execution.
• Provide for long term storage of user information in the form of files.
The abstract view of the components of a computer system and the positioning of OS
is shown in the Figure 1.
The spooling operating system in fact had multiprogramming since more than one
program was resident in main storage at the same time. Later this basic idea of
multiprogramming was extended to include more than one active user program in
memory at time. To accommodate this extension, both the scheduler and the
dispatcher were enhanced. The scheduler became able to manage the diverse resource
needs of the several concurrently active used programs, and the dispatcher included
policies for allocating processor resources among the competing user programs. In
addition, memory management became more sophisticated in order to assure that the
program code for each job or at least that part of the code being executed, was resident
in main storage.
• The availability of storage protection hardware to ensure that user jobs are
protected from one another and that the operating system itself is protected
from user programs.
12
The third generation was an exciting time, indeed, for the development of both Operating System :
computer hardware and the accompanying operating system. During this period, the An Overview
topic of operating systems became, in reality, a major element of the discipline of
computing.
In this section we will discuss about the different types of operating systems. Also
study the types of operating systems from Unit 2 in Block 1 of MCS-022 (Operating
System Concepts and Networking Management).
Modern computer operating systems may be classified into three groups, which are
distinguished by the nature of interaction that takes place between the computer user
and his or her program during its processing. The three groups are called batch, time-
sharing and real-time operating systems.
13
Introduction to Operating
Systems and Process
1.5.1 Batch Processing Operating System
Management In a batch processing operating system environment users submit jobs to a central
place where these jobs are collected into a batch, and subsequently placed on an input
queue at the computer where they will be run. In this case, the user has no interaction
with the job during its processing, and the computer’s response time is the turnaround
timethe time from submission of the job until execution is complete, and the results
are ready for return to the person who submitted the job.
1.5.2 Time Sharing
Another mode for delivering computing services is provided by time sharing operating
systems. In this environment a computer provides computing services to several or
many users concurrently on-line. Here, the various users are sharing the central
processor, the memory, and other resources of the computer system in a manner
facilitated, controlled, and monitored by the operating system. The user, in this
environment, has nearly full interaction with the program during its execution, and the
computer’s response time may be expected to be no more than a few second.
1.5.3 Real Time Operating System (RTOS)
The third class is the real time operating systems, which are designed to service those
applications where response time is of the essence in order to prevent error,
misrepresentation or even disaster. Examples of real time operating systems are those
which handle airlines reservations, machine tool control, and monitoring of a nuclear
power station. The systems, in this case, are designed to be interrupted by external
signals that require the immediate attention of the computer system.
These 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. 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.
A number of other definitions are important to gain an understanding of operating
systems:
1.5.4 Multiprogramming Operating System
A multiprogramming operating system is a system that allows more than one active
user program (or part of user program) to be stored in main memory simultaneously.
Thus, it is evident that a time-sharing system is a multiprogramming system, but note
that a multiprogramming system is not necessarily a time-sharing system. A batch or
real time operating system could, and indeed usually does, have more than one active
user program simultaneously in main storage. Another important, and all too similar,
term is “multiprocessing”.
1.5.5 Multiprocessing System
A multiprocessing system is a computer hardware configuration that includes more
than one independent processing unit. The term multiprocessing is generally used to
refer to large computer hardware complexes found in major scientific or commercial
applications. More on multiprocessor system can be studied in Unit-1 of Block-3 of
this course.
1.5.6 Networking Operating System
A networked computing system is a collection of physical interconnected computers.
The operating system of each of the interconnected computers must contain, in
addition to its own stand-alone functionality, provisions for handing communication
14
and transfer of program and data among the other computers with which it is Operating System :
connected. An Overview
Network operating systems are not fundamentally different from single processor
operating systems. They obviously need a network interface controller and some low-
level software to drive it, as well as programs to achieve remote login and remote files
access, but these additions do not change the essential structure of the operating
systems.
True distributed operating systems require more than just adding a little code to a uni-
processor operating system, because distributed and centralised systems differ in
critical ways. Distributed systems, for example, often allow program to run on several
processors at the same time, thus requiring more complex processor scheduling
algorithms in order to optimise the amount of parallelism achieved. More on
distributed systems can be studied in Unit-2 of Block-3 of this course.
• Sun’s Java OS - a standalone virtual machine not running on top of any other
OS; mainly targeted at embedded systems.
• Palm Computing’s Palm OS - Currently the leader OS for PDAs, has many
applications and supporting companies.
Let us study various examples of the popular operating systems in the next section.
• Please go through the various Views and Structure of operating system from
Unit 2 in Block 1 of MCS-022 (Operating System Concepts and Networking
Management).
15
Introduction to Operating
Systems and Process
Management
1.6 DESIRABLE QUALITIES OF OS
The desirable qualities of an operating system are in terms of: Usability, Facilities,
Cost, and Adaptability.
• Usability:
• Robustness
• Accept all valid inputs and can handle them.
• Consistency
• Proportionality
• Convenience
• Powerful with high level facilities.
• Facilities:
• Sufficient for intended use
• Complete
• Appropriate.
• Costs:
• Want low cost and efficient services.
• Good algorithms.
Make use of space/time tradeoffs, special hardware.
• Low overhead.
Cost of doing nothing should be low. E.g., idle time at a terminal.
• Low maintenance cost.
System should not require constant attention.
• Adaptability:
• Tailored to the environment.
Support necessary activities. Do not impose unnecessary restrictions.
What are the things people do most -- make them easy.
• Changeable over time.
Adapt as needs and resources change. e.g., expanding memory and new
devices, or new user population.
• Extendible-Extensible
Adding new facilities and features - which look like the old ones.
1.7.3 WINDOWS
Windows is a personal computer operating system from Microsoft that, together with
some commonly used business applications such as Microsoft Word and Excel, has
become a de facto “standard” for individual users in most corporations as well as in
most homes. Windows contains built-in networking, which allows users to share files
and applications with each other if their PC’s are connected to a network. In large
enterprises, Windows clients are often connected to a network of UNIX and NetWare
servers. The server versions of Windows NT and 2000 are gaining market share,
providing a Windows-only solution for both the client and server. Windows is
supported by Microsoft, the largest software company in the world, as well as the
Windows industry at large, which includes tens of thousands of software developers.
This networking support is the reason why Windows became successful in the first
place. However, Windows 95, 98, ME, NT, 2000 and XP are complicated operating
environments. Certain combinations of hardware and software running together can
cause problems, and troubleshooting can be daunting. Each new version of Windows
has interface changes that constantly confuse users and keep support people busy, and
Installing Windows applications is problematic too. Microsoft has worked hard to
make Windows 2000 and Windows XP more resilient to installation of problems and
crashes in general. More details on Windows 2000 can be studied in Unit-4 of
Block -3 of this course.
1.7.4 MACINTOSH
The Macintosh (often called “the Mac”), introduced in 1984 by Apple Computer, was
the first widely-sold personal computer with a graphical user interface (GUI). The
Mac was designed to provide users with a natural, intuitively understandable, and, in
general, “user-friendly” computer interface. This includes the mouse, the use of icons
or small visual images to represent objects or actions, the point-and-click and click-
and-drag actions, and a number of window operation ideas. Microsoft was successful
in adapting user interface concepts first made popular by the Mac in its first Windows
operating system. The primary disadvantage of the Mac is that there are fewer Mac
applications on the market than for Windows. However, all the fundamental
applications are available, and the Macintosh is a perfectly useful machine for almost
17
Introduction to Operating everybody. Data compatibility between Windows and Mac is an issue, although it is
Systems and Process
Management
often overblown and readily solved.
The Macintosh has its own operating system, Mac OS which, in its latest version is
called Mac OS X. Originally built on Motorola’s 68000 series microprocessors, Mac
versions today are powered by the PowerPC microprocessor, which was developed
jointly by Apple, Motorola, and IBM. While Mac users represent only about 5% of the
total numbers of personal computer users, Macs are highly popular and almost a
cultural necessity among graphic designers and online visual artists and the companies
they work for.
In this section we will discuss some services of the operating system used by its users.
Users of operating system can be divided into two broad classes: command language
users and system call users. Command language users are those who can interact with
operating systems using the commands. On the other hand system call users invoke
services of the operating system by means of run time system calls during the
execution of programs.
1.8 FUNCTIONS OF OS
The main functions of an operating system are as follows:
• Process Management
• Memory Management
• Secondary Storage Management
• I/O Management
• File Management
• Protection
• Networking Management
• Command Interpretation.
1.8.1 Process Management
The CPU executes a large number of programs. While its main concern is the
execution of user programs, the CPU is also needed for other system activities. These
activities are called processes. A process is a program in execution. Typically, a batch
job is a process. A time-shared user program is a process. A system task, such as
spooling, is also a process. For now, a process may be considered as a job or a time-
shared program, but the concept is actually more general.
18
The operating system is responsible for the following activities in connection with Operating System :
processes management: An Overview
• Storage allocation
• Disk scheduling.
More details can be studied in Unit-3 of Block-2 of this course.
19
Introduction to Operating
Systems and Process
1.8.4 I/O Management
Management One of the purposes of an operating system is to hide the peculiarities or specific
hardware devices from the user. For example, in UNIX, the peculiarities of I/O
devices are hidden from the bulk of the operating system itself by the I/O system. The
operating system is responsible for the following activities in connection to I/O
management:
• A buffer caching system
• To activate a general device driver code
• To run the driver software for specific hardware devices as and when required.
1.8.6 Protection
The various processes in an operating system must be protected from each other’s
activities. For that purpose, various mechanisms which can be used to ensure that the
files, memory segment, CPU and other resources can be operated on only by those
processes that have gained proper authorisation from the operating system.
For example, memory addressing hardware ensures that a process can only execute
within its own address space. The timer ensures that no process can gain control of the
CPU without relinquishing it. Finally, no process is allowed to do its own I/O, to
protect the integrity of the various peripheral devices. Protection refers to a
mechanism for controlling the access of programs, processes, or users to the resources
defined by a computer controls to be imposed, together with some means of
enforcement.
20
Protection can improve reliability by detecting latent errors at the interfaces between Operating System :
component subsystems. Early detection of interface errors can often prevent An Overview
contamination of a healthy subsystem by a subsystem that is malfunctioning. An
unprotected resource cannot defend against use (or misuse) by an unauthorised or
incompetent user. More on protection and security can be studied in Unit-4 of
Block-3.
1.8.7 Networking
A distributed system is a collection of processors that do not share memory or a clock.
Instead, each processor has its own local memory, and the processors communicate
with each other through various communication lines, such as high speed buses or
telephone lines. Distributed systems vary in size and function. They may involve
microprocessors, workstations, minicomputers, and large general purpose computer
systems.
The processors in the system are connected through a communication network, which
can be configured in the number of different ways. The network may be fully or
partially connected. The communication network design must consider routing and
connection strategies and the problems of connection and security.
A distributed system provides the user with access to the various resources the system
maintains. Access to a shared resource allows computation speed-up, data availability,
and reliability.
1.8.8 Command Interpretation
One of the most important components of an operating system is its command
interpreter. The command interpreter is the primary interface between the user and the
rest of the system.
Many commands are given to the operating system by control statements. When a
new job is started in a batch system or when a user logs-in to a time-shared system, a
program which reads and interprets control statements is automatically executed. This
program is variously called (1) the control card interpreter, (2) the command line
interpreter, (3) the shell (in Unix), and so on. Its function is quite simple: get the next
command statement, and execute it.
The command statements themselves deal with process management, I/O handling,
secondary storage management, main memory management, file system access,
protection, and networking.
The Figure 2 depicts the role of the operating system in coordinating all the functions.
I/O
Management Protection & File
Security Management
Process Secondary
Management Storage
Management
Operating System
Communication
Management Memory
User Management
Interface Networking
21
Introduction to Operating
Systems and Process ) Check Your Progress 3
Management
1) Mention the advantages and limitations of Multiuser Operating Systems
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
2) What is a Multitasking system and mention its advantages.
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
3) Illustrate a simple operating system for a security control system.
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
1.9 SUMMARY
This Unit presented the principle operation of an operating system. In this unit we had
briefly described about the history, the generations and the types of operating systems.
An operating system is a program that acts as an interface between a user of a
computer and the computer hardware. The purpose of an operating system is to
provide an environment in which a user may execute programs. The primary goal of
an operating system is to make the computer convenient to use. And the secondary
goal is to use the hardware in an efficient manner.
Operating systems may be classified by both how many tasks they can perform
“simultaneously” and by how many users can be using the system “simultaneously”.
That is: single-user or multi-user and single-task or multi-tasking. A multi-user system
must clearly be multi-tasking. In the next unit we will discuss the concept of processes
and their management by the OS.
1.10 SOLUTIONS/ANSWERS
Check Your Progress 1
1) The most important type of system software is the operating system. An
operating system has three main responsibilities:
• Ensure that different programs and users running at the same time do not
interfere with each other.
As a virtual machine:
• Operating system provides a “new” machine.
One limitation with multi-user computer systems is that as more users access
it, the performance becomes slower and slower. Another limitation is the cost
23
Introduction to Operating of hardware, as a multi-user operating system requires a lot of disk space and
Systems and Process
Management
memory. In addition, the actual software for multi-user operating systems
tend to cost more than single-user operating systems.
2) A multi-tasking operating system provides the ability to run more than one
program at once. For example, a user could be running a word processing
package, printing a document, copying files to the floppy disk and backing up
selected files to a tape unit. Each of these tasks the user is doing appears to be
running at the same time.
A multi-tasking operating system has the advantage of letting the user run
more than one task at once, so this leads to increased productivity. The
disadvantage is that more programs that are run by the user, the more memory
is required.
24
Processes
UNIT 2 PROCESSES
Structure Page Nos.
2.0 Introduction 25
2.1 Objectives 26
2.2 The Concept of Process 26
2.2.1 Implicit and Explicit Tasking
2.2.2 Processes Relationship
2.2.3 Process States
2.2.4 Implementation of Processes
2.2.5 Process Hierarchy
2.2.6 Threads
2.2.7 Levels of Threads
2.3 System Calls for Process Management 34
2.4 Process Scheduling 35
2.4.1 Scheduling Objectives
2.4.2 Types of Schedulers
2.4.3 Scheduling Criteria
2.5 Scheduling Algorithms 38
2.5.1 First Come First Serve (FCFS)
2.5.2 Shortest Job First (SJF)
2.5.3 Round Robin (RR)
2.5.4 Shortest Remaining Time Next (SRTN)
2.5.5 Priority Based Scheduling or Event Driven (ED) Scheduling
2.6 Performance Evaluation of the Scheduling Algorithms 43
2.7 Summary 45
2.8 Solutions/Answers 45
2.9 Further Readings 48
2.0 INTRODUCTION
In the earlier unit we have studied the overview and the functions of an operating
system. In this unit we will have detailed discussion on the processes and their
management by the operating system. The other resource management features of
operating systems will be discussed in the subsequent units.
The CPU executes a large number of programs. While its main concern is the
execution of user programs, the CPU is also needed for other system activities. These
activities are called processes. A process is a program in execution. Typically, a batch
job is a process. A time-shared user program is a process. A system task, such as
spooling, is also a process. For now, a process may be considered as a job or a
time-shared program, but the concept is actually more general.
In general, a process will need certain resources such as CPU time, memory, files, I/O
devices, etc., to accomplish its task. These resources are given to the process when it
is created. In addition to the various physical and logical resources that a process
obtains when it is created, some initialisation data (input) may be passed along. For
example, a process whose function is to display the status of a file, say F1, on the
screen, will get the name of the file F1 as an input and execute the appropriate
program to obtain the desired information.
We emphasize that a program by itself is not a process; a program is a passive entity,
while a process is an active entity. It is known that two processes may be associated
with the same program; they are nevertheless considered two separate execution
sequences.
A process is the unit of work in a system. Such a system consists of a collection of
processes, some of which are operating system processes, those that execute system
25
Introduction to Operating code, and the rest being user processes, those that execute user code. All of those
Systems and Process
Management
processes can potentially execute concurrently.
The operating system is responsible for the following activities in connection with
processes managed.
• The creation and deletion of both user and system processes;
• The suspension is resumption of processes;
• The provision of mechanisms for process synchronization, and
• The provision of mechanisms for deadlock handling.
We will learn the operating system view of the processes, types of schedulers,
different types of scheduling algorithms, in the subsequent sections of this unit.
2.1 OBJECTIVES
After going through this unit, you should be able to:
• understand the concepts of process, various states in the process and their
scheduling;
• define a process control block;
• classify different types of schedulers;
• understand various types of scheduling algorithms, and
• compare the performance evaluation of the scheduling algorithms.
Explicit tasking means that programs explicitly define each process and some of its
attributes. To improve the performance, a single logical application is divided into
various related processes. Explicit tasking is used in situations where high
performance in desired system programs such as parts of the operating system and real
time applications are common examples of programs defined processes. After
dividing process into several independent processes, a system programs defines the
confines of each individual process. A parent process is then commonly added to
create the environment for and to control execution of individual processes.
27
Introduction to Operating Common reasons for and uses of explicit tasking include:
Systems and Process
Management • Speedup: Explicit tasking can result in faster execution of applications.
• Driving I/O devices that have latency: While one task is waiting for I/O to
complete, another portion of the application can make progress towards
completion if it contains other tasks that can do useful work in the interim.
• User convenience: By creating tasks to handle individual actions, a graphical
interface can allow users to launch several operations concurrently by clicking
on action icons before completion of previous commands.
• Multiprocessing and multicomputing: A program coded as a collection of
tasks can be relatively easily posted to a multiprocessor system, where
individual tasks may be executed on different processors in parallel.
Distributed computing network server can handle multiple concurrent client sessions
by dedicating an individual task to each active client session.
2.2.2 Processes Relationship
In the concurrent environment basically processes have two relationships, competition
and cooperation. In the concurrent environment, processes compete with each other
for allocation of system resources to execute their instructions. In addition, a
collection of related processes that collectively represent a single logical application
cooperate with each other. There should be a proper operating system to support these
relations. In the competition, there should be proper resource allocation and protection
in address generation.
We distinguish between independent process and cooperating process. A process is
independent if it cannot affect or be affected by other processes executing in the
system.
Independent process: These type of processes have following features:
• Their state is not shared in any way by any other process.
• Their execution is deterministic, i.e., the results of execution depend only on the
input values.
• Their execution is reproducible, i.e., the results of execution will always be the
same for the same input.
• Their execution can be stopped and restarted without any negative effect.
Cooperating process: In contrast to independent processes, cooperating processes can
affect or be affected by other processes executing the system. They are characterised
by:
The transition of the process states are shown in Figure 1.and their corresponding
transition are described below:
Context Switch
A context switch (also sometimes referred to as a process switch or a task switch) is
the switching of the CPU (central processing unit) from one process or to another.
A context is the contents of a CPU's registers and program counter at any point in
time.
30
A context switch is sometimes described as the kernel suspending execution of one Processes
process on the CPU and resuming execution of some other process that had previously
been suspended.
Context Switch: Steps
In a context switch, the state of the first process must be saved somehow, so that,
when the scheduler gets back to the execution of the first process, it can restore this
state and continue normally.
The state of the process includes all the registers that the process may be using,
especially the program counter, plus any other operating system specific data that may
be necessary. Often, all the data that is necessary for state is stored in one data
structure, called a process control block (PCB). Now, in order to switch processes, the
PCB for the first process must be created and saved. The PCBs are sometimes stored
upon a per-process stack in the kernel memory, or there may be some specific
operating system defined data structure for this information.
Let us understand with the help of an example. Suppose if two processes A and B are
in ready queue. If CPU is executing Process A and Process B is in wait state. If an
interrupt occurs for Process A, the operating system suspends the execution of the first
process, and stores the current information of Process A in its PCB and context to the
second process namely Process B. In doing so, the program counter from the PCB of
Process B is loaded, and thus execution can continue with the new process. The
switching between two processes, Process A and Process B is illustrated in the
Figure 3 given below:
31
Introduction to Operating A parent process can terminate the execution of one of its children for one of these
Systems and Process
Management
reasons:
• The child process has exceeded its usage of the resources it has been
allocated. In order to do this, a mechanism must be available to allow the
parent process to inspect the state of its children processes.
Old or primitive operating system like MS-DOS are not multiprogrammed so when
one process starts another, the first process is automatically blocked and waits until
the second is finished.
2.2.6 Threads
Threads, sometimes called lightweight processes (LWPs) are independently scheduled
parts of a single program. We say that a task is multithreaded if it is composed of
several independent sub-processes which do work on common data, and if each of
those pieces could (at least in principle) run in parallel.
If we write a program which uses threads – there is only one program, one executable
file, one task in the normal sense. Threads simply enable us to split up that program
into logically separate pieces, and have the pieces run independently of one another,
until they need to communicate. In a sense, threads are a further level of object
orientation for multitasking systems. They allow certain functions to be executed in
parallel with others.
On a truly parallel computer (several CPUs) we might imagine parts of a program
(different subroutines) running on quite different processors, until they need to
communicate. When one part of the program needs to send data to the other part, the
two independent pieces must be synchronized, or be made to wait for one another. But
what is the point of this? We can always run independent procedures in a program as
separate programs, using the process mechanisms we have already introduced. They
could communicate using normal interprocesses communication. Why introduce
another new concept? Why do we need threads?
The point is that threads are cheaper than normal processes, and that they can be
scheduled for execution in a user-dependent way, with less overhead. Threads are
32
cheaper than a whole process because they do not have a full set of resources each. Processes
Whereas the process control block for a heavyweight process is large and costly to
context switch, the PCBs for threads are much smaller, since each thread has only a
stack and some registers to manage. It has no open file lists or resource lists, no
accounting structures to update. All of these resources are shared by all threads within
the process. Threads can be assigned priorities – a higher priority thread will get put to
the front of the queue. Let’s define heavy and lightweight processes with the help of a
table.
Object Resources
Thread (Light Weight Processes) Stack, set of CPU registers, CPU time
Task (Heavy Weight Processes) 1 thread, PCB, Program code, memory
segment etc.
Multithreaded task n- threads, PCB, Program code, memory
segment etc.
Why use threads?
The sharing of resources can be made more effective if the scheduler knows known
exactly what each program was going to do in advance. Of course, the scheduling
algorithm can never know this – but the programmer who wrote the program does
know. Using threads it is possible to organise the execution of a program in such a
way that something is always being done, whenever the scheduler gives the
heavyweight process CPU time.
33
Introduction to Operating • Solaris 2 (user and system level)
Systems and Process
Management • OS/2 (system level only)
• NT threads (user and system level)
• IRIX threads
• POSIX standardized user threads interface.
1) Explain the difference between a process and a thread with some examples.
……………………………………………………………………………..
…………..…………………………………………………………………
……………………………………………………………………………..
2) Identify the different states a live process may occupy and show how a process
moves between these states.
……………………………………………………………………………………
…..………………………………………………………………………………
…………………………………………………………………………………..
3) Define what is meant by a context switch. Explain the reason many systems use
two levels of scheduling.
……………………………………………………………………………………
…..………………………………………………………………………………..
……………………………………………………………………………………
34
Create: In response to the create call the operating system creates a new process with Processes
the specified or default attributes and identifier. Some of the parameters definable at
the process creation time include:
• level of privilege, such as system or user
• priority
• size and memory requirements
• maximum data area and/or stack size
• memory protection information and access rights
• other system dependent data.
Delete: The delete service is also called destroy, terminate or exit. Its execution
causes the operating system to destroy the designated process and remove it from the
system.
Abort: It is used to terminate the process forcibly. Although a process could
conceivably abort itself, the most frequent use of this call is for involuntary
terminations, such as removal of malfunctioning process from the system.
Fork/Join: Another method of process creation and termination is by means of
FORK/JOIN pair, originally introduced as primitives for multiprocessor system. The
FORK operations are used to split a sequence of instruction into two concurrently
executable sequences. JOIN is used to merge the two sequences of code divided by
the FORK and it is available to a parent process for synchronization with a child.
Suspend: The suspend system call is also called BLOCK in some systems. The
designated process is suspended indefinitely and placed in the suspend state. A
process may be suspended itself or another process when authorised to do so.
Resume: The resume system call is also called WAKEUP in some systems. This call
resumes the target process, which is presumably suspended. Obviously a suspended
process can not resume itself because a process must be running to have its operating
system call processed. So a suspended process depends on a partner process to issue
the resume.
Delay: The system call delay is also known as SLEEP. The target process is
suspended for the duration of the specified time period. The time may be expressed in
terms of system clock ticks that are system dependent and not portable or in standard
time units such as seconds and minutes. A process may delay itself or optionally,
delay some other process.
Get_Attributes: It is an enquiry to which the operating system responds by providing
the current values of the process attributes, or their specified subset, from the PCB.
Change Priority: It is an instance of a more general SET-PROCESS-ATTRIBUTES
system call. Obviously, this call is not implemented in systems where process priority
is static.
Short term scheduler: The short-term scheduler selects the process for the processor
among the processes which are already in queue (in memory). The scheduler will
execute quite frequently (mostly at least once every 10 milliseconds). It has to be very
fast in order to achieve a better processor utilisation. The short term scheduler, like all
other OS programs, has to execute on the processor. If it takes 1 millisecond to choose
a process that means ( 1 / ( 10 + 1 )) = 9% of the processor time is being used for short
time scheduling and only 91% may be used by processes for execution.
36
Long term scheduler: The long-term scheduler selects processes from the process Processes
pool and loads selected processes into memory for execution. The long-term scheduler
executes much less frequently when compared with the short term scheduler. It
controls the degree of multiprogramming (no. of processes in memory at a time). If
the degree of multiprogramming is to be kept stable (say 10 processes at a time), the
long-term scheduler may only need to be invoked till the process finishes execution.
The long-term scheduler must select a good process mix of I/O-bound and processor
bound processes. If most of the processes selected are I/O-bound, then the ready
queue will almost be empty, while the device queue(s) will be very crowded. If most
of the processes are processor-bound, then the device queue(s) will almost be empty
while the ready queue is very crowded and that will cause the short-term scheduler to
be invoked very frequently. Time-sharing systems (mostly) have no long-term
scheduler. The stability of these systems either depends upon a physical limitation
(no. of available terminals) or the self-adjusting nature of users (if you can’t get
response, you quit). It can sometimes be good to reduce the degree of
multiprogramming by removing processes from memory and storing them on disk.
These processes can then be reintroduced into memory by the medium-term
scheduler. This operation is also known as swapping. Swapping may be necessary to
improve the process mix or to free memory.
37
Introduction to Operating Waiting time = Turnaround Time - Processing Time
Systems and Process
Management But the scheduling algorithm affects or considers the amount of time that a process
spends waiting in a ready queue. Thus rather than looking at turnaround time waiting
time is usually the waiting time for each process.
Response time: It is most frequently considered in time sharing and real time
operating system. However, its characteristics differ in the two systems. In time
sharing system it may be defined as interval from the time the last character of a
command line of a program or transaction is entered to the time the last result appears
on the terminal. In real time system it may be defined as interval from the time an
internal or external event is signalled to the time the first instruction of the respective
service routine is executed.
Response time = t(first response) – t(submission of request)
One of the problems in designing schedulers and selecting a set of its performance
criteria is that they often conflict with each other. For example, the fastest response
time in time sharing and real time system may result in low CPU utilisation.
Throughput and CPU utilization may be increased by executing the large number of
processes, but then response time may suffer. Therefore, the design of a scheduler
usually requires balance of all the different requirements and constraints. In the next
section we will discuss various scheduling algorithms.
38
Non–Preemptive scheduling: A scheduling discipline is non-preemptive if once a Processes
process has been allotted to the CPU, the CPU cannot be taken away from the process.
A non-preemptible discipline always processes a scheduled request to its completion.
In non-preemptive systems, jobs are made to wait by longer jobs, but the treatment of
all processes is fairer.
First come First Served (FCFS) and Shortest Job First (SJF), are considered to be the
non-preemptive scheduling algorithms.
The decision whether to schedule preemptive or not depends on the environment and
the type of application most likely to be supported by a given operating system.
P1 P2 P3 P4 P5
0 3 6 7 11 13
Using SJF scheduling because the shortest length of process will first get execution,
the Gantt chart will be:
P4 P1 P3 P2
0 3 9 16 24
Because the shortest processing time is of the process P4, then process P1 and then P3
and Process P2. The waiting time for process P1 is 3 ms, for process P2 is 16 ms, for
process P3 is 9 ms and for the process P4 is 0 ms as –
40
Each process is allocated a small time-slice called quantum. No process can run for Processes
more than one quantum while others are waiting in the ready queue. If a process needs
more CPU time to complete after exhausting one quantum, it goes to the end of ready
queue to await the next allocation. To implement the RR scheduling, Queue data
structure is used to maintain the Queue of Ready processes. A new process is added at
the tail of that Queue. The CPU schedular picks the first process from the ready
Queue, Allocate processor for a specified time Quantum. After that time the CPU
schedular will select the next process is the ready Queue.
Consider the following set of process with the processing time given in milliseconds.
P1 P2 P3 P1 P1 P1 P1 P1
0 4 7 10 14 18 22 26 30
Consider the set of four processes arrived as per timings described in the table:
At time 0, only process P1 has entered the system, so it is the process that executes. At
time 1, process P2 arrives. At that time, process P1 has 4 time units left to execute At
41
Introduction to Operating this juncture process 2’s processing time is less compared to the P1 left out time (4
Systems and Process
Management
units). So P2 starts executing at time 1. At time 2, process P3 enters the system with
the processing time 5 units. Process P2 continues executing as it has the minimum
number of time units when compared with P1 and P3. At time 3, process P2
terminates and process P4 enters the system. Of the processes P1, P3 and P4, P4 has
the smallest remaining execution time so it starts executing. When process P1
terminates at time 10, process P3 executes. The Gantt chart is shown below:
P1 P2 P4 P1 P3
0 1 3 6 10 15
Turnaround time for each process can be computed by subtracting the time it
terminated from the arrival time.
Turn around Time = t(Process Completed)– t(Process Submitted)
The turnaround time for each of the processes is:
P1: 10 – 0 = 10
P2: 3–1= 2
P3: 15 – 2 = 13
P4: 6–3= 3
The average turnaround time is (10+2+13+3) / 4 = 7
The waiting time can be computed by subtracting processing time from turnaround
time, yielding the following 4 results for the processes as
P1: 10 – 5 = 5
P2: 2–2=0
P3: 13 – 5 = 8
P4: 3–3=0
The average waiting time = (5+0+8+0) / 4 = 3.25milliseconds
Four jobs executed in 15 time units, so throughput is 15 / 4 = 3.75 time units/job.
2.5.5 Priority Based Scheduling or Event-Driven (ED) Scheduling
A priority is associated with each process and the scheduler always picks up the
highest priority process for execution from the ready queue. Equal priority processes
are scheduled FCFS. The level of priority may be determined on the basis of resource
requirements, processes characteristics and its run time behaviour.
A major problem with a priority based scheduling is indefinite blocking of a lost
priority process by a high priority process. In general, completion of a process within
finite time cannot be guaranteed with this scheduling algorithm. A solution to the
problem of indefinite blockage of low priority process is provided by aging priority.
Aging priority is a technique of gradually increasing the priority of processes (of low
priority) that wait in the system for a long time. Eventually, the older processes attain
high priority and are ensured of completion in a finite time.
As an example, consider the following set of five processes, assumed to have arrived
at the same time with the length of processor timing in milliseconds: –
P2 P5 P1 P3 P4
0 1 6 16 18 19
P1 P2 P3 P4 P5
0 10 39 42 49 61
P3 P4 P1 P5 P2
0 3 10 20 32 61
P1 P2 P3 P4 P5 P2 P5 P2
0 10 20 23 30 40 49 52 61
……………………………………………………………………………
……………………………………………………………………………
……………………………………………………………………………
4) For the given five processes arriving at time 0, in the order with the length of
CPU time in milliseconds:
2.7 SUMMARY
A process is an instance of a program in execution. A process can be defined by the
system or process is an important concept in modem operating system. Processes
provide a suitable means for informing the operating system about independent
activities that may be scheduled for concurrent execution. Each process is represented
by a process control block (PCB). Several PCB’s can be linked together to form a
queue of waiting processes. The selection and allocation of processes is done by a
scheduler. There are several scheduling algorithms. We have discussed FCFS, SJF,
RR, SJRT and priority algorithms along with the performance evaluation.
2.8 SOLUTIONS/ANSWERS
P1 P2 P3
0 13 21 104
P1 P2 P3 P4 P5
0 10 39 42 49 51
P3 P4 P1 P5 P2
0 3 10 20 32 61
From the above calculations of average waiting time we found that SJF policy results
in less than one half of the average waiting time obtained from FCFS, while Round
Robin gives intermediate result.
48
Interprocess Communication
UNIT 3 INTERPROCESS COMMUNICATION and Synchronization
AND SYNCHRONIZATION
Structure Page Nos.
3.0 Introduction 49
3.1 Objectives 50
3.2 Interprocess Communication 50
3.2.1 Shared-Memory System
3.2.2 Message-Passing System
3.3 Interprocess Synchronization 56
3.3.1 Serialization
3.3.2 Mutexes: Mutual Exclusion
3.3.3 Critical Sections: The Mutex Solution
3.3.4 Dekker’s Solution for Mutual Exclusion
3.3.5 Bakery’s Algorithm
3.4 Semaphores 57
3.5 Classical Problems in Concurrent Programming 59
3.5.1 Producers/Consumers Problem
3.5.2 Readers and Writers Problem
3.5.3 Dining Philosophers Problem
3.5.4 Sleeping Barber Problem
3.6 Locks 64
3.7 Monitors and Condition Variables 64
3.8 Summary 67
3.9 Solution/Answers 67
3.10 Further Readings 68
3.0 INTRODUCTION
In the earlier unit we have studied the concept of processes. In addition to process
scheduling, another important responsibility of the operating system is process
synchronization. Synchronization involves the orderly sharing of system resources by
processes.
Concurrency specifies two or more sequential programs (a sequential program
specifies sequential execution of a list of statements) that may be executed
concurrently as a parallel process. For example, an airline reservation system that
involves processing transactions from many terminals has a natural specification as a
concurrent program in which each terminal is controlled by its own sequential
process. Even when processes are not executed simultaneously, it is often easier to
structure as a collection of cooperating sequential processes rather than as a single
sequential program.
A simple batch operating system can be viewed as 3 processes-a reader process, an
executor process and a printer process. The reader reads cards from card reader and
places card images in an input buffer. The executor process reads card images from
input buffer and performs the specified computation and store the result in an output
buffer. The printer process retrieves the data from the output buffer and writes them to
a printer. Concurrent processing is the basis of operating system which supports
multiprogramming.
The operating system supports concurrent execution of a program without necessarily
supporting elaborate form of memory and file management. This form of operation is
also known as multitasking. One of the benefits of multitasking is that several
processes can be made to cooperate in order to achieve their goals. To do this, they
must do one of the following:
Communicate: Interprocess communication (IPC) involves sending information from
one process to another. This can be achieved using a “mailbox” system, a socket
49
Introduction to Operating which behaves like a virtual communication network (loopback), or through the use of
Systems and Process
Management “pipes”. Pipes are a system construction which enable one process to open another
process as if it were a file for writing or reading.
Share Data: A segment of memory must be available to both the processes. (Most
memory is locked to a single process).
Waiting: Some processes wait for other processes to give a signal before continuing.
This is an issue of synchronization.
In order to cooperate concurrently executing processes must communicate and
synchronize. Interprocess communication is based on the use of shared variables
(variables that can be referenced by more than one process) or message passing.
Synchronization is often necessary when processes communicate. Processes are
executed with unpredictable speeds. Yet to communicate one process must perform
some action such as setting the value of a variable or sending a message that the other
detects. This only works if the events perform an action or detect an action are
constrained to happen in that order. Thus one can view synchronization as a set of
constraints on the ordering of events. The programmer employs a synchronization
mechanism to delay execution of a process in order to satisfy such constraints.
In this unit, let us study the concept of interprocess communication and
synchronization, need of semaphores, classical problems in concurrent processing,
critical regions, monitors and message passing.
3.1 OBJECTIVES
After studying this unit, you should be able to:
• identify the significance of interprocess communication and synchronization;
• describe the two ways of interprocess communication namely shared memory
and message passing;
• discuss the usage of semaphores, locks and monitors in interprocess and
synchronization, and
When two or more processes work on the same data simultaneously strange things can
happen. Suppose, when two parallel threads attempt to update the same variable
simultaneously, the result is unpredictable. The value of the variable afterwards
depends on which of the two threads was the last one to change the value. This is
called a race condition. The value depends on which of the threads wins the race to
update the variable. What we need in a mulitasking system is a way of making such
situations predictable. This is called serialization. Let us study the serialization
concept in detail in the next section.
3.3.1 Serialization
The key idea in process synchronization is serialization. This means that we have to
go to some pains to undo the work we have put into making an operating system
perform several tasks in parallel. As we mentioned, in the case of print queues,
parallelism is not always appropriate.
Synchronization is a large and difficult topic, so we shall only undertake to describe
the problem and some of the principles involved here.
There are essentially two strategies to serializing processes in a multitasking
environment.
• The scheduler can be disabled for a short period of time, to prevent control
being given to another process during a critical action like modifying shared
data. This method is very inefficient on multiprocessor machines, since all other
processors have to be halted every time one wishes to execute a critical section.
• A protocol can be introduced which all programs sharing data must obey. The
protocol ensures that processes have to queue up to gain access to shared data.
Processes which ignore the protocol ignore it at their own peril (and the peril of
the remainder of the system!). This method works on multiprocessor machines
also, though it is more difficult to visualize. The responsibility of serializing
important operations falls on programmers. The OS cannot impose any
restrictions on silly behaviour-it can only provide tools and mechanisms to
assist the solution of the problem.
3.3.2 Mutexes: Mutual Exclusion
When two or more processes must share some object, an arbitration mechanism is
needed so that they do not try to use it at the same time. The particular object being
53
Introduction to Operating shared does not have a great impact on the choice of such mechanisms. Consider the
Systems and Process
Management following examples: two processes sharing a printer must take turns using it; if they
attempt to use it simultaneously, the output from the two processes may be mixed into
an arbitrary jumble which is unlikely to be of any use. Two processes attempting to
update the same bank account must take turns; if each process reads the current
balance from some database, updates it, and then writes it back, one of the updates
will be lost.
Both of the above examples can be solved if there is some way for each process to
exclude the other from using the shared object during critical sections of code. Thus
the general problem is described as the mutual exclusion problem. The mutual
exclusion problem was recognised (and successfully solved) as early as 1963 in the
Burroughs AOSP operating system, but the problem is sufficiently difficult widely
understood for some time after that. A significant number of attempts to solve the
mutual exclusion problem have suffered from two specific problems, the lockout
problem, in which a subset of the processes can conspire to indefinitely lock some
other process out of a critical section, and the deadlock problem, where two or more
processes simultaneously trying to enter a critical section lock each other out.
Release_Mutex(m);
This protocol is meant to ensure that only one process at a time can get past the
function Get_Mutex. All other processes or threads are made to wait at the function
Get_Mutex until that one process calls Release_Mutex to release the lock. A method
for implementing this is discussed below. Mutexes are a central part of multithreaded
programming.
3.3.3 Critical Sections: The Mutex Solution
A critical section is a part of a program in which is it necessary to have exclusive
access to shared data. Only one process or a thread may be in a critical section at any
one time. The characteristic properties of the code that form a Critical Section are:
• Codes that refer one or more variables in a “read-update-write” fashion while
any of those variables is possibly being altered by another thread.
• Codes that alter one or more variables that are possibly being referenced in
“read-update-write” fashion by another thread.
• Codes use a data structure while any part of it is possibly being altered by
another thread.
• Codes alter any part of a data structure while it possibly in use by another
54 thread.
Interprocess Communication
In the past it was possible to implement this by generalising the idea of interrupt and Synchronization
masks. By switching off interrupts (or more appropriately, by switching off the
scheduler) a process can guarantee itself uninterrupted access to shared data. This
method has drawbacks:
{
int other;
other = 1 - pid;
interested[process] = true;
turn = pid;
{
interested[pid] = false;
}
Where more processes are involved, some modifications are necessary to this
algorithm. The key to serialization here is that, if a second process tries to obtain the
mutex, when another already has it, it will get caught in a loop, which does not
terminate until the other process has released the mutex. This solution is said to
involve busy waiting-i.e., the program actively executes an empty loop, wasting CPU
cycles, rather than moving the process out of the scheduling queue. This is also called
a spin lock, since the system ‘spins’ on the loop while waiting. Let us see another
algorithm which handles critical section problem for n processes.
3.3.4 Dekker’s solution for Mutual Exclusion
Mutual exclusion can be assured even when there is no underlying mechanism such as
the test-and-set instruction. This was first realised by T. J. Dekker and published (by
Dijkstra) in 1965. Dekker’s algorithm uses busy waiting and works for only two
processes. The basic idea is that processes record their interest in entering a critical
section (in Boolean variables called “need”) and they take turns (using a variable
called “turn”) when both need entry at the same time. Dekker’s solution is shown
below:
type processid = 0..1;
55
Introduction to Operating
var need: array [ processid ] of boolean { initially false };
Systems and Process
Management turn: processid { initially either 0 or 1 };
procedure dekkerwait( me: processid );
var other: processid;
begin
other := 1 - me;
need[ me ] := true;
while need[ other ] do begin { there is contention }
if turn = other then begin
need[ me ] := false { let other take a turn };
while turn = other do { nothing };
need[ me ] := true { re-assert my interest };
end;
end;
end { dekkerwait };
Dekkers solution to the mutual exclusion problem requires that each of the contending
processes have a unique process identifier which is called “me” which is passed to the
wait and signal operations. Although none of the previously mentioned solutions
require this, most systems provide some form of process identifier which can be used
for this purpose.
It should be noted that Dekker’s solution does rely on one very simple assumption
about the underlying hardware; it assumes that if two processes attempt to write two
different values in the same memory location at the same time, one or the other value
will be stored and not some mixture of the two. This is called the atomic update
assumption. The atomically updatable unit of memory varies considerably from one
system to another; on some machines, any update of a word in memory is atomic, but
an attempt to update a byte is not atomic, while on others, updating a byte is atomic
while words are updated by a sequence of byte updates.
3.3.5 Bakery’s Algorithm
Bakery algorithm handles critical section problem for n processes as follows:
• Before entering its critical section, process receives a number. Holder of the
smallest number enters the critical section.
• If processes P i and P j receive the same number, if i < j , then P i is served first;
else P j is served first.
• The numbering scheme always generates numbers in increasing order of
enumeration; i.e., 1,2,3,3,3,3,4,5...
• Notation <= lexicographical order (ticket #, process id #)
o (a,b) < (c,d) if a < c or if a = c and b < d
o max(a0, . . . , an-1) is a number, k , such that k >= ai for i = 0, . . . , n - 1
• Shared data
boolean choosing[n]; //initialise all to false
int number[n]; //initialise all to 0
56
• Data structures are initialized to false and 0, respectively.
Interprocess Communication
The algorithm is as follows: and Synchronization
do
{
choosing[i] = true;
number[i] = max(number[0], number[1], ...,number[n-1]) + 1;
choosing[i] = false;
do critical section
number[i] = 0;
do remainder section
}while (true)
In the next section we will study how the semaphores provides a much more organise
approach of synchronization of processes.
3.4 SEMAPHORES
Semaphores provide a much more organised approach to controlling the interaction of
multiple processes than would be available if each user had to solve all interprocess
communications using simple variables, but more organization is possible. In a sense,
semaphores are something like the goto statement in early programming languages;
they can be used to solve a variety of problems, but they impose little structure on the
solution and the results can be hard to understand without the aid of numerous
comments. Just as there have been numerous control structures devised in sequential
programs to reduce or even eliminate the need for goto statements, numerous
specialized concurrent control structures have been developed which reduce or
eliminate the need for semaphores.
Definition: The effective synchronization tools often used to realise mutual exclusion
in more complex systems are semaphores. A semaphore S is an integer variable which
can be accessed only through two standard atomic operations: wait and signal. The
definition of the wait and signal operation are:
signal(S): S := S + 1;
wait(s)
{
while (S<=0)
57
Introduction to Operating
{
Systems and Process
Management /*do nothing*/
}
S= S-1;
}
signal(S)
{
S = S + 1;
}
It should be noted that the test (S ≤ 0) and modification of the integer value of S which
is S := S – 1 must be executed without interruption. In general, if one process modifies
the integer value of S in the wait and signal operations, no other process can
simultaneously modify that same S value. We briefly explain the usage of semaphores
in the following example:
Consider two currently running processes: P1 with a statement S1 and P2 with a
statement S2. Suppose that we require that S2 be executed only after S1 has completed.
This scheme can be implemented by letting P1 and P2 share a common semaphore
synch, initialised to 0, and by inserting the statements:
S1;
signal(synch);
in the process P1 and the statements:
wait(synch);
S2;
in the process P2.
Since synch is initialised to 0, P2 will execute S2 only after P1 has involved signal
(synch), which is after S1.
The disadvantage of the semaphore definition given above is that it requires busy-
waiting, i.e., while a process is in its critical region, any either process it trying to
enter its critical region must continuously loop in the entry code. It’s clear that
through busy-waiting, CPU cycles are wasted by which some other processes might
use those productively.
To overcome busy-waiting, we modify the definition of the wait and signal
operations. When a process executes the wait operation and finds that the semaphore
value is not positive, the process blocks itself. The block operation places the process
into a waiting state. Using a scheduler the CPU then can be allocated to other
processes which are ready to run.
A process that is blocked, i.e., waiting on a semaphore S, should be restarted by the
execution of a signal operation by some other processes, which changes its state from
blocked to ready. To implement a semaphore under this condition, we define a
semaphore as:
struct semaphore
{
int value;
List *L; //a list of processes
}
Each semaphore has an integer value and a list of processes. When a process must
wait on a semaphore, it is added to this list. A signal operation removes one process
from the list of waiting processes, and awakens it. The semaphore operation can be
now defined as follows:
wait(S)
{
S.value = S.value -1;
58 if (S.value <0)
Interprocess Communication
{ and Synchronization
add this process to S.L;
block;
}
}
signal(S)
{
S.value = S.value + 1;
if (S.value <= 0)
{
remove a process P from S.L;
wakeup(P);
}
}
The block operation suspends the process. The wakeup(P) operation resumes the
execution of a blocked process P. These two operations are provided by the operating
system as basic system calls.
One of the almost critical problem concerning implementing semaphore is the
situation where two or more processes are waiting indefinitely for an event that can be
only caused by one of the waiting processes: these processes are said to be
deadlocked. To illustrate this, consider a system consisting of two processes P1 and P2,
each accessing two semaphores S and Q, set to the value one:
P1 P2
wait(S); wait(Q);
wait(Q); wait(S);
... ...
signal(S); signal(Q);
signal(Q); signal(S);
Suppose P1 executes wait(S) and then P2 executes wait(Q). When P1 executes wait(Q),
it must wait until P2 executes signal(Q). It is no problem, P2 executes wait(Q), then
signal(Q). Similarly, when P2 executes wait(S), it must wait until P1 executes
signal(S). Thus these signal operations cannot be carried out, P1 and P2 are
deadlocked. It is clear, that a set of processes are in a deadlocked state, when every
process in the set is waiting for an event that can only be caused by another process in
the set.
An airline reservation system consists of a huge database with many processes that
read and write the data. Reading information from the database will not cause a
problem since no data is changed. The problem lies in writing information to the
database. If no constraints are put on access to the database, data may change at any
60 moment. By the time a reading process displays the result of a request for information
Interprocess Communication
to the user, the actual data in the database may have changed. What if, for instance, a and Synchronization
process reads the number of available seats on a flight, finds a value of one, and
reports it to the customer? Before the customer has a chance to make their reservation,
another process makes a reservation for another customer, changing the number of
available seats to zero.
The following is the solution using semaphores:
Semaphores can be used to restrict access to the database under certain conditions. In
this example, semaphores are used to prevent any writing processes from changing
information in the database while other processes are reading from the database.
semaphore mutex = 1; // Controls access to the reader count
semaphore db = 1; // Controls access to the database
int reader_count; // The number of reading processes accessing the data
Reader()
{
while (TRUE) { // loop forever
down(&mutex); // gain access to reader_count
reader_count = reader_count + 1; // increment the reader_count
if (reader_count == 1)
down(&db); //If this is the first process to read the database,
// a down on db is executed to prevent access to the
// database by a writing process
up(&mutex); // allow other processes to access reader_count
read_db(); // read the database
down(&mutex); // gain access to reader_count
reader_count = reader_count - 1; // decrement reader_count
if (reader_count == 0)
up(&db); // if there are no more processes reading from the
// database, allow writing process to access the data
up(&mutex); // allow other processes to access
reader_countuse_data();
// use the data read from the database (non-critical)
}
Writer()
{
while (TRUE) { // loop forever
create_data(); // create data to enter into database (non-critical)
down(&db); // gain access to the database
write_db(); // write information to the database
up(&db); // release exclusive access to the database
}
3.5.3 Dining Philosophers Problem
Five philosophers sit around a circular table. Each philosopher spends his life
alternatively thinking and eating. In the centre of the table is a large bowl of rice. A
philosopher needs two chopsticks to eat. Only 5 chop sticks are available and a
chopstick is placed between each pair of philosophers. They agree that each will only
use the chopstick to his immediate right and left. From time to time, a philosopher
gets hungry and tries to grab the two chopsticks that are immediate left and right to
him. When a hungry philosopher has both his chopsticks at the same time, he eats
without releasing his chopsticks. When he finishes eating, he puts down both his
chopsticks and starts thinking again.
Here’s a solution for the problem which does not require a process to write another
process’s state, and gets equivalent parallelism.
#define N 5 /* Number of philosphers */
#define RIGHT(i) (((i)+1) %N) 61
Introduction to Operating
#define LEFT(i) (((i)==N) ? 0 : (i)+1)
Systems and Process
Management
typedef enum { THINKING, HUNGRY, EATING } phil_state;
phil_state state[N];
semaphore mutex =1;
semaphore s[N];
void put_forks(int i) {
P(mutex);
state[i]= THINKING;
if ( state[LEFT(i)] == HUNGRY ) V(s[LEFT(i)]);
if ( state[RIGHT(i)] == HUNGRY) V(s[RIGHT(i)]);
V(mutex);
}
void philosopher(int process) {
while(1) {
think();
get_forks(process);
eat();
put_forks();
}
}
void barber(void)
62 {
Interprocess Communication
while (TRUE) { and Synchronization
down(&customers); //go to sleep if no of customers are zero
down(&mutex); //acquire access to waiting
waiting = waiting -1 ; //decrement count of waiting customers
up(&barbers); //one barber is now ready for cut hair
up(&mutex); //release waiting
cut_hair(); //this is out of critical region for hair cut
}
}
void customer(void)
{
down(&mutex); //enter critical region
if (waiting < CHAIRS) //if there are no free chairs, leave
{
waiting = waiting +1; //increment count of waiting customers
up(&customers); //wake up barber if necessary
up(&mutex); //release access to waiting
down(&barbers); //go to sleep if no of free barbers is zero
get_haircut(); //be seated and be serviced
} else
{
up (&mutex); // shop is full: do no wait
}
}
Explanation:
• This problem is similar to various queuing situations
• The problem is to program the barber and the customers without getting into
race conditions
• Solution uses three semaphores:
• customers; counts the waiting customers
• barbers; the number of barbers (0 or 1)
• mutex; used for mutual exclusion
• also need a variable waiting; also counts the waiting customers;
(reason; no way to read the current value of semaphore)
• The barber executes the procedure barber, causing him to block on the
semaphore customers (initially 0);
• The barber then goes to sleep;
• When a customer arrives, he executes customer, starting by acquiring
mutex to enter a critical region;
• If another customer enters, shortly thereafter, the second one will not be
able to do anything until the first one has released mutex;
• The customer then checks to see if the number of waiting customers is
less than the number of chairs;
• If not, he releases mutex and leaves without a haircut;
• If there is an available chair, the customer increments the integer variable,
waiting;
• Then he does an up on the semaphore customers;
• When the customer releases mutex, the barber begins the haircut.
63
Introduction to Operating
Systems and Process
Management
3.6 LOCKS
Locks are another synchronization mechanism. A lock has got two atomic operations
(similar to semaphore) to provide mutual exclusion. These two operations are Acquire
and Release. A process will acquire a lock before accessing a shared variable, and
later it will be released. A process locking a variable will run the following code:
Lock-Acquire();
critical section
Lock-Release();
The difference between a lock and a semaphore is that a lock is released only by the
process that have acquired it earlier. As we discussed above any process can
increment the value of the semaphore. To implement locks, here are some things you
should keep in mind:
• To make Acquire () and Release () atomic
• Build a wait mechanism.
• Making sure that only the process that acquires the lock will release the lock.
var i, j: counter;
Calls to procedures within the body of a monitor are done using record notation; thus,
to increment one of the counters declared in above example, one would call
“i.increment”. This call would implicitly do a wait operation on the semaphore
64 implicitly associated with “i”, then execute the body of the “increment” procedure
Interprocess Communication
before doing a signal operation on the semaphore. Note that the call to “i.increment” and Synchronization
implicitly passes a specific instance of the monitor as a parameter to the “increment”
procedure, and that fields of this instance become global variables to the body of the
procedure, as if there was an implicit “with” statement.
There are a number of problems with monitors which have been ignored in the above
example. For example, consider the problem of assigning a meaning to a call from
within one monitor procedure to a procedure within another monitor. This can easily
lead to a deadlock. For example, when procedures within two different monitors each
calling the other. It has sometimes been proposed that such calls should never be
allowed, but they are sometimes useful! We will study more on deadlocks in the next
units of this course.
The most important problem with monitors is that of waiting for resources when they
are not available. For example, consider implementing a queue monitor with internal
procedures for the enqueue and dequeue operations. When the queue empties, a call to
dequeue must wait, but this wait must not block further entries to the monitor through
the enqueue procedure. In effect, there must be a way for a process to temporarily step
outside of the monitor, releasing mutual exclusion while it waits for some other
process to enter the monitor and do some needed action.
Hoare’s suggested solution to this problem involves the introduction of condition
variables which may be local to a monitor, along with the operations wait and signal.
Essentially, if s is the monitor semaphore, and c is a semaphore representing a
condition variable, “wait c” is equivalent to “signal(s); wait(c); wait(s)” and “signal c”
is equivalent to “signal(c)”. The details of Hoare’s wait and signal operations were
somewhat more complex than is shown here because the waiting process was given
priority over other processes trying to enter the monitor, and condition variables had
no memory; repeated signalling of a condition had no effect and signaling a condition
on which no process was waiting had no effect. Following is an example monitor:
monitor synch
integer i;
condition c;
procedure producer(x);
.
.
end;
procedure consumer(x);
.
.
end;
end monitor;
There is only one process that can enter a monitor, therefore every monitor has its
own waiting list with process waiting to enter the monitor.
Let us see the dining philosopher’s which was explained in the above section with
semaphores, can be re-written using the monitors as:
Example: Solution to the Dining Philosophers Problem using Monitors
monitor dining-philosophers
{
enum state {thinking, hungry, eating};
state state[5];
condition self[5];
init
{
for (int i = 0; i< 5; i++)
state[i] = thinking;
}
}
Condition Variables
If a process cannot enter the monitor it must block itself. This operation is provided by
the condition variables. Like locks and semaphores, the condition has got a wait and a
signal function. But it also has the broadcast signal. Implementation of condition
variables is part of a synch.h; it is your job to implement it. Wait (), Signal () and
Broadcast () have the following semantics:
• Wait() releases the lock, gives up the CPU until signaled and then re-acquire the
lock.
• Signal() wakes up a thread if there are any waiting on the condition variable.
• Broadcast() wakes up all threads waiting on the condition.
When you implement the condition variable, you must have a queue for the processes
waiting on the condition variable.
There are four processes in this problem: three smoker processes and an agent
process. Each of the smoker processes will make a cigarette and smoke it. To
66 make a cigarette requires tobacco, paper, and matches. Each smoker process
Interprocess Communication
has one of the three items. i.e., one process has tobacco, another has paper, and and Synchronization
a third has matches. The agent has an infinite supply of all three. The agent
places two of the three items on the table, and the smoker that has the third item
makes the cigarette.
……………………………………………………………………………………
……………………………………………………………………………………
3.8 SUMMARY
Interprocess communication provides a mechanism to allow process to communicate
with other processes. Interprocess communication system is best provided by a
message passing system. Message systems can be defined in many different ways. If
there are a collection of cooperating sequential processes that share some data, mutual
exclusion must be provided. There are different methods for achieving the mutual
exclusion. Different algorithms are available for solving the critical section problem
which we have discussion in this unit. The bakery algorithm is used for solving the n
process critical section problem.
Interprocess synchronization provides the processes to synchronize their activities.
Semaphores can be used to solve synchronization problems. Semaphore can only be
accessed through two atomic operations and can be implemented efficiently. The two
operations are wait and signal.
There are a number of classical synchronization problems which we have discussed in
this unit (such as producer- consumer problem, readers – writers problem and d
dining – philosophers problem). These problems are important mainly because they
are examples for a large class of concurrency-control problems. In the next unit we
will study an important aspect called as “Deadlocks”
3.9 SOLUTIONS/ANSWERS
Check Your Progress 1
1) Processes that are working together share some common storage (main
memory, file etc.) that each process can read and write. When two or more
processes are reading or writing some shared data and the final result depends
on who runs precisely when, are called race conditions. Concurrently executing
threads that share data need to synchronize their operations and processing in
order to avoid race condition on shared data. Only one “customer” thread at a
time should be allowed to examine and update the shared variable.
Race conditions are also possible in Operating Systems. If the ready queue is
implemented as a linked list and if the ready queue is being manipulated during
the handling of an interrupt, then interrupts must be disabled to prevent another
interrupt before the first one completes. If interrupts are not disabled than the
linked list could become corrupt.
2) The most synchronization problem confronting cooperating processes, is to
control the access between the shared resources. Suppose two processes share
access to a file and at least one of these processes can modify the data in this
shared area of memory. That part of the code of each program, where one
process is reading from or writing to a shared memory area, is a critical section
of code; because we must ensure that only one process execute a critical section
of code at a time. The critical section problem is to design a protocol that the
processes can use to coordinate their activities when one wants to enter its
critical section of code.
3) This seems like a fairly easy solution. The three smoker processes will make a
cigarette and smoke it. If they can’t make a cigarette, then they will go to sleep.
67
Introduction to Operating The agent process will place two items on the table, and wake up the
Systems and Process
Management appropriate smoker, and then go to sleep. All semaphores except lock are
initialised to 0. Lock is initialised to 1, and is a mutex variable.
Here’s the code for the agent process.
do forever {
P( lock );
randNum = rand(1,3); // Pick a random number from 1-3
if (randNum == 1) {
// Put tobacco on table
// Put paper on table
V(smoker_match); // Wake up smoker with match
}
else if (randNum == 2) {
// Put tobacco on table
// Put match on table
V(smoker_paper); // Wake up smoker with paper
}
else {
// Put match on table
// Put paper on table
V(smoker_tobacco);
} // Wake up smoker with tobacco
V(lock);
P(agent); // Agent sleeps
68
Deadlocks
UNIT 4 DEADLOCKS
Structure Page Nos
4.0 Introduction 69
4.1 Objectives 70
4.2 Deadlocks 70
4.3 Characterisation of a Deadlock 71
4.3.1 Mutual Exclusion Condition
4.3.2 Hold and Wait Condition
4.3.3 No-Preemptive Condition
4.3.4 Circular Wait Condition
4.4 A Resource Allocation Graph 72
4.5 Dealing with Deadlock Situations 74
4.5.1 Deadlock Prevention
4.5.2 Deadlock Avoidance
4.5.3 Deadlock Detection and Recovery
4.6 Summary 79
4.7 Solutions/Answers 79
4.8 Further Readings 80
4.0 INTRODUCTION
In a computer system, we have a finite number of resources to be distributed among a
number of competing processes. These system resources are classified in several types
which may be either physical or logical. Examples of physical resources are Printers,
Tape drivers, Memory space, and CPU cycles. Examples of logical resources are
Files, Semaphores and Monitors. Each resource type can have some identical
instances.
A process must request a resource before using it and release the resource after using
it. It is clear that the number of resources requested cannot exceed the total number of
resources available in the system.
In a normal operation, a process may utilise a resource only in the following sequence:
• Request: if the request cannot be immediately granted, then the requesting
process must wait until it can get the resource.
• Use: the requesting process can operate on the resource.
• Release: the process releases the resource after using it.
Examples for request and release of system resources are:
• Request and release the device,
• Opening and closing file,
• Allocating and freeing the memory.
The operating system is responsible for making sure that the requesting process has
been allocated the resource. A system table indicates if each resource is free or
allocated, and if allocated, to which process. If a process requests a resource that is
currently allocated to another process, it can be added to a queue of processes waiting
for this resource.
In some cases, several processes may compete for a fixed number of resources. A
process requests resources and if the resources are not available at that time, it enters a
wait state. It may happen that it will never gain access to the resources, since those
resources are being held by other waiting processes.
69
Introduction to Operating For example, assume a system with one tape drive and one plotter. Process P1
Systems and Process
Management requests the tape drive and process P2 requests the plotter. Both requests are granted.
Now PI requests the plotter (without giving up the tape drive) and P2 requests the tape
drive (without giving up the plotter). Neither request can be granted so both processes
enter a situation called the deadlock situation.
A deadlock is a situation where a group of processes is permanently blocked as a
result of each process having acquired a set of resources needed for its completion and
having to wait for the release of the remaining resources held by others thus making it
impossible for any of the deadlocked processes to proceed.
In the earlier units, we have gone through the concept of process and the need for the
interprocess communication and synchronization. In this unit we will study about the
deadlocks, its characterisation, deadlock avoidance and its recovery.
4.1 OBJECTIVES
After going through this unit, you should be able to:
• define a deadlock;
4.2 DEADLOCKS
Before studying about deadlocks, let us look at the various types of resources. There
are two types of resources namely: Pre-emptable and Non-pre-emptable Resources.
• Pre-emptable resources: This resource can be taken away from the process
with no ill effects. Memory is an example of a pre-emptable resource.
• Non-Preemptable resource: This resource cannot be taken away from the
process (without causing ill effect). For example, CD resources are not
preemptable at an arbitrary moment.
Reallocating resources can resolve deadlocks that involve preemptable resources.
Deadlocks that involve nonpreemptable resources are difficult to deal with. Let us see
how a deadlock occurs.
Definition: A set of processes is in a deadlock state if each process in the set is
waiting for an event that can be caused by only another process in the set. In other
words, each member of the set of deadlock processes is waiting for a resource that can
be released only by a deadlock process. None of the processes can run, none of them
can release any resources and none of them can be awakened. It is important to note
that the number of processes and the number and kind of resources possessed and
requested are unimportant.
Let us understand the deadlock situation with the help of examples.
Example 1: The simplest example of deadlock is where process 1 has been allocated
a non-shareable resource A, say, a tap drive, and process 2 has been allocated a non-
sharable resource B, say, a printer. Now, if it turns out that process 1 needs resource B
(printer) to proceed and process 2 needs resource A (the tape drive) to proceed and
these are the only two processes in the system, each has blocked the other and all
useful work in the system stops. This situation is termed as deadlock.
70
The system is in deadlock state because each process holds a resource being requested Deadlocks
by the other process and neither process is willing to release the resource it holds.
Example 2: Consider a system with three disk drives. Suppose there are three
processes, each is holding one of these three disk drives. If each process now requests
another disk drive, three processes will be in a deadlock state, because each process is
waiting for the event “disk drive is released”, which can only be caused by one of the
other waiting processes. Deadlock state involves processes competing not only for the
same resource type, but also for different resource types.
From the above examples, we have understood the concept of deadlocks. In the
examples we were given some instances, but we will study the necessary conditions
for a deadlock to occur, in the next section.
71
Introduction to Operating Consider each section of the street as a resource. In this situation:
Systems and Process
Management • Mutual exclusion condition applies, since only one vehicle can be on a section
of the street at a time.
• Hold-and-wait condition applies, since each vehicle is occupying a section of
the street, and waiting to move on to the next section of the street.
• Non-preemptive condition applies, since a section of the street that is occupied
by a vehicle cannot be taken away from it.
• Circular wait condition applies, since each vehicle is waiting for the next
vehicle to move. That is, each vehicle in the traffic is waiting for a section of the
street held by the next vehicle in the traffic.
The simple rule to avoid traffic deadlock is that a vehicle should only enter an
intersection if it is assured that it will not have to stop inside the intersection.
It is not possible to have a deadlock involving only one single process. The deadlock
involves a circular “hold-and-wait” condition between two or more processes, so
“one” process cannot hold a resource, yet be waiting for another resource that it is
holding. In addition, deadlock is not possible between two threads in a process,
because it is the process that holds resources, not the thread, that is, each thread has
access to the resources held by the process.
• If there is a cycle in the graph and each resource has only one instance, then
there is a deadlock. In this case, a cycle is a necessary and sufficient condition
for deadlock.
• If there is a cycle in the graph, and each resource has more than one instance,
there may or may not be a deadlock. (A cycle may be broken if some process
outside the cycle has a resource instance that can break the cycle). Therefore, a
cycle in the resource allocation graph is a necessary but not sufficient condition
for deadlock, when multiple resource instances are considered.
72
Example: Deadlocks
R2
Tape
Resource Request
P2
P1 Resource Allocated
R1
Disk
R1 P1 P1 R2
R2 P2 P2 R1
a b
Resource Instance
R2
Tape Resource Request
P2
P1
Resource Allocated
R1
Disk
The above graph shown in Figure 3 has a cycle and is not in Deadlock.
(Resource 1 has one instance shown by a star)
(Resource 2 has two instances a and b, shown as two stars)
R1 P1 P1 R2 (a)
R2 (b) P2 P2 R1
73
Introduction to Operating
Systems and Process
Management
4.5 DEALING WITH DEADLOCK SITUATIONS
There are possible strategies to deal with deadlocks. They are:
• Deadlock Prevention
• Deadlock Avoidance
• Deadlock Detection and Recovery
Let’s examine each strategy one by one to evaluate their respective strengths and
weaknesses.
4.5.1 Deadlock Prevention
Havender in his pioneering work showed that since all four of the conditions are
necessary for deadlock to occur, it follows that deadlock might be prevented by
denying any one of the conditions. Let us study Havender’s algorithm.
Havender’s Algorithm
Elimination of “Mutual Exclusion” Condition
The mutual exclusion condition must hold for non-shareable resources. That is,
several processes cannot simultaneously share a single resource. This condition is
difficult to eliminate because some resources, such as the tap drive and printer, are
inherently non-shareable. Note that shareable resources like read-only-file do not
require mutually exclusive access and thus cannot be involved in deadlock.
Elimination of “Hold and Wait” Condition
There are two possibilities for the elimination of the second condition. The first
alternative is that a process request be granted all the resources it needs at once, prior
to execution. The second alternative is to disallow a process from requesting resources
whenever it has previously allocated resources. This strategy requires that all the
resources a process will need must be requested at once. The system must grant
resources on “all or none” basis. If the complete set of resources needed by a process
is not currently available, then the process must wait until the complete set is
available. While the process waits, however, it may not hold any resources. Thus the
“wait for” condition is denied and deadlocks simply cannot occur. This strategy can
lead to serious waste of resources.
For example, a program requiring ten tap drives must request and receive all ten
drives before it begins executing. If the program needs only one tap drive to begin
execution and then does not need the remaining tap drives for several hours then
substantial computer resources (9 tape drives) will sit idle for several hours. This
strategy can cause indefinite postponement (starvation), since not all the required
resources may become available at once.
Elimination of “No-preemption” Condition
The nonpreemption condition can be alleviated by forcing a process waiting for a
resource that cannot immediately be allocated, to relinquish all of its currently held
resources, so that other processes may use them to finish their needs. Suppose a
system does allow processes to hold resources while requesting additional resources.
Consider what happens when a request cannot be satisfied. A process holds resources
a second process may need in order to proceed, while the second process may hold the
resources needed by the first process. This is a deadlock. This strategy requires that
when a process that is holding some resources is denied a request for additional
resources, the process must release its held resources and, if necessary, request them
again together with additional resources. Implementation of this strategy denies the
“no-preemptive” condition effectively.
High Cost
When a process releases resources, the process may lose all its work to that point. One
74 serious consequence of this strategy is the possibility of indefinite postponement
(starvation). A process might be held off indefinitely as it repeatedly requests and Deadlocks
releases the same resources.
Elimination of “Circular Wait” Condition
The last condition, the circular wait, can be denied by imposing a total ordering on all
of the resource types and than forcing all processes to request the resources in order
(increasing or decreasing). This strategy imposes a total ordering of all resource types,
and requires that each process requests resources in a numerical order of enumeration.
With this rule, the resource allocation graph can never have a cycle.
For example, provide a global numbering of all the resources, as shown in the given
Table 1:
Table 1: Numbering the resources
Number Resource
1 Floppy drive
2 Printer
3 Plotter
4 Tape Drive
5 CD Drive
75
Introduction to Operating
• Check for the safe state by finding a safe sequence: <P1, P2, ..., Pn> where
Systems and Process
Management resources that Pi needs can be satisfied by available resources plus resources
held by Pj where j < i.
• Resource allocation graph algorithm uses claim edges to check for a safe state.
The resource allocation state is now defined by the number of available and allocated
resources, and the maximum demands of the processes. Subsequently the system can
be in either of the following states:
• Safe state: Such a state occur when the system can allocate resources to each
process (up to its maximum) in some order and avoid a deadlock. This state will
be characterised by a safe sequence. It must be mentioned here that we should
not falsely conclude that all unsafe states are deadlocked although it may
eventually lead to a deadlock.
• Unsafe State: If the system did not follow the safe sequence of resource
allocation from the beginning and it is now in a situation, which may lead to a
deadlock, then it is in an unsafe state.
• Deadlock State: If the system has some circular wait condition existing for
some processes, then it is in deadlock state.
Let us study this concept with the help of an example as shown below:
Consider an analogy in which 4 processes (P1, P2, P3 and P4) can be compared with
the customers in a bank, resources such as printers etc. as cash available in the bank
and the Operating system as the Banker.
Table 2
76
Table 4 Deadlocks
Important Note: It is important to note that an unsafe state does not imply the
existence or even the eventual existence of a deadlock. What an unsafe state does
imply is simply that some unfortunate sequence of events might lead to a deadlock.
The Banker’s algorithm is thus used to consider each request as it occurs, and see if
granting it leads to a safe state. If it does, the request is granted, otherwise, it is
postponed until later. Haberman [1969] has shown that executing of the algorithm has
a complexity proportional to N2 where N is the number of processes and since the
algorithm is executed each time a resource request occurs, the overhead is significant.
Limitations of the Banker’s Algorithm
There are some problems with the Banker’s algorithm as given below:
• It is time consuming to execute on the operation of every resource.
• If the claim information is not accurate, system resources may be underutilised.
• Another difficulty can occur when a system is heavily loaded. Lauesen states
that in this situation “so many resources are granted away that very few safe
sequences remain, and as a consequence, the jobs will be executed
sequentially”. Therefore, the Banker’s algorithm is referred to as the “Most
Liberal” granting policy; that is, it gives away everything that it can without
regard to the consequences.
• New processes arriving may cause a problem.
• The process’s claim must be less than the total number of units of the
resource in the system. If not, the process is not accepted by the manager.
• Since the state without the new process is safe, so is the state with the new
process. Just use the order you had originally and put the new process at
the end.
• Ensuring fairness (starvation freedom) needs a little more work, but isn’t
too hard either (once every hour stop taking new processes until all
current processes finish).
• A resource becoming unavailable (e.g., a tape drive breaking), can result in an
unsafe state.
4.5.3 Deadlock Detection and Recovery
Detection of deadlocks is the most practical policy, which being both liberal and cost
efficient, most operating systems deploy. To detect a deadlock, we must go about in a
recursive manner and simulate the most favoured execution of each unblocked
process.
• An unblocked process may acquire all the needed resources and will execute.
77
Introduction to Operating
• It will then release all the acquired resources and remain dormant thereafter.
Systems and Process
Management
• The now released resources may wake up some previously blocked process.
If a deadlock is detected, one or more processes are restarted from their last
checkpoint. Restarting a process from a checkpoint is called rollback. It is done with
the expectation that the resource requests will not interleave again to produce
deadlock.
Deadlock recovery is generally used when deadlocks are rare, and the cost of recovery
(process termination or rollback) is low.
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
4.6 SUMMARY
A deadlock occurs a process has some resource and is waiting to acquire another
resource, while that resource is being held by some process that is waiting to acquire
the resource that is being held by the first process.
A deadlock needs four conditions to occur: Mutual Exclusion, Hold and Wait, Non-
Preemption and Circular Waiting.
We can handle deadlocks in three major ways: We can prevent them, handle them
when we detect them, or simply ignore the whole deadlock issue altogether.
4.7 SOLUTIONS/ANSWERS
Check Your Progress 1
1) A set of processes is in a deadlock state when every process in the set is waiting
for an event that can only be caused by another process in the set. A deadlock
situation can arise if the following four conditions hold simultaneously in a
system:
For example, consider a system with 12 tape drives and three processes: P0, P1
and P2. P0 may require 10 tape drives during execution, P1 may require 4, and
P2 may require up to 9. Suppose that at some moment in time, P0 is holding on
to 5 tape drives, P1 holds 2 and P2 holds 2 tape drives. The system is said to be
in a safe state, since there is a safe sequence that avoids the deadlock. This
sequence implies that P1 can instantly get all of its needed resources (there are
12 total tape drives, and P1 already has 2, so the maximum it needs is 2, which
79
Introduction to Operating it can get since there are 3 free tape drives). Once it finishes executing, it
Systems and Process
Management releases all 4 resources, which makes for 5 free tape drives, at which point, P0
can execute (since the maximum it needs is 10), after it finishes, P2 can proceed
since the maximum it needs is 9.
Now, here’s an unsafe sequence: Let’s say at some point of time P2 requests one more
resource to make its holding resources 3. Now the system is in an unsafe state, since
only P1 can be allocated resources, and after it returns, it will only leave 4 free
resources, which is not enough for either P0 or P2, so the system enters a deadlock.
80