L Peter Deutsch
426
scheduler. It had virtual memory. It had a file system. In fact, it had several
file systems.
There, there were more complex questions of data-structure design. The
one that I remember is there was an active process table. And there was a
question as to how to design that and how the operating system should
decide when a process was runnable or not—that kind of thing. There were
structures for keeping track of the virtual memory system. But some issues
of interface started to emerge. Not within the operating system itself,
because the operating system was so small that the kernel was designed
essentially as a single piece, as a monolith.
But there were two important areas where issues of software interface
started to emerge. One of them was simply the interface between user
programs and the kernel. What should the system calls be? How should the
parameters be laid out? I know that in the first few versions of the 940 TSS,
the basic operations for reading and writing files were the equivalent of the
Unix
read and write calls, where you basically gave a base address and a
count. Well, that was all very well and good, but a lot of the time that
wasn’t what you wanted. You basically wanted a stream interface. And in
those days, we didn’t have the concept that you could take an operating-
system facility and then wrap user-level code around it to give you some
nicer interface in the way
getc and putc get built on top of read and write.
So what we actually did was in later versions of the operating system, we
added operating-system calls that were the equivalent of
getc and putc.
The other place where issues of interface started to show up were—again,
based on the MULTICS mode—from the beginning we had a strong
distinction between the kernel and what today we would call the shell. This
was early enough in the development of operating systems that we didn’t
realize that you could, in fact, build a shell with essentially no special
privileges. The shell was a user-mode program, but it had a lot of special
privileges. But there were some issues about what facilities the kernel had
to give the shell—what things the shell should be able to do directly and
what things it should have to make kernel calls for.
We saw interface-design choices just emerging from the task. That was the
point in my career at which I dimly started to become aware that interfaces