]> git.lizzy.rs Git - plan9front.git/blob - sys/doc/9.ms
merge
[plan9front.git] / sys / doc / 9.ms
1 .HTML "Plan 9 from Bell Labs"
2 .TL
3 Plan 9 from Bell Labs
4 .AU
5 Rob Pike
6 Dave Presotto
7 Sean Dorward
8 Bob Flandrena
9 Ken Thompson
10 Howard Trickey
11 Phil Winterbottom
12 .AI
13 .MH
14 USA
15 .SH
16 Motivation
17 .PP
18 .FS
19 Appeared in a slightly different form in
20 .I
21 Computing Systems,
22 .R
23 Vol 8 #3, Summer 1995, pp. 221-254.
24 .FE
25 By the mid 1980's, the trend in computing was
26 away from large centralized time-shared computers towards
27 networks of smaller, personal machines,
28 typically UNIX `workstations'.
29 People had grown weary of overloaded, bureaucratic timesharing machines
30 and were eager to move to small, self-maintained systems, even if that
31 meant a net loss in computing power.
32 As microcomputers became faster, even that loss was recovered, and
33 this style of computing remains popular today.
34 .PP
35 In the rush to personal workstations, though, some of their weaknesses
36 were overlooked.
37 First, the operating system they run, UNIX, is itself an old timesharing system and
38 has had trouble adapting to ideas
39 born after it.  Graphics and networking were added to UNIX well into
40 its lifetime and remain poorly integrated and difficult to administer.
41 More important, the early focus on having private machines
42 made it difficult for networks of machines to serve as seamlessly as the old
43 monolithic timesharing systems.
44 Timesharing centralized the management
45 and amortization of costs and resources;
46 personal computing fractured, democratized, and ultimately amplified
47 administrative problems.
48 The choice of
49 an old timesharing operating system to run those personal machines
50 made it difficult to bind things together smoothly.
51 .PP
52 Plan 9 began in the late 1980's as an attempt to have it both
53 ways: to build a system that was centrally administered and cost-effective
54 using cheap modern microcomputers as its computing elements.
55 The idea was to build a time-sharing system out of workstations, but in a novel way.
56 Different computers would handle
57 different tasks: small, cheap machines in people's offices would serve
58 as terminals providing access to large, central, shared resources such as computing
59 servers and file servers.  For the central machines, the coming wave of
60 shared-memory multiprocessors seemed obvious candidates.
61 The philosophy is much like that of the Cambridge
62 Distributed System [NeHe82].
63 The early catch phrase was to build a UNIX out of a lot of little systems,
64 not a system out of a lot of little UNIXes.
65 .PP
66 The problems with UNIX were too deep to fix, but some of its ideas could be
67 brought along.  The best was its use of the file system to coordinate
68 naming of and access to resources, even those, such as devices, not traditionally
69 treated as files.
70 For Plan 9, we adopted this idea by designing a network-level protocol, called 9P,
71 to enable machines to access files on remote systems.
72 Above this, we built a naming
73 system that lets people and their computing agents build customized views
74 of the resources in the network.
75 This is where Plan 9 first began to look different:
76 a Plan 9 user builds a private computing environment and recreates it wherever
77 desired, rather than doing all computing on a private machine.
78 It soon became clear that this model was richer
79 than we had foreseen, and the ideas of per-process name spaces
80 and file-system-like resources were extended throughout
81 the system\(emto processes, graphics, even the network itself.
82 .PP
83 By 1989 the system had become solid enough
84 that some of us began using it as our exclusive computing environment.
85 This meant bringing along many of the services and applications we had
86 used on UNIX.  We used this opportunity to revisit many issues, not just
87 kernel-resident ones, that we felt UNIX addressed badly.
88 Plan 9 has new compilers,
89 languages,
90 libraries,
91 window systems,
92 and many new applications.
93 Many of the old tools were dropped, while those brought along have
94 been polished or rewritten.
95 .PP
96 Why be so all-encompassing?
97 The distinction between operating system, library, and application
98 is important to the operating system researcher but uninteresting to the
99 user.  What matters is clean functionality.
100 By building a complete new system,
101 we were able to solve problems where we thought they should be solved.
102 For example, there is no real `tty driver' in the kernel; that is the job of the window
103 system.
104 In the modern world, multi-vendor and multi-architecture computing
105 are essential, yet the usual compilers and tools assume the program is being
106 built to run locally; we needed to rethink these issues.
107 Most important, though, the test of a system is the computing
108 environment it provides.
109 Producing a more efficient way to run the old UNIX warhorses
110 is empty engineering;
111 we were more interested in whether the new ideas suggested by
112 the architecture of the underlying system encourage a more effective way of working.
113 Thus, although Plan 9 provides an emulation environment for
114 running POSIX commands, it is a backwater of the system.
115 The vast majority
116 of system software is developed in the `native' Plan 9 environment.
117 .PP
118 There are benefits to having an all-new system.
119 First, our laboratory has a history of building experimental peripheral boards.
120 To make it easy to write device drivers,
121 we want a system that is available in source form
122 (no longer guaranteed with UNIX, even
123 in the laboratory in which it was born).
124 Also, we want to redistribute our work, which means the software
125 must be locally produced.  For example, we could have used some vendors'
126 C compilers for our system, but even had we overcome the problems with
127 cross-compilation, we would have difficulty
128 redistributing the result.
129 .PP
130 This paper serves as an overview of the system.  It discusses the architecture
131 from the lowest building blocks to the computing environment seen by users.
132 It also serves as an introduction to the rest of the Plan 9 Programmer's Manual,
133 which it accompanies.  More detail about topics in this paper
134 can be found elsewhere in the manual.
135 .SH
136 Design
137 .PP
138 The view of the system is built upon three principles.
139 First, resources are named and accessed like files in a hierarchical file system.
140 Second, there is a standard protocol, called 9P, for accessing these
141 resources.
142 Third, the disjoint hierarchies provided by different services are
143 joined together into a single private hierarchical file name space.
144 The unusual properties of Plan 9 stem from the consistent, aggressive
145 application of these principles.
146 .PP
147 A large Plan 9 installation has a number of computers networked
148 together, each providing a particular class of service.
149 Shared multiprocessor servers provide computing cycles;
150 other large machines offer file storage.
151 These machines are located in an air-conditioned machine
152 room and are connected by high-performance networks.
153 Lower bandwidth networks such as Ethernet or ISDN connect these
154 servers to office- and home-resident workstations or PCs, called terminals
155 in Plan 9 terminology.
156 Figure 1 shows the arrangement.
157 .KF
158 .PS < network.pic
159 .IP
160 .ps -1
161 .in .25i
162 .ll -.25i
163 .ps -1
164 .vs -1
165 .I "Figure 1. Structure of a large Plan 9 installation.
166 CPU servers and file servers share fast local-area networks,
167 while terminals use slower wider-area networks such as Ethernet,
168 Datakit, or telephone lines to connect to them.
169 Gateway machines, which are just CPU servers connected to multiple
170 networks, allow machines on one network to see another.
171 .ps +1
172 .vs +1
173 .ll +.25i
174 .in 0
175 .ps
176 .sp
177 .KE
178 .PP
179 The modern style of computing offers each user a dedicated workstation or PC.
180 Plan 9's approach is different.
181 The various machines with screens, keyboards, and mice all provide
182 access to the resources of the network, so they are functionally equivalent,
183 in the manner of the terminals attached to old timesharing systems.
184 When someone uses the system, though,
185 the terminal is temporarily personalized by that user.
186 Instead of customizing the hardware, Plan 9 offers the ability to customize
187 one's view of the system provided by the software.
188 That customization is accomplished by giving local, personal names for the
189 publicly visible resources in the network.
190 Plan 9 provides the mechanism to assemble a personal view of the public
191 space with local names for globally accessible resources.
192 Since the most important resources of the network are files, the model
193 of that view is file-oriented.
194 .PP
195 The client's local name space provides a way to customize the user's
196 view of the network.  The services available in the network all export file
197 hierarchies.
198 Those important to the user are gathered together into
199 a custom name space; those of no immediate interest are ignored.
200 This is a different style of use from the idea of a `uniform global name space'.
201 In Plan 9, there are known names for services and uniform names for
202 files exported by those services,
203 but the view is entirely local.  As an analogy, consider the difference
204 between the phrase `my house' and the precise address of the speaker's
205 home.  The latter may be used by anyone but the former is easier to say and
206 makes sense when spoken.
207 It also changes meaning depending on who says it,
208 yet that does not cause confusion.
209 Similarly, in Plan 9 the name
210 .CW /dev/cons
211 always refers to the user's terminal and
212 .CW /bin/date
213 the correct version of the date
214 command to run,
215 but which files those names represent depends on circumstances such as the
216 architecture of the machine executing
217 .CW date .
218 Plan 9, then, has local name spaces that obey globally understood
219 conventions;
220 it is the conventions that guarantee sane behavior in the presence
221 of local names.
222 .PP
223 The 9P protocol is structured as a set of transactions that
224 send a request from a client to a (local or remote) server and return the result.
225 9P controls file systems, not just files:
226 it includes procedures to resolve file names and traverse the name
227 hierarchy of the file system provided by the server.
228 On the other hand,
229 the client's name space is held by the client system alone, not on or with the server,
230 a distinction from systems such as Sprite [OCDNW88].
231 Also, file access is at the level of bytes, not blocks, which distinguishes
232 9P from protocols like NFS and RFS.
233 A paper by Welch compares Sprite, NFS, and Plan 9's network file system structures [Welc94].
234 .PP
235 This approach was designed with traditional files in mind,
236 but can be extended
237 to many other resources.
238 Plan 9 services that export file hierarchies include I/O devices,
239 backup services,
240 the window system,
241 network interfaces,
242 and many others.
243 One example is the process file system,
244 .CW /proc ,
245 which provides a clean way
246 to examine and control running processes.
247 Precursor systems had a similar idea [Kill84], but Plan 9 pushes the
248 file metaphor much further [PPTTW93].
249 The file system model is well-understood, both by system builders and general users,
250 so services that present file-like interfaces are easy to build, easy to understand,
251 and easy to use.
252 Files come with agreed-upon rules for
253 protection,
254 naming,
255 and access both local and remote,
256 so services built this way are ready-made for a distributed system.
257 (This is a distinction from `object-oriented' models, where these issues
258 must be faced anew for every class of object.)
259 Examples in the sections that follow illustrate these ideas in action.
260 .SH
261 The Command-level View
262 .PP
263 Plan 9 is meant to be used from a machine with a screen running
264 the window system.
265 It has no notion of `teletype' in the UNIX sense.  The keyboard handling of
266 the bare system is rudimentary, but once the window system, 8½ [Pike91],
267 is running,
268 text can be edited with `cut and paste' operations from a pop-up menu,
269 copied between windows, and so on.
270 8½ permits editing text from the past, not just on the current input line.
271 The text-editing capabilities of 8½ are strong enough to displace
272 special features such as history in the shell,
273 paging and scrolling,
274 and mail editors.
275 8½ windows do not support cursor addressing and,
276 except for one terminal emulator to simplify connecting to traditional systems,
277 there is no cursor-addressing software in Plan 9.
278 .PP
279 Each window is created in a separate name space.
280 Adjustments made to the name space in a window do not affect other windows
281 or programs, making it safe to experiment with local modifications to the name
282 space, for example
283 to substitute files from the dump file system when debugging.
284 Once the debugging is done, the window can be deleted and all trace of the
285 experimental apparatus is gone.
286 Similar arguments apply to the private space each window has for environment
287 variables, notes (analogous to UNIX signals), etc.
288 .PP
289 Each window is created running an application, such as the shell, with
290 standard input and output connected to the editable text of the window.
291 Each window also has a private bitmap and multiplexed access to the
292 keyboard, mouse, and other graphical resources through files like
293 .CW /dev/mouse ,
294 .CW /dev/bitblt ,
295 and
296 .CW /dev/cons
297 (analogous to UNIX's
298 .CW /dev/tty ).
299 These files are provided by 8½, which is implemented as a file server.
300 Unlike X windows, where a new application typically creates a new window
301 to run in, an 8½ graphics application usually runs in the window where it starts.
302 It is possible and efficient for an application to create a new window, but
303 that is not the style of the system.
304 Again contrasting to X, in which a remote application makes a network
305 call to the X server to start running,
306 a remote 8½ application sees the
307 .CW mouse ,
308 .CW bitblt ,
309 and
310 .CW cons
311 files for the window as usual in
312 .CW /dev ;
313 it does not know whether the files are local.
314 It just reads and writes them to control the window;
315 the network connection is already there and multiplexed.
316 .PP
317 The intended style of use is to run interactive applications such as the window
318 system and text editor on the terminal and to run computation- or file-intensive
319 applications on remote servers.
320 Different windows may be running programs on different machines over
321 different networks, but by making the name space equivalent in all windows,
322 this is transparent: the same commands and resources are available, with the same names,
323 wherever the computation is performed.
324 .PP
325 The command set of Plan 9 is similar to that of UNIX.
326 The commands fall into several broad classes.  Some are new programs for
327 old jobs: programs like
328 .CW ls ,
329 .CW cat ,
330 and
331 .CW who
332 have familiar names and functions but are new, simpler implementations.
333 .CW Who ,
334 for example, is a shell script, while
335 .CW ps
336 is just 95 lines of C code.
337 Some commands are essentially the same as their UNIX ancestors:
338 .CW awk ,
339 .CW troff ,
340 and others have been converted to ANSI C and extended to handle
341 Unicode, but are still the familiar tools.
342 Some are entirely new programs for old niches: the shell
343 .CW rc ,
344 text editor
345 .CW sam ,
346 debugger
347 .CW acid ,
348 and others
349 displace the better-known UNIX tools with similar jobs.
350 Finally, about half the commands are new.
351 .PP
352 Compatibility was not a requirement for the system.
353 Where the old commands or notation seemed good enough, we
354 kept them.  When they didn't, we replaced them.
355 .SH
356 The File Server
357 .PP
358 A central file server stores permanent files and presents them to the network
359 as a file hierarchy exported using 9P.
360 The server is a stand-alone system, accessible only over the network,
361 designed to do its one job well.
362 It runs no user processes, only a fixed set of routines compiled into the
363 boot image.
364 Rather than a set of disks or separate file systems,
365 the main hierarchy exported by the server is a single
366 tree, representing files on many disks.
367 That hierarchy is
368 shared by many users over a wide area on a variety of networks.
369 Other file trees exported by
370 the server include
371 special-purpose systems such as temporary storage and, as explained
372 below, a backup service.
373 .PP
374 The file server has three levels of storage.
375 The central server in our installation has
376 about 100 megabytes of memory buffers,
377 27 gigabytes of magnetic disks,
378 and 350 gigabytes of
379 bulk storage in a write-once-read-many (WORM) jukebox.
380 The disk is a cache for the WORM and the memory is a cache for the disk;
381 each is much faster, and sees about an order of magnitude more traffic,
382 than the level it caches.
383 The addressable data in the file system can be larger than the size of the
384 magnetic disks, because they are only a cache;
385 our main file server has about 40 gigabytes of active storage.
386 .PP
387 The most unusual feature of the file server
388 comes from its use of a WORM device for
389 stable storage.
390 Every morning at 5 o'clock, a
391 .I dump
392 of the file system occurs automatically.
393 The file system is frozen and
394 all blocks modified since the last dump
395 are queued to be written to the WORM.
396 Once the blocks are queued,
397 service is restored and
398 the read-only root of the dumped
399 file system appears in a
400 hierarchy of all dumps ever taken, named by its date.
401 For example, the directory
402 .CW /n/dump/1995/0315
403 is the root directory of an image of the file system
404 as it appeared in the early morning of March 15, 1995.
405 It takes a few minutes to queue the blocks,
406 but the process to copy blocks to the WORM, which runs in the background, may take hours.
407 .PP
408 There are two ways the dump file system is used.
409 The first is by the users themselves, who can browse the
410 dump file system directly or attach pieces of
411 it to their name space.
412 For example, to track down a bug,
413 it is straightforward to try the compiler from three months ago
414 or to link a program with yesterday's library.
415 With daily snapshots of all files,
416 it is easy to find when a particular change was
417 made or what changes were made on a particular date.
418 People feel free to make large speculative changes
419 to files in the knowledge that they can be backed
420 out with a single
421 copy command.
422 There is no backup system as such;
423 instead, because the dump
424 is in the file name space, 
425 backup problems can be solved with
426 standard tools
427 such as
428 .CW cp ,
429 .CW ls ,
430 .CW grep ,
431 and
432 .CW diff .
433 .PP
434 The other (very rare) use is complete system backup.
435 In the event of disaster,
436 the active file system can be initialized from any dump by clearing the
437 disk cache and setting the root of
438 the active file system to be a copy
439 of the dumped root.
440 Although easy to do, this is not to be taken lightly:
441 besides losing any change made after the date of the dump, this recovery method
442 results in a very slow system.
443 The cache must be reloaded from WORM, which is much
444 slower than magnetic disks.
445 The file system takes a few days to reload the working
446 set and regain its full performance.
447 .PP
448 Access permissions of files in the dump are the same
449 as they were when the dump was made.
450 Normal utilities have normal
451 permissions in the dump without any special arrangement.
452 The dump file system is read-only, though,
453 which means that files in the dump cannot be written regardless of their permission bits;
454 in fact, since directories are part of the read-only structure,
455 even the permissions cannot be changed.
456 .PP
457 Once a file is written to WORM, it cannot be removed,
458 so our users never see
459 ``please clean up your files''
460 messages and there is no
461 .CW df
462 command.
463 We regard the WORM jukebox as an unlimited resource.
464 The only issue is how long it will take to fill.
465 Our WORM has served a community of about 50 users
466 for five years and has absorbed daily dumps, consuming a total of
467 65% of the storage in the jukebox.
468 In that time, the manufacturer has improved the technology,
469 doubling the capacity of the individual disks.
470 If we were to upgrade to the new media,
471 we would have more free space than in the original empty jukebox.
472 Technology has created storage faster than we can use it.
473 .SH
474 Unusual file servers
475 .PP
476 Plan 9 is characterized by a variety of servers that offer
477 a file-like interface to unusual services.
478 Many of these are implemented by user-level processes, although the distinction
479 is unimportant to their clients; whether a service is provided by the kernel,
480 a user process, or a remote server is irrelevant to the way it is used.
481 There are dozens of such servers; in this section we present three representative ones.
482 .PP
483 Perhaps the most remarkable file server in Plan 9 is 8½, the window system.
484 It is discussed at length elsewhere [Pike91], but deserves a brief explanation here.
485 8½ provides two interfaces: to the user seated at the terminal, it offers a traditional
486 style of interaction with multiple windows, each running an application, all controlled
487 by a mouse and keyboard.
488 To the client programs, the view is also fairly traditional:
489 programs running in a window see a set of files in
490 .CW /dev
491 with names like
492 .CW mouse ,
493 .CW screen ,
494 and
495 .CW cons .
496 Programs that want to print text to their window write to
497 .CW /dev/cons ;
498 to read the mouse, they read
499 .CW /dev/mouse .
500 In the Plan 9 style, bitmap graphics is implemented by providing a file
501 .CW /dev/bitblt
502 on which clients write encoded messages to execute graphical operations such as
503 .CW bitblt
504 (RasterOp).
505 What is unusual is how this is done:
506 8½ is a file server, serving the files in
507 .CW /dev
508 to the clients running in each window.
509 Although every window looks the same to its client,
510 each window has a distinct set of files in
511 .CW /dev .
512 8½ multiplexes its clients' access to the resources of the terminal
513 by serving multiple sets of files.  Each client is given a private name space
514 with a
515 .I different
516 set of files that behave the same as in all other windows.
517 There are many advantages to this structure.
518 One is that 8½ serves the same files it needs for its own implementation\(emit
519 multiplexes its own interface\(emso it may be run, recursively, as a client of itself.
520 Also, consider the implementation of
521 .CW /dev/tty
522 in UNIX, which requires special code in the kernel to redirect
523 .CW open
524 calls to the appropriate device.
525 Instead, in 8½ the equivalent service falls out
526 automatically: 8½ serves
527 .CW /dev/cons
528 as its basic function; there is nothing extra to do.
529 When a program wants to
530 read from the keyboard, it opens
531 .CW /dev/cons ,
532 but it is a private file, not a shared one with special properties.
533 Again, local name spaces make this possible; conventions about the consistency of
534 the files within them make it natural.
535 .PP
536 8½ has a unique feature made possible by its design.
537 Because it is implemented as a file server,
538 it has the power to postpone answering read requests for a particular window.
539 This behavior is toggled by a reserved key on the keyboard.
540 Toggling once suspends client reads from the window;
541 toggling again resumes normal reads, which absorb whatever text has been prepared,
542 one line at a time.
543 This allows the user to edit multi-line input text on the screen before the application sees it,
544 obviating the need to invoke a separate editor to prepare text such as mail
545 messages.
546 A related property is that reads are answered directly from the
547 data structure defining the text on the display: text may be edited until
548 its final newline makes the prepared line of text readable by the client.
549 Even then, until the line is read, the text the client will read can be changed.
550 For example, after typing
551 .P1
552 % make
553 rm *
554 .P2
555 to the shell, the user can backspace over the final newline at any time until
556 .CW make
557 finishes, holding off execution of the
558 .CW rm
559 command, or even point with the mouse
560 before the
561 .CW rm
562 and type another command to be executed first.
563 .PP
564 There is no
565 .CW ftp
566 command in Plan 9.  Instead, a user-level file server called
567 .CW ftpfs
568 dials the FTP site, logs in on behalf of the user, and uses the FTP protocol
569 to examine files in the remote directory.
570 To the local user, it offers a file hierarchy, attached to
571 .CW /n/ftp
572 in the local name space, mirroring the contents of the FTP site.
573 In other words, it translates the FTP protocol into 9P to offer Plan 9 access to FTP sites.
574 The implementation is tricky;
575 .CW ftpfs
576 must do some sophisticated caching for efficiency and
577 use heuristics to decode remote directory information.
578 But the result is worthwhile:
579 all the local file management tools such as
580 .CW cp ,
581 .CW grep ,
582 .CW diff ,
583 and of course
584 .CW ls
585 are available to FTP-served files exactly as if they were local files.
586 Other systems such as Jade and Prospero
587 have exploited the same opportunity [Rao81, Neu92],
588 but because of local name spaces and the simplicity of implementing 9P,
589 this approach
590 fits more naturally into Plan 9 than into other environments.
591 .PP
592 One server,
593 .CW exportfs ,
594 is a user process that takes a portion of its own name space and
595 makes it available to other processes by
596 translating 9P requests into system calls to the Plan 9 kernel.
597 The file hierarchy it exports may contain files from multiple servers.
598 .CW Exportfs
599 is usually run as a remote server
600 started by a local program,
601 either
602 .CW import
603 or
604 .CW cpu .
605 .CW Import
606 makes a network call to the remote machine, starts
607 .CW exportfs
608 there, and attaches its 9P connection to the local name space.  For example,
609 .P1
610 import helix /net
611 .P2
612 makes Helix's network interfaces visible in the local
613 .CW /net
614 directory.  Helix is a central server and
615 has many network interfaces, so this permits a machine with one network to
616 access to any of Helix's networks.  After such an import, the local
617 machine may make calls on any of the networks connected to Helix.
618 Another example is
619 .P1
620 import helix /proc
621 .P2
622 which makes Helix's processes visible in the local
623 .CW /proc ,
624 permitting local debuggers to examine remote processes.
625 .PP
626 The
627 .CW cpu
628 command connects the local terminal to a remote
629 CPU server.
630 It works in the opposite direction to
631 .CW import :
632 after calling the server, it starts a
633 .I local
634 .CW exportfs
635 and mounts it in the name space of a process, typically a newly created shell, on the
636 server.
637 It then rearranges the name space
638 to make local device files (such as those served by
639 the terminal's window system) visible in the server's
640 .CW /dev
641 directory.
642 The effect of running a
643 .CW cpu
644 command is therefore to start a shell on a fast machine, one more tightly
645 coupled to the file server,
646 with a name space analogous
647 to the local one.
648 All local device files are visible remotely, so remote applications have full
649 access to local services such as bitmap graphics,
650 .CW /dev/cons ,
651 and so on.
652 This is not the same as
653 .CW rlogin ,
654 which does nothing to reproduce the local name space on the remote system,
655 nor is it the same as
656 file sharing with, say, NFS, which can achieve some name space equivalence but
657 not the combination of access to local hardware devices, remote files, and remote
658 CPU resources.
659 The
660 .CW cpu
661 command is a uniquely transparent mechanism.
662 For example, it is reasonable
663 to start a window system in a window running a
664 .CW cpu
665 command; all windows created there automatically start processes on the CPU server.
666 .SH
667 Configurability and administration
668 .PP
669 The uniform interconnection of components in Plan 9 makes it possible to configure
670 a Plan 9 installation many different ways.
671 A single laptop PC can function as a stand-alone Plan 9 system;
672 at the other extreme, our setup has central multiprocessor CPU
673 servers and file servers and scores of terminals ranging from small PCs to
674 high-end graphics workstations.
675 It is such large installations that best represent how Plan 9 operates.
676 .PP
677 The system software is portable and the same
678 operating system runs on all hardware.
679 Except for performance, the appearance of the system on, say,
680 an SGI workstation is the same
681 as on a laptop.
682 Since computing and file services are centralized, and terminals have
683 no permanent file storage, all terminals are functionally identical.
684 In this way, Plan 9 has one of the good properties of old timesharing systems, where
685 a user could sit in front of any machine and see the same system.  In the modern
686 workstation community, machines tend to be owned by people who customize them
687 by storing private information on local disk.
688 We reject this style of use,
689 although the system itself can be used this way.
690 In our group, we have a laboratory with many public-access machines\(ema terminal
691 room\(emand a user may sit down at any one of them and work.
692 .PP
693 Central file servers centralize not just the files, but also their administration
694 and maintenance.
695 In fact, one server is the main server, holding all system files; other servers provide
696 extra storage or are available for debugging and other special uses, but the system
697 software resides on one machine.
698 This means that each program
699 has a single copy of the binary for each architecture, so it is
700 trivial to install updates and bug fixes.
701 There is also a single user database; there is no need to synchronize distinct
702 .CW /etc/passwd
703 files.
704 On the other hand, depending on a single central server does limit the size of an installation.
705 .PP
706 Another example of the power of centralized file service
707 is the way Plan 9 administers network information.
708 On the central server there is a directory,
709 .CW /lib/ndb ,
710 that contains all the information necessary to administer the local Ethernet and
711 other networks.
712 All the machines use the same database to talk to the network; there is no
713 need to manage a distributed naming system or keep parallel files up to date.
714 To install a new machine on the local Ethernet, choose a
715 name and IP address and add these to a single file in
716 .CW /lib/ndb ;
717 all the machines in the installation will be able to talk to it immediately.
718 To start running, plug the machine into the network, turn it on, and use BOOTP
719 and TFTP to load the kernel.
720 All else is automatic.
721 .PP
722 Finally,
723 the automated dump file system frees all users from the need to maintain
724 their systems, while providing easy access to backup files without
725 tapes, special commands, or the involvement of support staff.
726 It is difficult to overstate the improvement in lifestyle afforded by this service.
727 .PP
728 Plan 9 runs on a variety of hardware without
729 constraining how to configure an installation.
730 In our laboratory, we
731 chose to use central servers because they amortize costs and administration.
732 A sign that this is a good decision is that our cheap
733 terminals remain comfortable places
734 to work for about five years, much longer than workstations that must provide
735 the complete computing environment.
736 We do, however, upgrade the central machines, so
737 the computation available from even old Plan 9 terminals improves with time.
738 The money saved by avoiding regular upgrades of terminals
739 is instead spent on the newest, fastest multiprocessor servers.
740 We estimate this costs about half the money of networked workstations
741 yet provides general access to more powerful machines.
742 .SH
743 C Programming
744 .PP
745 Plan 9 utilities are written in several languages.
746 Some are scripts for the shell,
747 .CW rc
748 [Duff90]; a handful
749 are written in a new C-like concurrent language called Alef [Wint95], described below.
750 The great majority, though, are written in a dialect of ANSI C [ANSIC].
751 Of these, most are entirely new programs, but some
752 originate in pre-ANSI C code
753 from our research UNIX system [UNIX85].
754 These have been updated to ANSI C
755 and reworked for portability and cleanliness.
756 .PP
757 The Plan 9 C dialect has some minor extensions,
758 described elsewhere [Pike95], and a few major restrictions.
759 The most important restriction is that the compiler demands that
760 all function definitions have ANSI prototypes
761 and all function calls appear in the scope of a prototyped declaration
762 of the function.
763 As a stylistic rule,
764 the prototyped declaration is placed in a header file
765 included by all files that call the function.
766 Each system library has an associated header file, declaring all
767 functions in that library.
768 For example, the standard Plan 9 library is called
769 .CW libc ,
770 so all C source files include
771 .CW <libc.h> .
772 These rules guarantee that all functions
773 are called with arguments having the expected types \(em something
774 that was not true with pre-ANSI C programs.
775 .PP
776 Another restriction is that the C compilers accept only a subset of the
777 preprocessor directives required by ANSI.
778 The main omission is
779 .CW #if ,
780 since we believe it
781 is never necessary and often abused.
782 Also, its effect is
783 better achieved by other means.
784 For instance, an
785 .CW #if
786 used to toggle a feature at compile time can be written
787 as a regular
788 .CW if
789 statement, relying on compile-time constant folding and
790 dead code elimination to discard object code.
791 .PP
792 Conditional compilation, even with
793 .CW #ifdef ,
794 is used sparingly in Plan 9.
795 The only architecture-dependent
796 .CW #ifdefs
797 in the system are in low-level routines in the graphics library.
798 Instead, we avoid such dependencies or, when necessary, isolate
799 them in separate source files or libraries.
800 Besides making code hard to read,
801 .CW #ifdefs
802 make it impossible to know what source is compiled into the binary
803 or whether source protected by them will compile or work properly.
804 They make it harder to maintain software.
805 .PP
806 The standard Plan 9 library overlaps much of
807 ANSI C and POSIX [POSIX], but diverges
808 when appropriate to Plan 9's goals or implementation.
809 When the semantics of a function
810 change, we also change the name.
811 For instance, instead of UNIX's
812 .CW creat ,
813 Plan 9 has a
814 .CW create
815 function that takes three arguments,
816 the original two plus a third that, like the second
817 argument of
818 .CW open ,
819 defines whether the returned file descriptor is to be opened for reading,
820 writing, or both.
821 This design was forced by the way 9P implements creation,
822 but it also simplifies the common use of
823 .CW create
824 to initialize a temporary file.
825 .PP
826 Another departure from ANSI C is that Plan 9 uses a 16-bit character set
827 called Unicode [ISO10646, Unicode].
828 Although we stopped short of full internationalization,
829 Plan 9 treats the representation
830 of all major languages uniformly throughout all its
831 software.
832 To simplify the exchange of text between programs, the characters are packed into
833 a byte stream by an encoding we designed, called UTF-8,
834 which is now
835 becoming accepted as a standard [FSSUTF].
836 It has several attractive properties,
837 including byte-order independence,
838 backwards compatibility with ASCII,
839 and ease of implementation.
840 .PP
841 There are many problems in adapting existing software to a large
842 character set with an encoding that represents characters with
843 a variable number of bytes.
844 ANSI C addresses some of the issues but
845 falls short of
846 solving them all.
847 It does not pick a character set encoding and does not
848 define all the necessary I/O library routines.
849 Furthermore, the functions it
850 .I does
851 define have engineering problems.
852 Since the standard left too many problems unsolved,
853 we decided to build our own interface.
854 A separate paper has the details [Pike93].
855 .PP
856 A small class of Plan 9 programs do not follow the conventions
857 discussed in this section.
858 These are programs imported from and maintained by
859 the UNIX community;
860 .CW tex
861 is a representative example.
862 To avoid reconverting such programs every time a new version
863 is released,
864 we built a porting environment, called the ANSI C/POSIX Environment, or APE [Tric95].
865 APE comprises separate include files, libraries, and commands,
866 conforming as much as possible to the strict ANSI C and base-level
867 POSIX specifications.
868 To port network-based software such as X Windows, it was necessary to add
869 some extensions to those
870 specifications, such as the BSD networking functions.
871 .SH
872 Portability and Compilation
873 .PP
874 Plan 9 is portable across a variety of processor architectures.
875 Within a single computing session, it is common to use
876 several architectures: perhaps the window system running on
877 an Intel processor connected to a MIPS-based CPU server with files
878 resident on a SPARC system.
879 For this heterogeneity to be transparent, there must be conventions
880 about data interchange between programs; for software maintenance
881 to be straightforward, there must be conventions about cross-architecture
882 compilation.
883 .PP
884 To avoid byte order problems,
885 data is communicated between programs as text whenever practical.
886 Sometimes, though, the amount of data is high enough that a binary
887 format is necessary;
888 such data is communicated as a byte stream with a pre-defined encoding
889 for multi-byte values.
890 In the rare cases where a format
891 is complex enough to be defined by a data structure,
892 the structure is never
893 communicated as a unit; instead, it is decomposed into
894 individual fields, encoded as an ordered byte stream, and then
895 reassembled by the recipient.
896 These conventions affect data
897 ranging from kernel or application program state information to object file
898 intermediates generated by the compiler.
899 .PP
900 Programs, including the kernel, often present their data
901 through a file system interface,
902 an access mechanism that is inherently portable.
903 For example, the system clock is represented by a decimal number in the file
904 .CW /dev/time ;
905 the
906 .CW time
907 library function (there is no
908 .CW time
909 system call) reads the file and converts it to binary.
910 Similarly, instead of encoding the state of an application
911 process in a series of flags and bits in private memory,
912 the kernel
913 presents a text string in the file named
914 .CW status
915 in the 
916 .CW /proc
917 file system associated with each process.
918 The Plan 9
919 .CW ps
920 command is trivial: it prints the contents of
921 the desired status files after some minor reformatting; moreover, after
922 .P1
923 import helix /proc
924 .P2
925 a local
926 .CW ps
927 command reports on the status of Helix's processes.
928 .PP
929 Each supported architecture has its own compilers and loader.
930 The C and Alef compilers produce intermediate files that
931 are portably encoded; the contents
932 are unique to the target architecture but the format of the
933 file is independent of compiling processor type.
934 When a compiler for a given architecture is compiled on
935 another type of processor and then used to compile a program
936 there,
937 the intermediate produced on
938 the new architecture is identical to the intermediate
939 produced on the native processor.  From the compiler's
940 point of view, every compilation is a cross-compilation.
941 .PP
942 Although each architecture's loader accepts only intermediate files produced
943 by compilers for that architecture,
944 such files could have been generated by a compiler executing
945 on any type of processor.
946 For instance, it is possible to run
947 the MIPS compiler on a 486, then use the MIPS loader on a
948 SPARC to produce a MIPS executable.
949 .PP
950 Since Plan 9 runs on a variety of architectures, even in a single installation,
951 distinguishing the compilers and intermediate names
952 simplifies multi-architecture
953 development from a single source tree.
954 The compilers and the loader for each architecture are
955 uniquely named; there is no
956 .CW cc
957 command.
958 The names are derived by concatenating a code letter
959 associated with the target architecture with the name of the
960 compiler or loader.  For example, the letter `8' is
961 the code letter for Intel
962 .I x 86
963 processors; the C compiler is named
964 .CW 8c ,
965 the Alef compiler
966 .CW 8al ,
967 and the loader is called
968 .CW 8l .
969 Similarly, the compiler intermediate files are suffixed
970 .CW .8 ,
971 not
972 .CW .o .
973 .PP
974 The Plan 9
975 build program
976 .CW mk ,
977 a relative of
978 .CW make ,
979 reads the names of the current and target
980 architectures from environment variables called
981 .CW $cputype
982 and
983 .CW $objtype .
984 By default the current processor is the target, but setting
985 .CW $objtype
986 to the name of another architecture
987 before invoking
988 .CW mk
989 results in a cross-build:
990 .P1
991 % objtype=sparc mk
992 .P2
993 builds a program for the SPARC architecture regardless of the executing machine.
994 The value of
995 .CW $objtype
996 selects a
997 file of architecture-dependent variable definitions
998 that configures the build to use the appropriate compilers and loader.
999 Although simple-minded, this technique works well in practice:
1000 all applications in Plan 9 are built from a single source tree
1001 and it is possible to build the various architectures in parallel without conflict.
1002 .SH
1003 Parallel programming
1004 .PP
1005 Plan 9's support for parallel programming has two aspects.
1006 First, the kernel provides
1007 a simple process model and a few carefully designed system calls for
1008 synchronization and sharing.
1009 Second, a new parallel programming language called Alef
1010 supports concurrent programming.
1011 Although it is possible to write parallel
1012 programs in C, Alef is the parallel language of choice.
1013 .PP
1014 There is a trend in new operating systems to implement two
1015 classes of processes: normal UNIX-style processes and light-weight
1016 kernel threads.
1017 Instead, Plan 9 provides a single class of process but allows fine control of the
1018 sharing of a process's resources such as memory and file descriptors.
1019 A single class of process is a
1020 feasible approach in Plan 9 because the kernel has an efficient system
1021 call interface and cheap process creation and scheduling.
1022 .PP
1023 Parallel programs have three basic requirements:
1024 management of resources shared between processes,
1025 an interface to the scheduler,
1026 and fine-grain process synchronization using spin locks.
1027 On Plan 9,
1028 new processes are created using the
1029 .CW rfork
1030 system call.
1031 .CW Rfork
1032 takes a single argument,
1033 a bit vector that specifies
1034 which of the parent process's resources should be shared,
1035 copied, or created anew
1036 in the child.
1037 The resources controlled by
1038 .CW rfork
1039 include the name space,
1040 the environment,
1041 the file descriptor table,
1042 memory segments,
1043 and notes (Plan 9's analog of UNIX signals).
1044 One of the bits controls whether the
1045 .CW rfork
1046 call will create a new process; if the bit is off, the resulting
1047 modification to the resources occurs in the process making the call.
1048 For example, a process calls
1049 .CW rfork(RFNAMEG)
1050 to disconnect its name space from its parent's.
1051 Alef uses a
1052 fine-grained fork in which all the resources, including
1053 memory, are shared between parent
1054 and child, analogous to creating a kernel thread in many systems.
1055 .PP
1056 An indication that
1057 .CW rfork
1058 is the right model is the variety of ways it is used.
1059 Other than the canonical use in the library routine
1060 .CW fork ,
1061 it is hard to find two calls to
1062 .CW rfork
1063 with the same bits set; programs
1064 use it to create many different forms of sharing and resource allocation.
1065 A system with just two types of processes\(emregular processes and threads\(emcould
1066 not handle this variety.
1067 .PP
1068 There are two ways to share memory.
1069 First, a flag to
1070 .CW rfork
1071 causes all the memory segments of the parent to be shared with the child
1072 (except the stack, which is
1073 forked copy-on-write regardless).
1074 Alternatively, a new segment of memory may be
1075 attached using the
1076 .CW segattach
1077 system call; such a segment
1078 will always be shared between parent and child.
1079 .PP
1080 The
1081 .CW rendezvous
1082 system call provides a way for processes to synchronize.
1083 Alef uses it to implement communication channels,
1084 queuing locks,
1085 multiple reader/writer locks, and
1086 the sleep and wakeup mechanism.
1087 .CW Rendezvous
1088 takes two arguments, a tag and a value.
1089 When a process calls
1090 .CW rendezvous
1091 with a tag it sleeps until another process
1092 presents a matching tag.
1093 When a pair of tags match, the values are exchanged
1094 between the two processes and both
1095 .CW rendezvous
1096 calls return.
1097 This primitive is sufficient to implement the full set of synchronization routines.
1098 .PP
1099 Finally, spin locks are provided by
1100 an architecture-dependent library at user level.
1101 Most processors provide atomic test and set instructions that
1102 can be used to implement locks.
1103 A notable exception is the MIPS R3000, so the SGI
1104 Power series multiprocessors have special lock hardware on the bus.
1105 User processes gain access to the lock hardware
1106 by mapping pages of hardware locks
1107 into their address space using the
1108 .CW segattach
1109 system call.
1110 .PP
1111 A Plan 9 process in a system call will block regardless of its `weight'.
1112 This means that when a program wishes to read from a slow
1113 device without blocking the entire calculation, it must fork a process to do
1114 the read for it.  The solution is to start a satellite
1115 process that does the I/O and delivers the answer to the main program
1116 through shared memory or perhaps a pipe.
1117 This sounds onerous but works easily and efficiently in practice; in fact,
1118 most interactive Plan 9 applications, even relatively ordinary ones written
1119 in C, such as
1120 the text editor Sam [Pike87], run as multiprocess programs.
1121 .PP
1122 The kernel support for parallel programming in Plan 9 is a few hundred lines
1123 of portable code; a handful of simple primitives enable the problems to be handled
1124 cleanly at user level.
1125 Although the primitives work fine from C,
1126 they are particularly expressive from within Alef.
1127 The creation
1128 and management of slave I/O processes can be written in a few lines of Alef,
1129 providing the foundation for a consistent means of multiplexing
1130 data flows between arbitrary processes.
1131 Moreover, implementing it in a language rather than in the kernel
1132 ensures consistent semantics between all devices
1133 and provides a more general multiplexing primitive.
1134 Compare this to the UNIX
1135 .CW select
1136 system call:
1137 .CW select
1138 applies only to a restricted set of devices,
1139 legislates a style of multiprogramming in the kernel,
1140 does not extend across networks,
1141 is difficult to implement, and is hard to use.
1142 .PP
1143 Another reason
1144 parallel programming is important in Plan 9 is that
1145 multi-threaded user-level file servers are the preferred way
1146 to implement services.
1147 Examples of such servers include the programming environment
1148 Acme [Pike94],
1149 the name space exporting tool
1150 .CW exportfs
1151 [PPTTW93],
1152 the HTTP daemon,
1153 and the network name servers
1154 .CW cs
1155 and
1156 .CW dns
1157 [PrWi93].
1158 Complex applications such as Acme prove that
1159 careful operating system support can reduce the difficulty of writing
1160 multi-threaded applications without moving threading and
1161 synchronization primitives into the kernel.
1162 .SH
1163 Implementation of Name Spaces
1164 .PP
1165 User processes construct name spaces using three system calls:
1166 .CW mount ,
1167 .CW bind ,
1168 and
1169 .CW unmount .
1170 The
1171 .CW mount
1172 system call attaches a tree served by a file server to
1173 the current name space.  Before calling
1174 .CW mount ,
1175 the client must (by outside means) acquire a connection to the server in
1176 the form of a file descriptor that may be written and read to transmit 9P messages.
1177 That file descriptor represents a pipe or network connection.
1178 .PP
1179 The
1180 .CW mount
1181 call attaches a new hierarchy to the existing name space.
1182 The
1183 .CW bind
1184 system call, on the other hand, duplicates some piece of existing name space at
1185 another point in the name space.
1186 The
1187 .CW unmount
1188 system call allows components to be removed.
1189 .PP
1190 Using
1191 either
1192 .CW bind
1193 or
1194 .CW mount ,
1195 multiple directories may be stacked at a single point in the name space.
1196 In Plan 9 terminology, this is a
1197 .I union
1198 directory and behaves like the concatenation of the constituent directories.
1199 A flag argument to
1200 .CW bind
1201 and
1202 .CW mount
1203 specifies the position of a new directory in the union,
1204 permitting new elements
1205 to be added either at the front or rear of the union or to replace it entirely.
1206 When a file lookup is performed in a union directory, each component
1207 of the union is searched in turn and the first match taken; likewise,
1208 when a union directory is read, the contents of each of the component directories
1209 is read in turn.
1210 Union directories are one of the most widely used organizational features
1211 of the Plan 9 name space.
1212 For instance, the directory
1213 .CW /bin
1214 is built as a union of
1215 .CW /$cputype/bin
1216 (program binaries),
1217 .CW /rc/bin
1218 (shell scripts),
1219 and perhaps more directories provided by the user.
1220 This construction makes the shell
1221 .CW $PATH
1222 variable unnecessary.
1223 .PP
1224 One question raised by union directories
1225 is which element of the union receives a newly created file.
1226 After several designs, we decided on the following.
1227 By default, directories in unions do not accept new files, although the
1228 .CW create
1229 system call applied to an existing file succeeds normally.
1230 When a directory is added to the union, a flag to
1231 .CW bind
1232 or
1233 .CW mount
1234 enables create permission (a property of the name space) in that directory.
1235 When a file is being created with a new name in a union, it is created in the
1236 first directory of the union with create permission; if that creation fails,
1237 the entire
1238 .CW create
1239 fails.
1240 This scheme enables the common use of placing a private directory anywhere
1241 in a union of public ones,
1242 while allowing creation only in the private directory.
1243 .PP
1244 By convention, kernel device file systems
1245 are bound into the
1246 .CW /dev
1247 directory, but to bootstrap the name space building process it is
1248 necessary to have a notation that permits
1249 direct access to the devices without an existing name space.
1250 The root directory
1251 of the tree served by a device driver can be accessed using the syntax
1252 .CW # \f2c\f1,
1253 where
1254 .I c
1255 is a unique character (typically a letter) identifying the
1256 .I type
1257 of the device.
1258 Simple device drivers serve a single level directory containing a few files.
1259 As an example,
1260 each serial port is represented by a data and a control file:
1261 .P1
1262 % bind -a '#t' /dev
1263 % cd /dev
1264 % ls -l eia*
1265 --rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia1
1266 --rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia1ctl
1267 --rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia2
1268 --rw-rw-rw- t 0 bootes bootes 0 Feb 24 21:14 eia2ctl
1269 .P2
1270 The
1271 .CW bind
1272 program is an encapsulation of the
1273 .CW bind
1274 system call; its
1275 .CW -a
1276 flag positions the new directory at the end of the union.
1277 The data files
1278 .CW eia1
1279 and
1280 .CW eia2
1281 may be read and written to communicate over the serial line.
1282 Instead of using special operations on these files to control the devices,
1283 commands written to the files
1284 .CW eia1ctl
1285 and
1286 .CW eia2ctl
1287 control the corresponding device;
1288 for example,
1289 writing the text string
1290 .CW b1200
1291 to
1292 .CW /dev/eia1ctl
1293 sets the speed of that line to 1200 baud.
1294 Compare this to the UNIX
1295 .CW ioctl
1296 system call: in Plan 9, devices are controlled by textual messages,
1297 free of byte order problems, with clear semantics for reading and writing.
1298 It is common to configure or debug devices using shell scripts.
1299 .PP
1300 It is the universal use of the 9P protocol that
1301 connects Plan 9's components together to form a
1302 distributed system.
1303 Rather than inventing a unique protocol for each
1304 service such as
1305 .CW rlogin ,
1306 FTP, TFTP, and X windows,
1307 Plan 9 implements services
1308 in terms of operations on file objects,
1309 and then uses a single, well-documented protocol to exchange information between
1310 computers.
1311 Unlike NFS, 9P treats files as a sequence of bytes rather than blocks.
1312 Also unlike NFS, 9P is stateful: clients perform
1313 remote procedure calls to establish pointers to objects in the remote
1314 file server.
1315 These pointers are called file identifiers or
1316 .I fids .
1317 All operations on files supply a fid to identify an object in the remote file system.
1318 .PP
1319 The 9P protocol defines 17 messages, providing
1320 means to authenticate users, navigate fids around
1321 a file system hierarchy, copy fids, perform I/O, change file attributes, 
1322 and create and delete files.
1323 Its complete specification is in Section 5 of the Programmer's Manual [9man].
1324 Here is the procedure to gain access to the name hierarchy supplied by a server.
1325 A file server connection is established via a pipe or network connection.
1326 An initial
1327 .CW session
1328 message performs a bilateral authentication between client and server.
1329 An
1330 .CW attach
1331 message then connects a fid suggested by the client to the root of the server file
1332 tree.
1333 The
1334 .CW attach
1335 message includes the identity of the user performing the attach; henceforth all
1336 fids derived from the root fid will have permissions associated with
1337 that user.
1338 Multiple users may share the connection, but each must perform an attach to
1339 establish his or her identity.
1340 .PP
1341 The
1342 .CW walk
1343 message moves a fid through a single level of the file system hierarchy.
1344 The
1345 .CW clone
1346 message takes an established fid and produces a copy that points
1347 to the same file as the original.
1348 Its purpose is to enable walking to a file in a directory without losing the fid
1349 on the directory.
1350 The
1351 .CW open
1352 message locks a fid to a specific file in the hierarchy,
1353 checks access permissions,
1354 and prepares the fid
1355 for I/O.
1356 The
1357 .CW read
1358 and
1359 .CW write
1360 messages allow I/O at arbitrary offsets in the file;
1361 the maximum size transferred is defined by the protocol.
1362 The
1363 .CW clunk
1364 message indicates the client has no further use for a fid.
1365 The
1366 .CW remove
1367 message behaves like
1368 .CW clunk
1369 but causes the file associated with the fid to be removed and any associated
1370 resources on the server to be deallocated.
1371 .PP
1372 9P has two forms: RPC messages sent on a pipe or network connection and a procedural
1373 interface within the kernel.
1374 Since kernel device drivers are directly addressable,
1375 there is no need to pass messages to
1376 communicate with them;
1377 instead each 9P transaction is implemented by a direct procedure call.
1378 For each fid,
1379 the kernel maintains a local representation in a data structure called a
1380 .I channel ,
1381 so all operations on files performed by the kernel involve a channel connected
1382 to that fid.
1383 The simplest example is a user process's file descriptors, which are
1384 indexes into an array of channels.
1385 A table in the kernel provides a list
1386 of entry points corresponding one to one with the 9P messages for each device.
1387 A system call such as
1388 .CW read
1389 from the user translates into one or more procedure calls
1390 through that table, indexed by the type character stored in the channel:
1391 .CW procread ,
1392 .CW eiaread ,
1393 etc.
1394 Each call takes at least
1395 one channel as an argument.
1396 A special kernel driver, called the
1397 .I mount
1398 driver, translates procedure calls to messages, that is,
1399 it converts local procedure calls to remote ones.
1400 In effect, this special driver
1401 becomes a local proxy for the files served by a remote file server.
1402 The channel pointer in the local call is translated to the associated fid
1403 in the transmitted message.
1404 .PP
1405 The mount driver is the sole RPC mechanism employed by the system.
1406 The semantics of the supplied files, rather than the operations performed upon
1407 them, create a particular service such as the
1408 .CW cpu
1409 command.
1410 The mount driver demultiplexes protocol
1411 messages between clients sharing a communication channel
1412 with a file server.
1413 For each outgoing RPC message,
1414 the mount driver allocates a buffer labeled by a small unique integer,
1415 called a
1416 .I tag .
1417 The reply to the RPC is labeled with the same tag, which is used by
1418 the mount driver to match the reply with the request.
1419 .PP
1420 The kernel representation of the name space
1421 is called the
1422 .I "mount table" ,
1423 which stores a list of bindings between channels.
1424 Each entry in the mount table contains a pair of channels: a
1425 .I from
1426 channel and a
1427 .I to
1428 channel.
1429 Every time a walk succeeds in moving a channel to a new location in the name space,
1430 the mount table is consulted to see if a `from' channel matches the new name; if
1431 so the `to' channel is cloned and substituted for the original.
1432 Union directories are implemented by converting the `to'
1433 channel into a list of channels: 
1434 a successful walk to a union directory returns a `to' channel that forms
1435 the head of
1436 a list of channels, each representing a component directory
1437 of the union.
1438 If a walk
1439 fails to find a file in the first directory of the union, the list is followed,
1440 the next component cloned, and walk tried on that directory.
1441 .PP
1442 Each file in Plan 9 is uniquely identified by a set of integers:
1443 the type of the channel (used as the index of the function call table),
1444 the server or device number
1445 distinguishing the server from others of the same type (decided locally by the driver),
1446 and a
1447 .I qid
1448 formed from two 32-bit numbers called
1449 .I path
1450 and
1451 .I version .
1452 The path is a unique file number assigned by a device driver or
1453 file server when a file is created.
1454 The version number is updated whenever
1455 the file is modified; as described in the next section,
1456 it can be used to maintain cache coherency between
1457 clients and servers.
1458 .PP
1459 The type and device number are analogous to UNIX major and minor
1460 device numbers;
1461 the qid is analogous to the i-number.
1462 The device and type
1463 connect the channel to a device driver and the qid
1464 identifies the file within that device. 
1465 If the file recovered from a walk has the same type, device, and qid path
1466 as an entry in the mount table, they are the same file and the
1467 corresponding substitution from the mount table is made.
1468 This is how the name space is implemented.
1469 .SH
1470 File Caching
1471 .PP
1472 The 9P protocol has no explicit support for caching files on a client.
1473 The large memory of the central file server acts as a shared cache for all its clients,
1474 which reduces the total amount of memory needed across all machines in the network.
1475 Nonetheless, there are sound reasons to cache files on the client, such as a slow
1476 connection to the file server.
1477 .PP
1478 The version field of the qid is changed whenever the file is modified,
1479 which makes it possible to do some weakly coherent forms of caching.
1480 The most important is client caching of text and data segments of executable files.
1481 When a process
1482 .CW execs
1483 a program, the file is re-opened and the qid's version is compared with that in the cache;
1484 if they match, the local copy is used.
1485 The same method can be used to build a local caching file server.
1486 This user-level server interposes on the 9P connection to the remote server and
1487 monitors the traffic, copying data to a local disk.
1488 When it sees a read of known data, it answers directly,
1489 while writes are passed on immediately\(emthe cache is write-through\(emto keep
1490 the central copy up to date.
1491 This is transparent to processes on the terminal and requires no change to 9P;
1492 it works well on home machines connected over serial lines.
1493 A similar method can be applied to build a general client cache in unused local
1494 memory, but this has not been done in Plan 9.
1495 .SH
1496 Networks and Communication Devices
1497 .PP
1498 Network interfaces are kernel-resident file systems, analogous to the EIA device
1499 described earlier.
1500 Call setup and shutdown are achieved by writing text strings to the control file
1501 associated with the device;
1502 information is sent and received by reading and writing the data file.
1503 The structure and semantics of the devices is common to all networks so,
1504 other than a file name substitution,
1505 the same procedure makes a call using TCP over Ethernet as URP over Datakit [Fra80].
1506 .PP
1507 This example illustrates the structure of the TCP device:
1508 .P1
1509 % ls -lp /net/tcp
1510 d-r-xr-xr-x I 0 bootes bootes 0 Feb 23 20:20 0
1511 d-r-xr-xr-x I 0 bootes bootes 0 Feb 23 20:20 1
1512 --rw-rw-rw- I 0 bootes bootes 0 Feb 23 20:20 clone
1513 % ls -lp /net/tcp/0
1514 --rw-rw---- I 0 rob    bootes 0 Feb 23 20:20 ctl
1515 --rw-rw---- I 0 rob    bootes 0 Feb 23 20:20 data
1516 --rw-rw---- I 0 rob    bootes 0 Feb 23 20:20 listen
1517 --r--r--r-- I 0 bootes bootes 0 Feb 23 20:20 local
1518 --r--r--r-- I 0 bootes bootes 0 Feb 23 20:20 remote
1519 --r--r--r-- I 0 bootes bootes 0 Feb 23 20:20 status
1520 %
1521 .P2
1522 The top directory,
1523 .CW /net/tcp ,
1524 contains a
1525 .CW clone
1526 file and a directory for each connection, numbered
1527 .CW 0
1528 to
1529 .I n .
1530 Each connection directory corresponds to an TCP/IP connection.
1531 Opening
1532 .CW clone
1533 reserves an unused connection and returns its control file.
1534 Reading the control file returns the textual connection number, so the user
1535 process can construct the full name of the newly allocated
1536 connection directory.
1537 The
1538 .CW local ,
1539 .CW remote ,
1540 and
1541 .CW status
1542 files are diagnostic; for example,
1543 .CW remote
1544 contains the address (for TCP, the IP address and port number) of the remote side.
1545 .PP
1546 A call is initiated by writing a connect message with a network-specific address as
1547 its argument; for example, to open a Telnet session (port 23) to a remote machine
1548 with IP address 135.104.9.52,
1549 the string is:
1550 .P1
1551 connect 135.104.9.52!23
1552 .P2
1553 The write to the control file blocks until the connection is established;
1554 if the destination is unreachable, the write returns an error.
1555 Once the connection is established, the
1556 .CW telnet
1557 application reads and writes the
1558 .CW data
1559 file
1560 to talk to the remote Telnet daemon.
1561 On the other end, the Telnet daemon would start by writing
1562 .P1
1563 announce 23
1564 .P2
1565 to its control file to indicate its willingness to receive calls to this port.
1566 Such a daemon is called a
1567 .I listener
1568 in Plan 9.
1569 .PP
1570 A uniform structure for network devices cannot hide all the details
1571 of addressing and communication for dissimilar networks.
1572 For example, Datakit uses textual, hierarchical addresses unlike IP's 32-bit addresses, so
1573 an application given a control file must still know what network it represents.
1574 Rather than make every application know the addressing of every network,
1575 Plan 9 hides these details in a
1576 .I connection
1577 .I server ,
1578 called
1579 .CW cs .
1580 .CW Cs
1581 is a file system mounted in a known place.
1582 It supplies a single control file that an application uses to discover how to connect
1583 to a host.
1584 The application writes the symbolic address and service name for
1585 the connection it wishes to make,
1586 and reads back the name of the
1587 .CW clone
1588 file to open and the address to present to it.
1589 If there are multiple networks between the machines,
1590 .CW cs
1591 presents a list of possible networks and addresses to be tried in sequence;
1592 it uses heuristics to decide the order.
1593 For instance, it presents the highest-bandwidth choice first.
1594 .PP
1595 A single library function called
1596 .CW dial
1597 talks to
1598 .CW cs
1599 to establish the connection.
1600 An application that uses
1601 .CW dial
1602 needs no changes, not even recompilation, to adapt to new networks;
1603 the interface to
1604 .CW cs
1605 hides the details.
1606 .PP
1607 The uniform structure for networks in Plan 9 makes the
1608 .CW import
1609 command all that is needed to construct gateways.
1610 .SH
1611 Kernel structure for networks
1612 .PP
1613 The kernel plumbing used to build Plan 9 communications
1614 channels is called
1615 .I streams
1616 [Rit84][Presotto].
1617 A stream is a bidirectional channel connecting a
1618 physical or pseudo-device to a user process.
1619 The user process inserts and removes data at one end of the stream;
1620 a kernel process acting on behalf of a device operates at
1621 the other end.
1622 A stream comprises a linear list of
1623 .I "processing modules" .
1624 Each module has both an upstream (toward the process) and
1625 downstream (toward the device)
1626 .I "put routine" .
1627 Calling the put routine of the module on either end of the stream
1628 inserts data into the stream.
1629 Each module calls the succeeding one to send data up or down the stream.
1630 Like UNIX streams [Rit84],
1631 Plan 9 streams can be dynamically configured.
1632 .SH
1633 The IL Protocol
1634 .PP
1635 The 9P protocol must run above a reliable transport protocol with delimited messages.
1636 9P has no mechanism to recover from transmission errors and
1637 the system assumes that each read from a communication channel will
1638 return a single 9P message;
1639 it does not parse the data stream to discover message boundaries.
1640 Pipes and some network protocols already have these properties but
1641 the standard IP protocols do not.
1642 TCP does not delimit messages, while
1643 UDP [RFC768] does not provide reliable in-order delivery.
1644 .PP
1645 We designed a new protocol, called IL (Internet Link), to transmit 9P messages over IP.
1646 It is a connection-based protocol that provides
1647 reliable transmission of sequenced messages between machines.
1648 Since a process can have only a single outstanding 9P request,
1649 there is no need for flow control in IL.
1650 Like TCP, IL has adaptive timeouts: it scales acknowledge and retransmission times
1651 to match the network speed.
1652 This allows the protocol to perform well on both the Internet and on local Ethernets.
1653 Also, IL does no blind retransmission,
1654 to avoid adding to the congestion of busy networks.
1655 Full details are in another paper [PrWi95].
1656 .PP
1657 In Plan 9, the implementation of IL is smaller and faster than TCP.
1658 IL is our main Internet transport protocol.
1659 .SH
1660 Overview of authentication
1661 .PP
1662 Authentication establishes the identity of a
1663 user accessing a resource.
1664 The user requesting the resource is called the
1665 .I client
1666 and the user granting access to the resource is called the
1667 .I server .
1668 This is usually done under the auspices of a 9P attach message.
1669 A user may be a client in one authentication exchange and a server in another.
1670 Servers always act on behalf of some user,
1671 either a normal client or some administrative entity, so authentication
1672 is defined to be between users, not machines.
1673 .PP
1674 Each Plan 9 user has an associated DES [NBS77] authentication key;
1675 the user's identity is verified by the ability to
1676 encrypt and decrypt special messages called challenges.
1677 Since knowledge of a user's key gives access to that user's resources,
1678 the Plan 9 authentication protocols never transmit a message containing
1679 a cleartext key.
1680 .PP
1681 Authentication is bilateral:
1682 at the end of the authentication exchange,
1683 each side is convinced of the other's identity.
1684 Every machine begins the exchange with a DES key in memory.
1685 In the case of CPU and file servers, the key, user name, and domain name
1686 for the server are read from permanent storage,
1687 usually non-volatile RAM.
1688 In the case of terminals,
1689 the key is derived from a password typed by the user at boot time.
1690 A special machine, known as the
1691 .I authentication
1692 .I server ,
1693 maintains a database of keys for all users in its administrative domain and
1694 participates in the authentication protocols.
1695 .PP
1696 The authentication protocol is as follows:
1697 after exchanging challenges, one party
1698 contacts the authentication server to create
1699 permission-granting
1700 .I tickets
1701 encrypted with
1702 each party's secret key and containing a new conversation key.
1703 Each
1704 party decrypts its own ticket and uses the conversation key to
1705 encrypt the other party's challenge.
1706 .PP
1707 This structure is somewhat like Kerberos [MBSS87], but avoids
1708 its reliance on synchronized clocks.
1709 Also
1710 unlike Kerberos, Plan 9 authentication supports a `speaks for'
1711 relation [LABW91] that enables one user to have the authority
1712 of another;
1713 this is how a CPU server runs processes on behalf of its clients.
1714 .PP
1715 Plan 9's authentication structure builds
1716 secure services rather than depending on firewalls.
1717 Whereas firewalls require special code for every service penetrating the wall,
1718 the Plan 9 approach permits authentication to be done in a single place\(em9P\(emfor
1719 all services.
1720 For example, the
1721 .CW cpu
1722 command works securely across the Internet.
1723 .SH
1724 Authenticating external connections
1725 .PP
1726 The regular Plan 9 authentication protocol is not suitable for text-based services such as
1727 Telnet
1728 or FTP.
1729 In such cases, Plan 9 users authenticate with hand-held DES calculators called
1730 .I authenticators .
1731 The authenticator holds a key for the user, distinct from
1732 the user's normal authentication key.
1733 The user `logs on' to the authenticator using a 4-digit PIN.
1734 A correct PIN enables the authenticator for a challenge/response exchange with the server.
1735 Since a correct challenge/response exchange is valid only once
1736 and keys are never sent over the network,
1737 this procedure is not susceptible to replay attacks, yet
1738 is compatible with protocols like Telnet and FTP.
1739 .SH
1740 Special users
1741 .PP
1742 Plan 9 has no super-user.
1743 Each server is responsible for maintaining its own security, usually permitting
1744 access only from the console, which is protected by a password.
1745 For example, file servers have a unique administrative user called
1746 .CW adm ,
1747 with special privileges that apply only to commands typed at the server's
1748 physical console.
1749 These privileges concern the day-to-day maintenance of the server,
1750 such as adding new users and configuring disks and networks.
1751 The privileges do
1752 .I not
1753 include the ability to modify, examine, or change the permissions of any files.
1754 If a file is read-protected by a user, only that user may grant access to others.
1755 .PP
1756 CPU servers have an equivalent user name that allows administrative access to
1757 resources on that server such as the control files of user processes.
1758 Such permission is necessary, for example, to kill rogue processes, but
1759 does not extend beyond that server.
1760 On the other hand, by means of a key
1761 held in protected non-volatile RAM,
1762 the identity of the administrative user is proven to the
1763 authentication server.
1764 This allows the CPU server to authenticate remote users, both
1765 for access to the server itself and when the CPU server is acting
1766 as a proxy on their behalf.
1767 .PP
1768 Finally, a special user called
1769 .CW none
1770 has no password and is always allowed to connect;
1771 anyone may claim to be
1772 .CW none .
1773 .CW None
1774 has restricted permissions; for example, it is not allowed to examine dump files
1775 and can read only world-readable files.
1776 .PP
1777 The idea behind
1778 .CW none
1779 is analogous to the anonymous user in FTP
1780 services.
1781 On Plan 9, guest FTP servers are further confined within a special
1782 restricted name space.
1783 It disconnects guest users from system programs, such as the contents of
1784 .CW /bin ,
1785 but makes it possible to make local files available to guests
1786 by binding them explicitly into the space.
1787 A restricted name space is more secure than the usual technique of exporting
1788 an ad hoc directory tree; the result is a kind of cage around untrusted users.
1789 .SH
1790 The cpu command and proxied authentication
1791 .PP
1792 When a call is made to a CPU server for a user, say Peter,
1793 the intent is that Peter wishes to run processes with his own authority.
1794 To implement this property,
1795 the CPU server does the following when the call is received.
1796 First, the listener forks off a process to handle the call.
1797 This process changes to the user
1798 .CW none
1799 to avoid giving away permissions if it is compromised.
1800 It then performs the authentication protocol to verify that the
1801 calling user really is Peter, and to prove to Peter that
1802 the machine is itself trustworthy.
1803 Finally, it reattaches to all relevant file servers using the
1804 authentication protocol to identify itself as Peter.
1805 In this case, the CPU server is a client of the file server and performs the
1806 client portion of the authentication exchange on behalf of Peter.
1807 The authentication server will give the process tickets to 
1808 accomplish this only if the CPU server's administrative user name is allowed to
1809 .I "speak for"
1810 Peter.
1811 .PP
1812 The
1813 .I "speaks for
1814 relation [LABW91] is kept in a table on the authentication server.
1815 To simplify the management of users computing in different authentication domains,
1816 it also contains mappings between user names in different domains,
1817 for example saying that user
1818 .CW rtm
1819 in one domain is the same person as user
1820 .CW rtmorris
1821 in another.
1822 .SH
1823 File Permissions
1824 .PP
1825 One of the advantages of constructing services as file systems
1826 is that the solutions to ownership and permission problems fall out naturally.
1827 As in UNIX,
1828 each file or directory has separate read, write, and execute/search permissions
1829 for the file's owner, the file's group, and anyone else.
1830 The idea of group is unusual:
1831 any user name is potentially a group name.
1832 A group is just a user with a list of other users in the group.
1833 Conventions make the distinction: most people have user names without group members,
1834 while groups have long lists of attached names.  For example, the
1835 .CW sys
1836 group traditionally has all the system programmers,
1837 and system files are accessible
1838 by group
1839 .CW sys .
1840 Consider the following two lines of a user database stored on a server:
1841 .P1
1842 pjw:pjw:
1843 sys::pjw,ken,philw,presotto
1844 .P2
1845 The first establishes user
1846 .CW pjw
1847 as a regular user.  The second establishes user
1848 .CW sys
1849 as a group and lists four users who are
1850 .I members
1851 of that group.
1852 The empty colon-separated field is space for a user to be named as the
1853 .I group
1854 .I leader .
1855 If a group has a leader, that user has special permissions for the group,
1856 such as freedom to change the group permissions
1857 of files in that group.
1858 If no leader is specified, each member of the group is considered equal, as if each were
1859 the leader.
1860 In our example, only
1861 .CW pjw
1862 can add members to his group, but all of
1863 .CW sys 's
1864 members are equal partners in that group.
1865 .PP
1866 Regular files are owned by the user that creates them.
1867 The group name is inherited from the directory holding the new file.
1868 Device files are treated specially:
1869 the kernel may arrange the ownership and permissions of
1870 a file appropriate to the user accessing the file.
1871 .PP
1872 A good example of the generality this offers is process files,
1873 which are owned and read-protected by the owner of the process.
1874 If the owner wants to let someone else access the memory of a process,
1875 for example to let the author of a program debug a broken image, the standard
1876 .CW chmod
1877 command applied to the process files does the job.
1878 .PP
1879 Another unusual application of file permissions
1880 is the dump file system, which is not only served by the same file
1881 server as the original data, but represented by the same user database.
1882 Files in the dump are therefore given identical protection as files in the regular
1883 file system;
1884 if a file is owned by
1885 .CW pjw
1886 and read-protected, once it is in the dump file system it is still owned by
1887 .CW pjw
1888 and read-protected.
1889 Also, since the dump file system is immutable, the file cannot be changed;
1890 it is read-protected forever.
1891 Drawbacks are that if the file is readable but should have been read-protected,
1892 it is readable forever, and that user names are hard to re-use.
1893 .SH
1894 Performance
1895 .PP
1896 As a simple measure of the performance of the Plan 9 kernel,
1897 we compared the
1898 time to do some simple operations on Plan 9 and on SGI's IRIX Release 5.3
1899 running on an SGI Challenge M with a 100MHz MIPS R4400 and a 1-megabyte
1900 secondary cache.
1901 The test program was written in Alef,
1902 compiled with the same compiler,
1903 and run on identical hardware,
1904 so the only variables are the operating system and libraries.
1905 .PP
1906 The program tests the time to do a context switch
1907 .CW rendezvous "" (
1908 on Plan 9,
1909 .CW blockproc
1910 on IRIX);
1911 a trivial system call
1912 .CW rfork(0) "" (
1913 and
1914 .CW nap(0) );
1915 and
1916 lightweight fork
1917 .CW rfork(RFPROC) "" (
1918 and
1919 .CW sproc(PR_SFDS|PR_SADDR) ).
1920 It also measures the time to send a byte on a pipe from one process
1921 to another and the throughput on a pipe between two processes.
1922 The results appear in Table 1.
1923 .KS
1924 .TS
1925 center,box;
1926 ccc
1927 lnn.
1928 Test    Plan 9  IRIX
1929 _
1930 Context switch  39 µs  150 µs
1931 System call     6 µs   36 µs
1932 Light fork      1300 µs        2200 µs
1933 Pipe latency    110 µs 200 µs
1934 Pipe bandwidth  11678 KB/s      14545 KB/s
1935 .TE
1936 .ce
1937 .I
1938 Table 1.  Performance comparison.
1939 .R
1940 .KE
1941 .LP
1942 Although the Plan 9 times are not spectacular, they show that the kernel is
1943 competitive with commercial systems.
1944 .SH
1945 Discussion
1946 .PP
1947 Plan 9 has a relatively conventional kernel;
1948 the system's novelty lies in the pieces outside the kernel and the way they interact.
1949 When building Plan 9, we considered all aspects
1950 of the system together, solving problems where the solution fit best.
1951 Sometimes the solution spanned many components.
1952 An example is the problem of heterogeneous instruction architectures,
1953 which is addressed by the compilers (different code characters, portable
1954 object code),
1955 the environment
1956 .CW $cputype "" (
1957 and
1958 .CW $objtype ),
1959 the name space
1960 (binding in
1961 .CW /bin ),
1962 and other components.
1963 Sometimes many issues could be solved in a single place.
1964 The best example is 9P,
1965 which centralizes naming, access, and authentication.
1966 9P is really the core
1967 of the system;
1968 it is fair to say that the Plan 9 kernel is primarily a 9P multiplexer.
1969 .PP
1970 Plan 9's focus on files and naming is central to its expressiveness.
1971 Particularly in distributed computing, the way things are named has profound
1972 influence on the system [Nee89].
1973 The combination of
1974 local name spaces and global conventions to interconnect networked resources
1975 avoids the difficulty of maintaining a global uniform name space,
1976 while naming everything like a file makes the system easy to understand, even for
1977 novices.
1978 Consider the dump file system, which is trivial to use for anyone familiar with
1979 hierarchical file systems.
1980 At a deeper level, building all the resources above a single uniform interface
1981 makes interoperability easy.
1982 Once a resource exports a 9P interface,
1983 it can combine transparently
1984 with any other part of the system to build unusual applications;
1985 the details are hidden.
1986 This may sound object-oriented, but there are distinctions.
1987 First, 9P defines a fixed set of `methods'; it is not an extensible protocol.
1988 More important,
1989 files are well-defined and well-understood
1990 and come prepackaged with familiar methods of access, protection, naming, and
1991 networking.
1992 Objects, despite their generality, do not come with these attributes defined.
1993 By reducing `object' to `file', Plan 9 gets some technology for free.
1994 .PP
1995 Nonetheless, it is possible to push the idea of file-based computing too far.
1996 Converting every resource in the system into a file system is a kind of metaphor,
1997 and metaphors can be abused.
1998 A good example of restraint is
1999 .CW /proc ,
2000 which is only a view of a process, not a representation.
2001 To run processes, the usual
2002 .CW fork
2003 and
2004 .CW exec
2005 calls are still necessary, rather than doing something like
2006 .P1
2007 cp /bin/date /proc/clone/mem
2008 .P2
2009 The problem with such examples is that they require the server to do things
2010 not under its control.
2011 The ability to assign meaning to a command like this does not
2012 imply the meaning will fall naturally out of the structure of answering the 9P requests
2013 it generates.
2014 As a related example, Plan 9 does not put machine's network names in the file
2015 name space.
2016 The network interfaces provide a very different model of naming, because using
2017 .CW open ,
2018 .CW create ,
2019 .CW read ,
2020 and
2021 .CW write
2022 on such files would not offer a suitable place to encode all the details of call
2023 setup for an arbitrary network.
2024 This does not mean that the network interface cannot be file-like, just that it must
2025 have a more tightly defined structure.
2026 .PP
2027 What would we do differently next time?
2028 Some elements of the implementation are unsatisfactory.
2029 Using streams to implement network interfaces in the kernel
2030 allows protocols to be connected together dynamically,
2031 such as to attach the same TTY driver to TCP, URP, and
2032 IL connections,
2033 but Plan 9 makes no use of this configurability.
2034 (It was exploited, however, in the research UNIX system for which
2035 streams were invented.)
2036 Replacing streams by static I/O queues would
2037 simplify the code and make it faster.
2038 .PP
2039 Although the main Plan 9 kernel is portable across many machines,
2040 the file server is implemented separately.
2041 This has caused several problems:
2042 drivers that must be written twice,
2043 bugs that must be fixed twice,
2044 and weaker portability of the file system code.
2045 The solution is easy: the file server kernel should be maintained
2046 as a variant of the regular operating system, with no user processes and
2047 special compiled-in
2048 kernel processes to implement file service.
2049 Another improvement to the file system would be a change of internal structure.
2050 The WORM jukebox is the least reliable piece of the hardware, but because
2051 it holds the metadata of the file system, it must be present in order to serve files.
2052 The system could be restructured so the WORM is a backup device only, with the
2053 file system proper residing on magnetic disks.
2054 This would require no change to the external interface.
2055 .PP
2056 Although Plan 9 has per-process name spaces, it has no mechanism to give the
2057 description of a process's name space to another process except by direct inheritance.
2058 The
2059 .CW cpu
2060 command, for example, cannot in general reproduce the terminal's name space;
2061 it can only re-interpret the user's login profile and make substitutions for things like
2062 the name of the binary directory to load.
2063 This misses any local modifications made before running
2064 .CW cpu .
2065 It should instead be possible to capture the terminal's name space and transmit
2066 its description to a remote process.
2067 .PP
2068 Despite these problems, Plan 9 works well.
2069 It has matured into the system that supports our research,
2070 rather than being the subject of the research itself.
2071 Experimental new work includes developing interfaces to faster networks,
2072 file caching in the client kernel,
2073 encapsulating and exporting name spaces,
2074 and the ability to re-establish the client state after a server crash.
2075 Attention is now focusing on using the system to build distributed applications.
2076 .PP
2077 One reason for Plan 9's success is that we use it for our daily work, not just as a research tool.
2078 Active use forces us to address shortcomings as they arise and to adapt the system
2079 to solve our problems.
2080 Through this process, Plan 9 has become a comfortable, productive programming
2081 environment, as well as a vehicle for further systems research.
2082 .SH
2083 References
2084 .nr PS -1
2085 .nr VS -2
2086 .IP [9man] 9
2087 .I
2088 Plan 9 Programmer's Manual,
2089 Volume 1,
2090 .R
2091 AT&T Bell Laboratories,
2092 Murray Hill, NJ,
2093 1995.
2094 .IP [ANSIC] 9
2095 \f2American National Standard for Information Systems \-
2096 Programming Language C\f1, American National Standards Institute, Inc.,
2097 New York, 1990.
2098 .IP [Duff90] 9
2099 Tom Duff, ``Rc - A Shell for Plan 9 and UNIX systems'',
2100 .I
2101 Proc. of the Summer 1990 UKUUG Conf.,
2102 .R
2103 London, July, 1990, pp. 21-33, reprinted, in a different form, in this volume.
2104 .IP [Fra80] 9
2105 A.G. Fraser,
2106 ``Datakit \- A Modular Network for Synchronous and Asynchronous Traffic'',
2107 .I
2108 Proc. Int. Conf. on Commun.,
2109 .R
2110 June 1980, Boston, MA.
2111 .IP [FSSUTF] 9
2112 .I
2113 File System Safe UCS Transformation Format (FSS-UTF),
2114 .R
2115 X/Open Preliminary Specification, 1993.
2116 ISO designation is
2117 ISO/IEC JTC1/SC2/WG2 N 1036, dated 1994-08-01.
2118 .IP "[ISO10646] " 9
2119 ISO/IEC DIS 10646-1:1993
2120 .I
2121 Information technology \-
2122 Universal Multiple-Octet Coded Character Set (UCS) \(em
2123 Part 1: Architecture and Basic Multilingual Plane.
2124 .R
2125 .IP [Kill84] 9
2126 T.J. Killian,
2127 ``Processes as Files'',
2128 .I
2129 USENIX Summer 1984 Conf. Proc.,
2130 .R
2131 June 1984, Salt Lake City, UT.
2132 .IP "[LABW91] " 9
2133 Butler Lampson,
2134 Martín Abadi,
2135 Michael Burrows, and
2136 Edward Wobber,
2137 ``Authentication in Distributed Systems: Theory and Practice'',
2138 .I
2139 Proc. 13th ACM Symp. on Op. Sys. Princ.,
2140 .R
2141 Asilomar, 1991,
2142 pp. 165-182.
2143 .IP "[MBSS87] " 9
2144 S. P. Miller,
2145 B. C. Neumann,
2146 J. I. Schiller, and
2147 J. H. Saltzer,
2148 ``Kerberos Authentication and Authorization System'',
2149 Massachusetts Institute of Technology,
2150 1987.
2151 .IP [NBS77] 9
2152 National Bureau of Standards (U.S.),
2153 .I
2154 Federal Information Processing Standard 46,
2155 .R
2156 National Technical Information Service, Springfield, VA, 1977.
2157 .IP [Nee89] 9
2158 R. Needham, ``Names'', in
2159 .I
2160 Distributed systems,
2161 .R
2162 S. Mullender, ed.,
2163 Addison Wesley, 1989
2164 .IP "[NeHe82] " 9
2165 R.M. Needham and A.J. Herbert,
2166 .I
2167 The Cambridge Distributed Computing System,
2168 .R
2169 Addison-Wesley, London, 1982
2170 .IP [Neu92] 9
2171 B. Clifford Neuman,
2172 ``The Prospero File System'',
2173 .I
2174 USENIX File Systems Workshop Proc.,
2175 .R
2176 Ann Arbor, 1992, pp. 13-28.
2177 .IP "[OCDNW88] " 9
2178 John Ousterhout, Andrew Cherenson, Fred Douglis, Mike Nelson, and Brent Welch,
2179 ``The Sprite Network Operating System'',
2180 .I
2181 IEEE Computer,
2182 .R
2183 21(2), 23-38, Feb. 1988.
2184 .IP [Pike87] 9
2185 Rob Pike, ``The Text Editor \f(CWsam\fP'',
2186 .I
2187 Software - Practice and Experience,
2188 .R
2189 Nov 1987, \f3\&17\f1(11), pp. 813-845; reprinted in this volume.
2190 .IP [Pike91] 9
2191 Rob Pike, ``8½, the Plan 9 Window System'',
2192 .I
2193 USENIX Summer Conf. Proc.,
2194 .R
2195 Nashville, June, 1991, pp. 257-265,
2196 reprinted in this volume.
2197 .IP [Pike93] 9
2198 Rob Pike and Ken Thompson, ``Hello World or Καλημέρα κόσμε or
2199 \f(Jpこんにちは 世界\fP'',
2200 .I
2201 USENIX Winter Conf. Proc.,
2202 .R
2203 San Diego, 1993, pp. 43-50,
2204 reprinted in this volume.
2205 .IP [Pike94] 9
2206 Rob Pike,
2207 ``Acme: A User Interface for Programmers'',
2208 .I
2209 USENIX Proc. of the Winter 1994 Conf.,
2210 .R
2211 San Francisco, CA,
2212 .IP [Pike95] 9
2213 Rob Pike,
2214 ``How to Use the Plan 9 C Compiler'',
2215 .I
2216 Plan 9 Programmer's Manual,
2217 Volume 2,
2218 .R
2219 AT&T Bell Laboratories,
2220 Murray Hill, NJ,
2221 1995.
2222 .IP [POSIX] 9
2223 .I
2224 Information Technology\(emPortable Operating
2225 System Interface (POSIX) Part 1:
2226 System Application Program Interface (API)
2227 [C Language],
2228 .R
2229 IEEE, New York, 1990.
2230 .IP "[PPTTW93] " 9
2231 Rob Pike, Dave Presotto, Ken Thompson, Howard Trickey, and Phil Winterbottom, ``The Use of Name Spaces in Plan 9'',
2232 .I
2233 Op. Sys. Rev.,
2234 .R
2235 Vol. 27, No. 2, April 1993, pp. 72-76,
2236 reprinted in this volume.
2237 .IP [Presotto] 9
2238 Dave Presotto,
2239 ``Multiprocessor Streams for Plan 9'',
2240 .I
2241 UKUUG Summer 1990 Conf. Proc.,
2242 .R
2243 July 1990, pp. 11-19.
2244 .IP [PrWi93] 9
2245 Dave Presotto and Phil Winterbottom,
2246 ``The Organization of Networks in Plan 9'',
2247 .I
2248 USENIX Proc. of the Winter 1993 Conf.,
2249 .R
2250 San Diego, CA,
2251 pp. 43-50,
2252 reprinted in this volume.
2253 .IP [PrWi95] 9
2254 Dave Presotto and Phil Winterbottom,
2255 ``The IL Protocol'',
2256 .I
2257 Plan 9 Programmer's Manual,
2258 Volume 2,
2259 .R
2260 AT&T Bell Laboratories,
2261 Murray Hill, NJ,
2262 1995.
2263 .IP "[RFC768] " 9
2264 J. Postel, RFC768,
2265 .I "User Datagram Protocol,
2266 .I "DARPA Internet Program Protocol Specification,
2267 August 1980.
2268 .IP "[RFC793] " 9
2269 RFC793,
2270 .I "Transmission Control Protocol,
2271 .I "DARPA Internet Program Protocol Specification,
2272 September 1981.
2273 .IP [Rao91] 9
2274 Herman Chung-Hwa Rao,
2275 .I
2276 The Jade File System,
2277 .R
2278 (Ph. D. Dissertation),
2279 Dept. of Comp. Sci,
2280 University of Arizona,
2281 TR 91-18.
2282 .IP [Rit84] 9
2283 D.M. Ritchie,
2284 ``A Stream Input-Output System'',
2285 .I
2286 AT&T Bell Laboratories Technical Journal,
2287 \f363\f1(8), October, 1984.
2288 .IP [Tric95] 9
2289 Howard Trickey,
2290 ``APE \(em The ANSI/POSIX Environment'',
2291 .I
2292 Plan 9 Programmer's Manual,
2293 Volume 2,
2294 .R
2295 AT&T Bell Laboratories,
2296 Murray Hill, NJ,
2297 1995.
2298 .IP [Unicode] 9
2299 .I
2300 The Unicode Standard,
2301 Worldwide Character Encoding,
2302 Version 1.0, Volume 1,
2303 .R
2304 The Unicode Consortium,
2305 Addison Wesley,
2306 New York,
2307 1991.
2308 .IP [UNIX85] 9
2309 .I
2310 UNIX Time-Sharing System Programmer's Manual,
2311 Research Version, Eighth Edition, Volume 1.
2312 .R
2313 AT&T Bell Laboratories, Murray Hill, NJ, 1985.
2314 .IP [Welc94] 9
2315 Brent Welch,
2316 ``A Comparison of Three Distributed File System Architectures: Vnode, Sprite, and Plan 9'',
2317 .I
2318 Computing Systems,
2319 .R
2320 7(2), pp. 175-199, Spring, 1994.
2321 .IP [Wint95] 9
2322 Phil Winterbottom,
2323 ``Alef Language Reference Manual'',
2324 .I
2325 Plan 9 Programmer's Manual,
2326 Volume 2,
2327 .R
2328 AT&T Bell Laboratories,
2329 Murray Hill, NJ,
2330 1995.