Operating System II Lecture Material
Operating System II Lecture Material
Concurrency: States and State diagram Structures, Dispatching and context switching; interrupts;
Concurrent execution; Mutual exclusion problem and some solution Deadlock; Models and mechanisms
(Semaphores, monitors etc.). Producer – consumer Problems & Synchronization. Multiprocessor issues.
Scheduling & dispatching, Memory Management: Overlays, Swapping and Partitions, Paging and
Segmentation Placement & replacement policies, working sets and Trashing, caching.
OPERATING SYSTEM II
PROCESSES
A process is basically a program in execution. The execution of a process must
progress in a sequential fashion.
A process is defined as an entity which represents the basic unit of work to be
implemented in the system.
To put it in simple terms, we write our computer programs in a text file and when
we execute this program, it becomes a process which performs all the tasks in the
program.
When a program is loaded into the memory it becomes a process, which is divided
into four sections: stack, heap, text and data.
Stack: The process Stack contains the temporary data such as method/function parameters,
return address and local variables.
Heap: This is dynamically allocated memory to a process during its run time.
Text: This includes the current activity represented by the value of Program Counter and the
contents of the processor's registers.
ii. Ready queue: This queue keeps a set of all processes residing in main memory, ready
and waiting to execute. A new process is always put in this queue.
iii. Device queues: The processes which are blocked due to unavailability of an I/O device
constitute this queue.
The OS can use different policies to manage each queue (FIFO, Round Robin,
Priority, etc.). The OS scheduler determines how to move processes between the
ready and run queues which can only have one entry per processor core on the
system, which has been merged with the CPU as shown in Figure 4. When a process
is interrupted, it is transferred in the waiting queue. If the process has completed or aborted, it
is discarded. In either case, the dispatcher then selects a process from the queue to execute.
Schedulers
Schedulers are special system software which handles process scheduling in various
ways. Their main task is to select the jobs to be submitted into the system and to
decide which process to run. Schedulers are of three types:
i. Long Term Scheduler: It is also called a job scheduler. A long-term
scheduler determines which programs are admitted to the system for
processing. It selects processes from the queue and loads them into
memory for execution. Process loads into the memory for CPU scheduling.
The primary objective of the job scheduler is to provide a balanced mix of jobs,
such as I/O bound and processor bound. It also controls the degree of
multiprogramming. If the degree of multiprogramming is stable, then the
average rate of process creation must be equal to the average departure
rate of processes leaving the system.
On some systems, the long-term scheduler may not be available or minimal.
Time-sharing operating systems have no long term scheduler. When a
process changes the state from new to ready, then there is use of
long-term scheduler.
ii. Short Term Scheduler: It is also called as CPU scheduler. Its main
objective is to increase system performance in accordance with the chosen
set of criteria. It is the change of ready state to running state of the
process. CPU scheduler selects a process among the processes that are
ready to execute and allocates CPU to one of them.
Short-term schedulers, also known as dispatchers, make the decision of which
process to execute next. Short-term schedulers are faster than long-term
schedulers.
iii. Medium Term Scheduler: Medium-term scheduling is a part
of swapping. It removes the processes from the memory. It reduces the
degree of multiprogramming. The medium-term scheduler is in-charge of
handling the swapped out-processes.
A running process may become suspended if it makes an I/O request. A suspended
process cannot make any progress towards completion. In this condition,
to remove the process from memory and make space for other processes,
the suspended process is moved to the secondary storage. This process is
called swapping, and the process is said to be swapped out or rolled out.
Swapping may be necessary to improve the process mix.
Comparison among Scheduler
S.N. Long-Term Scheduler Short-Term Scheduler Medium-Term Scheduler
1 It is a job scheduler It is a CPU scheduler It is a process swapping scheduler.
2 Speed is lesser than Speed is fastest among Speed is in between both short and
short term scheduler other two long term scheduler.
3 It controls the degree of It provides lesser control It reduces the degree of
multiprogramming over degree of multiprogramming.
multiprogramming
4 It is almost absent or It is also minimal in time It is a part of Time sharing systems.
minimal in time sharing sharing system
system
5 It selects processes It selects those It can re-introduce the process into
from pool and loads processes which are memory and execution can be
them into memory for ready to execute continued.
execution
Context Switch
A context switch is the mechanism to store and restore the state or context of a
CPU in Process Control block so that a process execution can be resumed from the
same point at a later time. Using this technique, a context switcher enables
multiple processes to share a single CPU. Context switching is an essential part of a
multitasking operating system features.
When the scheduler switches the CPU from executing one process to execute
another, the state from the current running process is stored into the process
control block. After this, the state for the process to run next is loaded from its own
PCB and used to set the PC, registers, etc. At that point, the second process can
start executing.
● Program Counter
● Scheduling information
● Base and limit register value
● Currently used register
● Changed State
● I/O State information
● Accounting information
Scheduling algorithms
A Process Scheduler schedules different processes to be assigned to the CPU based
on particular scheduling algorithms. There are six popular process scheduling
algorithms which we are going to discuss:
● Easy to implement in Batch systems where required CPU time is known in advance.
● Impossible to implement in interactive systems where required CPU time is not known.
● The processer should know in advance how much time process will take.
● Each process is assigned a priority. Process with highest priority is to be executed first
and so on.
● Processes with same priority are executed on first come first served basis.
● Priority can be decided based on memory requirements, time requirements or any other
resource requirement.
● The processor is allocated to the job closest to completion but it can be preempted by a
newer ready job with shorter time to completion.
● Impossible to implement in interactive systems where required CPU time is not known.
● It is often used in batch environments where short jobs need to give preference.
● Once a process is executed for a given time period, it is preempted and other process
executes for a given time period.
Advantages of Thread
● Threads minimize the context switching time.
● Use of threads provides concurrency within a process.
● Efficient communication.
● It is more economical to create and context switch threads.
● Threads allow utilization of multiprocessor architectures to a greater scale and efficiency.
Types of Thread
Threads are implemented in two ways:
i. User Level Threads
In this case, the thread management kernel is not aware of the existence of
threads. The thread library contains code for creating and destroying
threads, for passing message and data between threads, for scheduling
thread execution and for saving and restoring thread contexts. The
application starts with a single thread.
Advantages
● Thread switching does not require Kernel mode privileges.
● User level thread can run on any operating system.
● Scheduling can be application specific in the user level thread.
● User level threads are fast to create and manage.
Disadvantages
● In a typical operating system, most system calls are blocking.
● Multithreaded application cannot take advantage of multiprocessing.
ii. Kernel Level Threads
In this case, thread management is done by the Kernel. There is no thread
management code in the application area. Kernel threads are supported
directly by the operating system. Any application can be programmed to
be multithreaded. All of the threads within an application are supported
within a single process.
The Kernel maintains context information for the process as a whole and for
individuals threads within the process. Scheduling by the Kernel is done on
a thread basis. The Kernel performs thread creation, scheduling and
management in Kernel space. Kernel threads are generally slower to
create and manage than the user threads.
Advantages
● Kernel can simultaneously schedule multiple threads from the same process on multiple
processes.
● If one thread in a process is blocked, the Kernel can schedule another thread of the same
process.
● Kernel routines themselves can be multithreaded.
Disadvantages
● Kernel threads are generally slower to create and manage than the user threads.
● Transfer of control from one thread to another within the same process requires a mode
switch to the Kernel.
Multithreading Models
Some operating systems provide a combined user level thread and Kernel level
thread facility. Solaris is a good example of this combined approach. In a combined
system, multiple threads within the same application can run in parallel on multiple
processors and a blocking system call need not block the entire process.
Multithreading models are three types: M any to many relationship, Many to one
relationship and One to one relationship.
Many to Many Model: The many-to-many model multiplexes any number of user
threads onto an equal or smaller number of kernel threads. Figure 6 shows the
many-to-many threading model where 6 user level threads are multiplexing with 6
kernel level threads. In this model, developers can create as many user threads as
necessary and the corresponding Kernel threads can run in parallel on a
multiprocessor machine. This model provides the best accuracy on concurrency and
when a thread performs a blocking system call, the kernel can schedule another
thread for execution.
Figure 6: Many to Many Multithreaded Model
Many to One Model: Many-to-one model maps many user level threads to one
Kernel-level thread. Thread management is done in user space by the thread
library. When thread makes a blocking system call, the entire process will be
blocked. Only one thread can access the Kernel at a time, so multiple threads are
unable to run in parallel on multiprocessors.
If the user-level thread libraries are implemented in the operating system in such a
way that the system does not support them, then the Kernel threads use the
many-to-one relationship modes. Figure 7 shows a many to one multi-threaded
model.
Figure 7: Many to one Multi-threaded Model
MEMORY MANAGEMENT
Memory management is the functionality of an operating system which handles or
manages primary memory and moves processes back and forth between main
memory and disk during execution. Memory management keeps track of each and
every memory location, regardless of either it is allocated to some process or it is
free. It checks how much memory is to be allocated to processes. It decides which
process will get memory at what time. It tracks whenever some memory gets freed
or unallocated and correspondingly it updates the status.
Process Address Space
The process address space is the set of logical addresses that a process references
in its code. For example, when 32-bit addressing is in use, addresses can range
from 0 to 0x7fffffff; that is, 2^31 possible numbers, for a total theoretical size of 2
gigabytes.
The operating system takes care of mapping the logical addresses to physical
addresses at the time of memory allocation to the program. There are three types
of addresses used in a program before and after memory is allocated.
i. Symbolic addresses: The addresses used in a source code. The variable names, constants,
and instruction labels are the basic elements of the symbolic address space.
ii. Relative addresses: At the time of compilation, a compiler converts symbolic addresses
into relative addresses.
iii. Physical addresses: The loader generates these addresses at the time when a program is
loaded into main memory.
Virtual and physical addresses are the same in compile-time and load-time
address-binding schemes. Virtual and physical addresses differ in execution-time
address-binding scheme.
The set of all logical addresses generated by a program is referred to as a logical
address space. The set of all physical addresses corresponding to these logical
addresses is referred to as a physical address space.
The runtime mapping from virtual to physical address is done by the memory
management unit (MMU) which is a hardware device using the following
mechanism.
● The value in the base register is added to every address generated by a user process,
which is treated as offset at the time it is sent to memory. For example, if the base
register value is 10000, then an attempt by the user to use address location 100 will be
dynamically reallocated to location 10100.
● The user program deals with virtual addresses; it never sees the real physical
addresses.
The total time taken by swapping process includes the time it takes to move the
entire process to a secondary disk and then to copy the process back to memory,
as well as the time the process takes to regain main memory.
Let us assume that the user process is of size 2048KB and on a standard hard disk
where swapping will take place has a data transfer rate around 1 MB per second.
The actual transfer of the 1000K process to or from memory will take
ii. Multiple-partition allocation: In this type of allocation, main memory is divided into a
number of fixed-sized partitions where each partition should contain only one process. When a
partition is free, a process is selected from the input queue and is loaded into the free partition.
When the process terminates, the partition becomes available for another process.
Fragmentation
As processes are loaded and removed from memory, the free memory space is
broken into little pieces. It happens after sometimes that processes cannot be
allocated to memory blocks considering their small size and memory blocks
remains unused. This problem is known as Fragmentation. There are two types of
fragmentation.
i. External fragmentation: Total memory space is enough to satisfy a request or to reside a
process in it, but it is not contiguous, so it cannot be used.
ii. Internal fragmentation: Memory block assigned to process is bigger. Some portion of
memory is left unused, as it cannot be used by another process.
Figure 9 shows how fragmentation can cause waste of memory and a compaction
technique can be used to create more free memory out of fragmented memory.
Address Translation
Page address is called logical address and represented by page number and
the offset.
When the system allocates a frame to any page, it translates this logical address
into a physical address and create entry into the page table to be used throughout
execution of the program.
When a process is to be executed, its corresponding pages are loaded into any
available memory frames. Suppose you have a program of 8Kb but your memory
can accommodate only 5Kb at a given point in time, then the paging concept will
come into picture. When a computer runs out of RAM, the operating system (OS)
will move idle or unwanted pages of memory to secondary memory to free up RAM
for other processes and brings them back when needed by the program.
This process continues during the whole execution of the program where the OS
keeps removing idle pages from the main memory and write them onto the
secondary memory and bring them back when required by the program.
Advantages and Disadvantages of Paging
● Paging reduces external fragmentation, but still suffer from internal fragmentation.
● Due to equal size of the pages and frames, swapping becomes very easy.
● Page table requires extra memory space, so may not be good for a system having small
RAM.
Segmentation
Segmentation is a memory management technique in which each job is divided into
several segments of different sizes, one for each module that contains pieces that
perform related functions. Each segment is actually a different logical address
space of the program.
When a process is to be executed, its corresponding segmentation are loaded into
non-contiguous memory though every segment is loaded into a contiguous block of
available memory.
Segmentation memory management works very similar to paging but here
segments are of variable-length where as in paging pages are of fixed size.
A program segment contains the program's main function, utility functions, data
structures, and so on. The operating system maintains a segment map table for
every process and a list of free memory blocks along with segment numbers, their
size and corresponding memory locations in main memory. For each segment, the
table stores the starting address of the segment and the length of the segment. A
reference to a memory location includes a value that identifies a segment and an
offset. Figure 12 illustrates segmentation technique.
● Many tables are assigned a fixed amount of address space even though only a small
amount of the table is actually used.
● The ability to execute a program that is only partially in memory would counter many
benefits.
● Less number of I/O would be needed to load or swap each user program into memory.
● Each user program could take less physical memory, more programs could be run the
same time, with a corresponding increase in CPU utilization and throughput.
While executing a program, if the program references a page which is not available
in the main memory because it was swapped out a little ago, the processor treats
this invalid memory reference as a page fault and transfers control from the
program to the operating system to demand the page back into the memory.
Advantages
● Large virtual memory.
● More efficient use of memory.
● There is no limit on degree of multiprogramming.
Disadvantages
● Number of tables and the amount of processor overhead for handling page interrupts
are greater than in the case of the simple paged management techniques.
Page Replacement Algorithm
Page replacement algorithms are the techniques using which an Operating System
decides which memory pages to swap out, write to disk when a page of memory
needs to be allocated. Paging happens whenever a page fault occurs and a free
page cannot be used for allocation purpose accounting to reason that pages are not
available or the number of free pages is lower than required pages.
When the page that was selected for replacement and was paged out, is referenced
again, it has to read in from disk, and this requires for I/O completion. This process
determines the quality of the page replacement algorithm: the lesser the time
waiting for page-ins, the better is the algorithm.
A page replacement algorithm looks at the limited information about accessing the
pages provided by hardware, and tries to select which pages should be replaced to
minimize the total number of page misses, while balancing it with the costs of
primary storage and processor time of the algorithm itself. There are many
different page replacement algorithms. We evaluate an algorithm by running it on a
particular string of memory reference and computing the number of page faults,
Reference String
The string of memory references is called reference string. Reference strings are
generated artificially or by tracing a given system and recording the address of
each memory reference. The latter choice produces a large number of data, where
we note two things.
● For a given page size, we need to consider only the page number, not the entire
address.
● Easy to implement, keep a list, replace pages from the tail and add new pages at the
head.
Optimal Page algorithm
● An optimal page-replacement algorithm has the lowest page-fault rate of all algorithms.
An optimal page-replacement algorithm exists, and has been called OPT or MIN.
● Replace the page that will not be used for the longest period of time. Use the time when
a page is to be used.
● Easy to implement, keep a list, replace pages by looking back into time.
Page Buffering algorithm
● This algorithm suffers from the situation in which a page is used heavily during the initial
phase of a process, but then is never used again.
I/O HARDWARE
One of the important jobs of an Operating System is to manage various I/O devices
including mouse, keyboards, touch pad, disk drives, display adapters, USB devices,
Bit-mapped screen, LED, Analog-to-digital converter, On/off switch, network
connections, audio I/O, printers etc.
An I/O system is required to take an application I/O request and send it to the
physical device, then take whatever response comes back from the device and
send it to the application. I/O devices can be divided into two categories −
● Block devices − A block device is one with which the driver communicates by sending
entire blocks of data. For example, Hard disks, USB cameras, Disk-On-Key etc.
● Character devices − A character device is one with which the driver communicates by
sending and receiving single characters (bytes, octets). For example, serial ports,
parallel ports, sounds cards etc
Device Controllers
Device drivers are software modules that can be plugged into an OS to handle a
particular device. Operating System takes help from device drivers to handle all I/O
devices.
The Device Controller works like an interface between a device and a device driver.
I/O units (Keyboard, mouse, printer, etc.) typically consist of a mechanical
component and an electronic component where electronic component is called the
device controller.
There is always a device controller and a device driver for each device to
communicate with the Operating Systems. A device controller may be able to
handle multiple devices. As an interface its main task is to convert serial bit stream
to block of bytes, perform error correction as necessary.
Any device connected to the computer is connected by a plug and socket, and the
socket is connected to a device controller. Figure 15 shows a model for connecting
the CPU, memory, controllers, and I/O devices where CPU and device controllers all
use a common bus for communication.
Figure 15: Model for connecting CPU, Memory, controllers and I/O devices
While using memory mapped IO, OS allocates buffer in memory and informs I/O
device to use that buffer to send data to the CPU. I/O device operates
asynchronously with CPU, interrupts CPU when finished.
The advantage to this method is that every instruction which can access memory
can be used to manipulate an I/O device. Memory mapped IO is used for most
high-speed I/O devices like disks, communication interfaces.
Direct Memory Access (DMA): Slow devices like keyboards will generate an
interrupt to the main CPU after each byte is transferred. If a fast device such as a
disk generated an interrupt for each byte, the operating system would spend most
of its time handling these interrupts. So a typical computer uses direct memory
access (DMA) hardware to reduce this overhead.
Direct Memory Access (DMA) means CPU grants I/O module authority to read from
or write to memory without involvement. DMA module itself controls exchange of
data between main memory and the I/O device. CPU is only involved at the
beginning and end of the transfer and interrupted only after entire block has been
transferred.
Direct Memory Access needs a special hardware called DMA controller (DMAC) that
manages the data transfers and arbitrates access to the system bus. The
controllers are programmed with source and destination pointers (where to
read/write the data), counters to track the number of transferred bytes, and
settings, which includes I/O and memory types, interrupts and states for the CPU
cycles.
● Kernel Level Modules − This provides device driver to interact with the device
controller and device independent I/O modules used by the device drivers.
● Hardware − This layer includes actual hardware and hardware controller which interact
with the device drivers and makes hardware alive.
A key concept in the design of I/O software is that it should be device independent
where it should be possible to write programs that can access any I/O device
without having to specify the device in advance. For example, a program that reads
a file as input should be able to read a file on a floppy disk, on a hard disk, or on a
CD-ROM, without having to modify the program for each different device.
Device Drivers
Device drivers are software modules that can be plugged into an OS to handle a
particular device. Operating System takes help from device drivers to handle all I/O
devices. Device drivers encapsulate device-dependent code and implement a
standard interface in such a way that code contains device-specific register
reads/writes. Device driver, is generally written by the device's manufacturer and
delivered along with the device on a CD-ROM.
A device driver performs the following jobs −
● Buffering − Kernel I/O Subsystem maintains a memory area known as buffer that
stores data while they are transferred between two devices or between a device with an
application operation. Buffering is done to cope with a speed mismatch between the
producer and consumer of a data stream or to adapt between devices that have different
data transfer sizes.
● Caching − Kernel maintains cache memory which is region of fast memory that holds
copies of data. Access to the cached copy is more efficient than access to the original.
● Spooling and Device Reservation − A spool is a buffer that holds output for a device,
such as a printer, that cannot accept interleaved data streams. The spooling system
copies the queued spool files to the printer one at a time. In some operating systems,
spooling is managed by a system daemon process. In other operating systems, it is
handled by an in kernel thread.
● Error Handling − An operating system that uses protected memory can guard against
many kinds of hardware and application errors.
FILE SYSTEM
File
A file is a named collection of related information that is recorded on secondary
storage such as magnetic disks, magnetic tapes and optical disks. In general, a file
is a sequence of bits, bytes, lines or records whose meaning is defined by the files
creator and user.
File Structure
A File Structure should be according to a required format that the operating system
can understand.
● A file has a certain defined structure according to its type.
● An object file is a sequence of bytes organized into blocks that are understandable by
the machine.
● When operating system defines different file structures, it also contains the code to
support these file structure. Unix, MS-DOS support minimum number of file structure.
File Type
File type refers to the ability of the operating system to distinguish different types
of file such as text files source files and binary files etc. Many operating systems
support many types of files. Operating system like MS-DOS and UNIX have the
following types of files −
Ordinary files
● These files contain list of file names and other information related to these files.
Special files
● Block special files − data is handled in blocks as in the case of disks and tapes.
● Sequential access
● Direct/Random access
● Indexed sequential access
Sequential access
A sequential access is that in which the records are accessed in some sequence,
i.e., the information in the file is processed in order, one record after the other.
This access method is the most primitive one. Example: Compilers usually access
files in this fashion.
Direct/Random access
● Random access file organization provides, accessing the records directly.
● Each record has its own address on the file with by the help of which it can be directly
accessed for reading or writing.
● The records need not be in any sequence within the file and they need not be in
adjacent locations on the storage medium.
● Contiguous Allocation
● Linked Allocation
● Indexed Allocation
Contiguous Allocation
● System Library − System libraries are special functions or programs using which
application programs or system utilities accesses Kernel's features. These libraries
implement most of the functionalities of the operating system and do not requires kernel
module's code access rights.
● Open Source − Linux source code is freely available and it is community based
development project. Multiple teams work in collaboration to enhance the capability of
Linux operating system and it is continuously evolving.
● Multi-User − Linux is a multiuser system means multiple users can access system
resources like memory/ ram/ application programs at same time.
● Hierarchical File System − Linux provides a standard file structure in which system
files/ user files are arranged.
● Shell − Linux provides a special interpreter program which can be used to execute
commands of the operating system. It can be used to do various types of operations,
call application programs. etc.
● Security − Linux provides user security using authentication features like password
protection/ controlled access to specific files/ encryption of data.
Architecture
The following illustration shows the architecture of a Linux system −
● Shell − An interface to kernel, hiding complexity of kernel's functions from users. The
shell takes commands from the user and executes kernel's functions.
● Utilities − Utility programs that provide the user most of the functionalities of an
operating systems.