T.R | Title | User | Personal Name | Date | Lines |
---|
4059.1 | operating systems theory | SAUTER::SAUTER | John Sauter | Tue Aug 28 1990 16:23 | 29 |
| It is not the case that after a hardware interrupt return is always
made to the point of interruption. In general, exit from an interrupt
is made through "the scheduler", which decides which task to run next.
If it decides to run the task that was running when the interrupt
was taken, then return is to the point of interruption. However,
if the interrupt code modified some data that the scheduler examines
when making its decision about which task to run next, then return
could be made to a different place.
An example of this is a task which calls a subroutine in the operating
system to read a block of data from a floppy disk. The subroutine
gets the hardware started, sets a flag to indicate that the task is
"blocked", and branches to the scheduler to find a task to run.
When the hardware completes the operation it interrupts whatever task
is running, and the interrupt code clears the "blocked" flag, which
permits the scheduler to allow that task to continue execution.
This "scheduling" approach allows one task to run while another
waits for I/O or for user input. The running task doesn't need to
include calls to the scheduler in its long-running compute bound
loops---those calls are performed by the interrupt code.
The above description is not specific to the Amiga's operating system.
The same theory is used by all multi-tasking operating systems that
I have studied---STSS (PDP-1), MCP (B5000), OS/360 (IBM 360),
TOPS-10 (PDP-10), RSX-11M (PDP-11) and VMS (VAX). The technique has
become so well accepted that it has practically become the definition
of multi tasking.
John Sauter
|
4059.2 | hmmmmmm... | CIMBAD::QUIRICI | | Tue Aug 28 1990 16:53 | 66 |
| thanks for your reply.
it's hard to visualize, especially when you consider that a 'task'
is a piece of code that the cpu is either executing or not. in other
words, all 'tasks' are really just different states of the current
cpu - there's only one cpu, not one per task.
for example, let's suppose there is only one task, and no scheduler;
just a simple loop that's executing over and over:
start_loop:
.
.
.
end_loop;
now suppose we hit a hardware interrupt, say an invalid op-code:
start_loop:
.
.
instruction_a:
instruction_b:
.
.
end_loop:
in the above, instruction_a is actually an invalid op-code.
now the cpu branches to the interrupt handler for this interrupt:
start_handler:
.
.
.
RTI
how can the interrupt handler do anything other than return to
instruction_b in the previous code?
i don't know assembler; can you specify where the interrupt handler
- that chunk of code that the cpu is directed to execute on the
given interrupt - should return to? that seems to be what your saying,
that instead of
RTI
you can have
RTI <address>,
or somehow setup the return address before RTI.
Boy this is a pretty wandering question. if you can figure out what
i'm asking, that would be great; if not, i'll burrow around in some
68000 assembler manuals. my question, upon reflection, is really
not an operating system question, but a cpu/hardware question -
the lowest possible level.
thanks again.
ken
|
4059.3 | | EDABOT::MCAFEE | Steve McAfee | Tue Aug 28 1990 17:27 | 5 |
|
Suppose part of what that interrupt routine does is change the stack
pointer. Then the RTI goes somewhere else...
-steve
|
4059.4 | Even if, interrupts still win... | TENAYA::MWM | | Tue Aug 28 1990 18:12 | 25 |
| Even if your RTI has to go back to the original code, an interrupt-driven
system will still get more throughput than one that uses polling for IO
completion.
First, note that on most systems, task scheduling also happens on return
from a system call. Since many system calls cause a change in a tasks state,
this is just about required.
If you've got the BD RTI-must-return to caller, you can still do non-preemptive
multitasking. In this case, the only scheduling is done on system calls.
All the interrupt handling code does is toggle bits and possibly move
tasks around in the queues. When the program that was running calls the OS,
the scheduling will happen, and something else may get to run before the
system call returns to that task.
What this means is that, for every pending event, you get a burst of activity
when the event happens. Compare this to polling, where you chew up a fixed
percentage of the CPU doing the polling until the event happens, and still have
to do the resched when it happens. The polling may take less CPU, but if you
get a number of them going (one on disks, one on the keyboard, and one on
the serial port because you're logged in elsewhere while doing background
compiles), the overhead on the system might be noticable. There won't be any
extra overhead on the interrupt-driven machine until the event happens.
<mike
|
4059.5 | stack is part of process context | SAUTER::SAUTER | John Sauter | Wed Aug 29 1990 10:36 | 19 |
| re: .3, .4
The critical thing to remember is that each task has its own stack.
When the scheduler decides to run a particular process it loads the
processor's stack pointer register from the place where it was saved
when this task last ran. All of the other user-mode registers are
also saved and restored in this manner, so if you are writing code
to run as a task you can depend on the registers not changing due
to an interrupt, even if that interrupt causes a different task to
run for a while.
After the stack pointer register is loaded, the instruction which
returns from the interrupt will return to the desired task.
Not all machines have instruction sets which deal with stacks
explicitly. Those multi-tasking operating systems which run using
such non-stack-aware instruction sets simulate the stack using other
instructions.
John Sauter
|
4059.6 | Interrupts (68000 hardly ever sees 'em). | SDOGUS::WILLIAMS | TOPGUN | Wed Aug 29 1990 16:51 | 35 |
| It is important to remember that the Amiga is (more than anyother
machine you have probably seen) a true Hardware "DISTRIBUTED" arch.
As an example, if you obey the normal system rules about EXEC, then
the 68000 only responds to two interrupts, non-maskable and software.
The other interrupts are handled by exec and you must place your
interrupt routines in the exec queue to be processed (as per their
priority).
If the question is why is an interrupt structure higher in thruput
than a polling system the answer is that it is ansynch to the needs
of the resources (responds when needed). Polling PREVENTS you from
responding when NEEDED and requires you to only respond when the
current resource request is satisfied.
If the question is HOW do you create an interrupt structure that
does not return to the same place after a interrupt occurs (or better
question...what state does a machine have to be in to allow interrupts)
then you might want to examine the instruction arch of several
different machines. Some machines institute a non-interruptable
instruction (the interrupt is held off until completion of the
instruction). Others enforce the structure of the environment and
require you to not alter the environ at all, etc. There are lots
of ways to do this interrupt stuff.
For an excellent discussion of the exec and the interrupts arch
on the Amiga, you might read a book by Carl Sasenrath called Guru
Medatations #1 ($15.00 [US] about and if you can't find it, just
send me mail and I'll get you the address of a place you can obtain
it). Carl designed and helped code the EXEC for the Amiga and his
explanations are crystal clear!
Holler if there are any questions.
TOPGUN
|
4059.7 | thanks | CIMBAD::QUIRICI | | Wed Aug 29 1990 18:35 | 5 |
| i'm going to extract all these replies and try to understand 'em.
thanks for all this meaty info!
ken
|
4059.8 | Interrupts avoid lost events. | VCSESU::MOORE | Tom Moore MRO1-3/SL1 297-5224 | Thu Aug 30 1990 10:57 | 13 |
| It should also be pointed out that a major feature of interrupts is
preventing data overrun or other errors where an asynchronous event is
not serviced in time. Interrupt routines are designed to capture
volatile data including state and then schedule further processing.
Systems that poll and are used for general processing are difficult to
implement because it is diffcult to enforce the minimum time between
polling cycles. Real time systems that require very fast response times
can sometimes do better by polling because they do not have to suffer
the overhead of the required context switching to service the interrupt.
Hope this adds some more incite into the value of interrupts.
-Tom-
|