All the Servers You Want
Unlike systems such as XNU and OSF/1, the HURD developers decided to go for a multi-server approach. Rather than having a single process running something like a BSD kernel, they would have different processes for each important subsystem.
This approach offers a number of advantages:
- The most obvious advantage is that it simplifies development, because you can easily restart an important OS component while testing it. This advantage is less obvious now, since most monolithic kernels include some support for virtualization, allowing something similar. For example, Dragonfly BSD, which I discussed in a previous article, has a slightly modified version of the kernel that can run as a process, allowing all of the standard debugging tools to be used.
- Another advantage is parallelism. Since each subsystem is an isolated process, each can run on a separate CPU. All of the locking is done implicitly via the message-passing mechanism, making a multi-server microkernel a very scalable beast. In contrast, traditional monolithic kernels have close ties between kernel components, for performance reasons. A lot of work in Linux and FreeBSD over the last few years has been in the direction of adding the same level of separation that a multi-server microkernel gets by design.
- Isolation is perhaps the biggest advantage. Security in a monolithic kernel is binary; something either runs in kernelspace and can access the entire system, or it runs in userspace and can’t. With HURD, code can have a much finer granularity of permission.