Input /
Output and I/O Strategies
The
Four Major Input / Output Strategies
Preliminary Definitions
A Silly Example to Illustrate
Basic Definitions
A
Context for Advanced I/O Strategies
The Four
Strategies
Here
are the simple definitions of the four I/O strategies.
Program Controlled I/O
This is the simplest to
implement. The executing program manages
every aspect of I/O processing. I/O
occurs only when the program calls for it.
If the I/O device is not ready to perform its function, the CPU waits for
it to be ready; this is “busy waiting”.
The next two strategies are
built upon program controlled I/O.
Interrupt Driven I/O
In this variant, the I/O device can
raise a signal called an “interrupt”
when it is ready to perform input or output.
The CPU performs the I/O only when the device is ready for it.
In
some cases, this interrupt can be viewed as an alarm, indicating an undesirable
event.
Direct Memory Access
This variant elaborates on the two
above. The I/O device interrupts and is
sent a “word count” and starting address by the CPU. The transfer takes place as a block.
I/O Channel
This assigns I/O to a separate
processor, which uses one of the above three strategies.
I/O
Strategies: A Silly Example
I
am giving a party to which a number of people are invited. I know exactly
how many people will attend.
I
know that the guests will not arrive before 6:00 PM.
All
guests will enter through my front door.
In addition to the regular door (which can be locked), it has a screen
door and a doorbell.
I
have ordered pizzas and beer, each to be delivered. All deliveries at the back door.
I
must divide my time between baking cookies for the party and going to the door
to let the visitors into the
house.
I
am a careless cook and often burn the cookies.
We
now give the example, by I/O categories.
The Silly
Example
Program Controlled
Here
I go to the door at 6:00 PM and wait.
As
each one arrives, I open the door and admit the guest.
I
do not leave the door until the last guest has arrived; nothing gets done in
the kitchen.
Interrupt Driven
Here
I make use of the fact that the door has a doorbell. I continue working in the kitchen until I
hear the doorbell.
When
the doorbell rings, I put down my work, go to the door, and admit the guest.
Note
1: I do not “drop” the work, but bring
it to a quick and orderly conclusion.
If I am removing cookies
from the oven, I place them in a safe place to
cool before
answering the door.
Note
2: If I am fighting a grease fire, I
ignore the doorbell and first put out the
fire. Only when it is safe do I attend to the door.
Note
3: With a guest at the front door and
the beer truck at the back door, I
have a difficult choice,
but I must attend to each quickly.
The Silly
Example (Part 2)
Direct Memory Access
I
continue work in the kitchen until the first guest arrives and rings the
doorbell.
At
that point, I take a basket and place a some small gifts into it, one for each
guest.
I
go to the door, unlock it, admit the guest and give the first present.
I
leave the main door open. I place the
basket of gifts outside, with instructions that each guest take one gift and
come into the house without ringing the doorbell.
There
is a sign above the basket asking the guest taking the last gift to notify me,
so that I can return to the front door and close it again.
In
the Interrupt Driven analog, I had to go to the door once for each guest.
In the DMA analog, I had to go to the door only twice.
I/O Channel
Here,
I hire a butler and tell him to manage the door any way he wants.
He just has to get the guests into the party and keep them happy.
Another
Simple Example
We
first examine program controlled I/O. We
give an example that appears to be correct, but which hides a real flaw. This flaw rarely appears in a
high–level–language program.
We
are using the primitive command “Input” to read from a dedicated input
device. It is the ASCII codes for
characters that are read, with a 0 used to indicate no more input.
Input
Skip
if AC > 0
Jump
Done
Loop: Store
X[J] // Not really a MARIE instruction
J = J
+ 1 // Again pseudocode
Input
Skip
if AC = = 0
Jump
Loop // Go back and get another.
Done: Continue
What’s wrong? Simply put,
what is the guarantee that the dedicated input device
has a new
character ready when the next Input is executed?
Program
Controlled Input and the Busy Wait
Each
input or output device must have at least three registers.
Status Register
This
allows the CPU to determine a number of status issues.
Is the device ready? Is its power on? Are there any device errors?
Does the device have new data to
input? Is the device ready for output?
Control Register
Enable
the device to raise an interrupt when it is ready to move data.
Instruct a printer to follow every
<LF> with a <CR>.
Move the read/write heads on a
disk.
Data Register
Whatever
data is to be transferred.
Suppose
our dedicated input device has three registers, including Device_Status
which is greater than zero if and only if there is a character ready to be
input.
Busy: Input Device_Status
Skip if AC > 0
Jump Busy
Input Device_Data
When Is
Program Controlled I/O Appropriate?
Basically
put, it is appropriate only when the I/O action can proceed immediately.
There are two standard cases in which this might be used successfully.
1. The device can respond immediately when
polled for input.
For example, consider an
electronic sensor monitoring temperature or pressure.
(However, we shall want these
sensors to be able to raise interrupts).
2. When a device has already raised an
interrupt, indicating that it is ready to
process data.
In
a modern computer, the basic I/O instructions (Input and Output for the MARIE)
are considered privileged. They may be
issued only by the Operating System.
User
programs issue “traps” to the operating system to access these
instructions. These are system calls in
a standardized fashion that is easily interpreted by system programs.
Diversion:
Processes Management
We
now must place the three advanced I/O strategies within the proper context
in order to see why we even bother with them.
We
use a early strategy, called “Time
Sharing” to illustrate the process management associated with handling
interrupts and direct memory access.
In
the Time Sharing model, we have
1. A
single computer with its CPU, memory, and sharable I/O resources,
2. A
number of computer terminals attached to the CPU, and
3. A
number of users, each of whom wants to use the computer.
In
order to share this expensive computer more fairly, we establish two rules.
1. Each user process is allocated a “time slice”, during which it can be
run.
At the end of this time, it must
give up the CPU, go to the “back of the line”
and await its turn for another
time slice.
2. When a process is blocked and waiting on
completion of either input or output,
it must give up the CPU and cannot
run until the I/O has been completed.
With
this convention, each user typically thinks he or she is the only one using the
computer. Thus the computer is “time shared”.
The Classis
Process Diagram
Here
is the standard process state diagram associated with modern operating systems.
When
a process (think “user program”) executes an I/O trap instruction (remember
that it cannot execute the I/O directly), the O/S suspends its operation &
starts I/O on its behalf.
When
the I/O is complete, the O/S marks the process as “ready to run”. It will be assigned to the CPU when it next
becomes available.
The Three
“Actors” for Input
User Program Operating System Input Device
Input
(Is blocked) Block
the process
Reset
the input status register Status =
0
Enable
the device interrupt Interrupt
is enabled
Command
the input Input
begins
Dispatch
another process
Input
is complete
Raise
interrupt
Acknowledge
interrupt
Input
(place data into AC)
Place
data into buffer for process
Mark
the process as ready to run
Copy from buffer
Resume
processing Obviously, there is more to it than this.
What is DMA?
Remember
that Main Memory is accessed through two registers and some control signals
MAR Memory
Address Register
MBR Memory
Buffer Register (holds the data)
READ and WRITE If one is true, the memory is either written or read.
If
both are true, only one action is performed.
The
CPU normally issues these signals. This
holds for both program controlled I/O and interrupt driven I/O. In DMA, the device controller issues these
signals.
A
DMA controller is one that can directly manipulate memory.
But
suppose a fast disk wants to transfer a 512–byte block of data to memory. It would not be efficient to have 512
interrupts.
Scenario: 1. The
disk raises an interrupt and the CPU responds.
2. The device driver sends a start address and
byte count to the
disk
controller, which connects the disk to the bus.
3. The disk transfers its block of data
directly to memory.
4. The disk again raises an interrupt when it
is complete.