With few notable exceptions (GrassHopper) most systems have simple tables of processes managed by a dedicated component. This scheme is ugly, inflexible, not ExoKernel, and works only in a very narrow and limited sense.
The solution is obviously to generalize the data structure involved. Instead of a set or ordered collection, use a tree. Instead of a set of independent processes in a single predefined location, have an extensible set of nested processes defining their own locations.
What that means precisely is that within TheObjectGraph which any process exports, one can find the building blocks (code, data, et cetera) for an executable process which the nesting process can call upon at will.
There are at least three ways of implementing nested processes.
First is the way grasshopper did it.
Second involves a simple yet high-level model of execution. Processes exist within other processes, but they are made live by the scheduler which loads them into memory, executes them, then stores them back wherever they belong. Sending a message into a process requires the component to send a message outside of itself to the scheduler. Sending a message outside of a process (to the component that contains it) requires defining a primitive intercomponent send operation that sends the requested message to a process-specific edge in the scheduler. This scheme has the disadvantages of being inelegant, non-local, centralized, not exokernel, and causing infinite regress.
MacOs prior to MacOsX made processes responsible for their own scheduling. It was a disaster, and avoiding this was one of the main reasons for the shift of MacOs to Unix. -- JasonGrossman
BlueAbyss calls for processes nested within each other in accordance with the third scheme.
See also OperatingSystemsDesign