Our design currently requires no specialized operating system support (other
than the prefetching system and strictly prioritized kernel threads)
and is appropriate for single-threaded applications. The basic element in
our current design is the addition of a new kernel thread to the application.
We call this thread the speculating thread, and its purpose is to
perform speculative execution while the ``original'' application thread is
stalled. We ensure that the speculating thread only executes when the
original thread is stalled by assigning the speculating thread a low priority
and selecting a preemptive scheduling policy which
time-slices amongst only the highest priority runnable threads. A hint
call is issued by the speculating thread whenever it encounters a read call.