\documentstyle[12pt,fullpage]{article}
\title{An End-To-End Argument in Favor of Microkernels}
\author{Greg Hudson}
\begin{document}
\maketitle

The end-to-end principle favors microkernels over monolithic kernels
as a means of reducing unnecessary overhead and increasing
reliability.

Monolithic kernels implement high levels of functionality relative to
microkernels.  Microkernels generally do not implement file systems or
other features not directly related to the hardware.  Monolithic
kernels, by contrast, try to present a reliable, intuitive interface
to the system's hardware.

The end-to-end principle would suggest that this is a good thing,
because many applications do not require the overhead of this
high-level interface.  A database may be able to do a significantly
better job of organizing its data on a disk than the file system
could; a program using network communications may be able to fold
network reliability checks and packet sequencing into higher-level
checking.

Unfortunately, this kind of thinking is very inconvenient for
applications programmers when taken to the extreme.  Given the choice
between a low-level and a high-level interface to a region of
functionality, programmers will usually choose the high-level
interface.  The vast majority of network services use TCP, a reliable
stream protocol, instead of UDP, an unreliable datagram protocol.
Such programs may be able to achieve better efficiency and reliability
by implementing their own retry and sequencing mechanisms on top of
UDP, but it's often not worth the effort.

It's nevertheless very important that UDP is available to programmers
when performance and overall reliability are a serious concern, and
this is why microkernels are useful.  Most microkernel-based operating
systems do provide file systems and reliable network interfaces to the
application programmer, but programmers can circumvent these
mechanisms when the performance improvement is necessary.

\end{document}

