We have modified Mach 3.0 to treat cross-domain remote procedure call (RPC) as
a single entity, instead of a sequence of message passing operations. With RPC
thus elevated, we improved the transfer of control during RPC by changing the
thread model. Like most operating systems, Mach views threads as statically
associated with a single task, with two threads involved in an RPC. An
alternate model is that of migrating threads, in which, during RPC, a single
thread abstraction moves between tasks with the logical flow of control, and
“server” code is passively executed. We have compatibly replaced
Mach's static threads with migrating threads, in an attempt to isolate this
aspect of operating system design and implementation. The key element of our
design is a decoupling of the thread abstraction into the execution context and
the schedulable thread of control, consisting of a chain of contexts. A key
element of our implementation is that threads are now “based” in
the kernel, and temporarily make excursions into tasks via upcalls. The new
system provides more precisely defined semantics for thread manipulation and
additional control operations, allows scheduling and accounting attributes to
follow threads, simplifies kernel code, and improves RPC performance. We have
retained the old thread and IPC interfaces for backwards compatibility, with no
changes required to existing client programs and only a minimal change to
servers, as demonstrated by a functional Unix single server and clients. The
logical complexity along the critical RPC path has been reduced by a factor of
nine. Local RPC, doing normal marshaling, has sped up by factors of 1.7 to
3.4. We conclude that a migrating-thread model is superior to a static model,
that kernel-visible RPC is a prerequisite for this improvement, and that it is
feasible to improve existing operating systems in this manner.