Henry Massalin & Calton Pu @ Columbia Univ
Proceedings of the 12th ACM Symposium on OS Principles, 1995
Design goals
|
|||||||||||
Problems & solutions
|
Model: a von Neumann machine with threads, memory protection boundary, and I/O devices |
|||||||||||
Thread graph
|
|||||||||||
Thread
|
|||||||||||
I/O devices move data between threads |
Code synthesizer generates special versions of code for specific situations |
|||||||||||||
Methods of code synthesize
|
Synthesis kernel is composed of quajects |
|||||||||||||||||||||||||||||||
Quaject
|
|||||||||||||||||||||||||||||||
Building blocks
|
|||||||||||||||||||||||||||||||
Quaject creation
|
|||||||||||||||||||||||||||||||
Quaject execution
|
Code Isolation: If two process works on different parts of the shared data, why synchronize?
|
|||||||
Procedure Chaining
|
|||||||
Optimistic Synchronization - Interference between threads is rare. So,
|
SP-SC (Single Producer & Single Consumer): Fig-1
|
|||||||||||||
MP-SC: Multiple producer & single consumer, atomic insertion of multiple item
|
Synthesis thread - lightweight process |
|||||||||||||||||
Each thread executes in a context, which is called TTE and has fields:
|
|||||||||||||||||
Unix like system call handling |
|||||||||||||||||
Waiting list per resource |
Floating-pointer registers are not saved during the context switch, on the assumption that ordinary threads do not use any of them
|
|||||||
No 'dispatcher' procedure
|
Unix-like signal handling |
|
Debug support by signal |
|
User threads can catch error trap and handles it as it does signals! |
Policy
|
|||||
Priority
|
I/O - all data flow among hardware devices and quaspaces |
|
Stream - data move along logical channels, which connect source and destination |
Device server - physical I/O device encapsulated in a quaject |
|||||||||
write - data movement from caller to callee |
|||||||||
read - data movement from callee to caller |
|||||||||
Each device server has its own thread or not |
|||||||||
High-level server may be composed from more basic servers
|
|||||||||
File system server is composed of several filter stages |
Stream model can be described as a composition of different types of consumer/producer |
|||||||||
Passive producer - passive consumer
|
|||||||||
Active-passive
|
|||||||||
Active-active: a queue need to be inserted between producer and consumer
|
Difference from Unix interrupt handling
|
|||||
Interrupt handling is done in the context of the currently running thread |
|||||
Signal handling within interrupt handling routine
|
|||||
Each thread has its own interrupt, trap, system call routines
|
Incremental optimization! | |
Quaject synthesizing seems quite dynamic, right?. Running quajects could be very fast, but what is the overhead of dynamic fabrication of quaject (at run time)? |