%!PS %%Version: 3.3.2 %%DocumentFonts: (atend) %%Pages: (atend) %%EndComments % % Version 3.3.2 prologue for troff files. % /#copies 1 store /aspectratio 1 def /formsperpage 1 def /landscape false def /linewidth .3 def /magnification 1 def /margin 0 def /orientation 0 def /resolution 720 def /rotation 1 def /xoffset 0 def /yoffset 0 def /roundpage true def /useclippath true def /pagebbox [0 0 612 792] def /R /Times-Roman def /I /Times-Italic def /B /Times-Bold def /BI /Times-BoldItalic def /H /Helvetica def /HI /Helvetica-Oblique def /HB /Helvetica-Bold def /HX /Helvetica-BoldOblique def /CW /Courier def /CO /Courier def /CI /Courier-Oblique def /CB /Courier-Bold def /CX /Courier-BoldOblique def /PA /Palatino-Roman def /PI /Palatino-Italic def /PB /Palatino-Bold def /PX /Palatino-BoldItalic def /Hr /Helvetica-Narrow def /Hi /Helvetica-Narrow-Oblique def /Hb /Helvetica-Narrow-Bold def /Hx /Helvetica-Narrow-BoldOblique def /KR /Bookman-Light def /KI /Bookman-LightItalic def /KB /Bookman-Demi def /KX /Bookman-DemiItalic def /AR /AvantGarde-Book def /AI /AvantGarde-BookOblique def /AB /AvantGarde-Demi def /AX /AvantGarde-DemiOblique def /NR /NewCenturySchlbk-Roman def /NI /NewCenturySchlbk-Italic def /NB /NewCenturySchlbk-Bold def /NX /NewCenturySchlbk-BoldItalic def /ZD /ZapfDingbats def /ZI /ZapfChancery-MediumItalic def /S /S def /S1 /S1 def /GR /Symbol def /inch {72 mul} bind def /min {2 copy gt {exch} if pop} bind def /show {show} bind def % so later references don't bind /widthshow {widthshow} bind def /stringwidth {stringwidth} bind def /setup { counttomark 2 idiv {def} repeat pop landscape {/orientation 90 orientation add def} if /scaling 72 resolution div def linewidth setlinewidth 1 setlinecap pagedimensions xcenter ycenter translate orientation rotation mul rotate width 2 div neg height 2 div translate xoffset inch yoffset inch neg translate margin 2 div dup neg translate magnification dup aspectratio mul scale scaling scaling scale addmetrics 0 0 moveto } def /pagedimensions { useclippath userdict /gotpagebbox known not and { /pagebbox [clippath pathbbox newpath] def roundpage currentdict /roundpagebbox known and {roundpagebbox} if } if pagebbox aload pop 4 -1 roll exch 4 1 roll 4 copy landscape {4 2 roll} if sub /width exch def sub /height exch def add 2 div /xcenter exch def add 2 div /ycenter exch def userdict /gotpagebbox true put } def /addmetrics { /Symbol /S null Sdefs cf /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf } def /pagesetup { /page exch def currentdict /pagedict known currentdict page known and { page load pagedict exch get cvx exec } if } def /decodingdefs [ {counttomark 2 idiv {y moveto show} repeat} {neg /y exch def counttomark 2 idiv {y moveto show} repeat} {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} {counttomark 2 idiv {y moveto show} repeat} {neg setfunnytext} ] def /setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def /w {neg moveto show} bind def /m {neg dup /y exch def moveto} bind def /done {/lastpage where {pop lastpage} if} def /f { dup /font exch def findfont exch dup /ptsize exch def scaling div dup /size exch def scalefont setfont linewidth ptsize mul scaling 10 mul div setlinewidth /spacewidth ( ) stringwidth pop def } bind def /changefont { /fontheight exch def /fontslant exch def currentfont [ 1 0 fontheight ptsize div fontslant sin mul fontslant cos div fontheight ptsize div 0 0 ] makefont setfont } bind def /sf {f} bind def /cf { dup length 2 idiv /entries exch def /chtab exch def /newencoding exch def /newfont exch def findfont dup length 1 add dict /newdict exch def {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall newencoding type /arraytype eq {newdict /Encoding newencoding put} if newdict /Metrics entries dict put newdict /Metrics get begin chtab aload pop 1 1 entries {pop def} for newfont newdict definefont pop end } bind def % % A few arrays used to adjust reference points and character widths in some % of the printer resident fonts. If square roots are too high try changing % the lines describing /radical and /radicalex to, % % /radical [0 -75 550 0] % /radicalex [-50 -75 500 0] % % Move braceleftbt a bit - default PostScript character is off a bit. % /Sdefs [ /bracketlefttp [201 500] /bracketleftbt [201 500] /bracketrighttp [-81 380] /bracketrightbt [-83 380] /braceleftbt [203 490] /bracketrightex [220 -125 500 0] /radical [0 0 550 0] /radicalex [-50 0 500 0] /parenleftex [-20 -170 0 0] /integral [100 -50 500 0] /infinity [10 -75 730 0] ] def /S1defs [ /underscore [0 80 500 0] /endash [7 90 650 0] ] def % % Tries to round clipping path dimensions, as stored in array pagebbox, so they % match one of the known sizes in the papersizes array. Lower left coordinates % are always set to 0. % /roundpagebbox { 7 dict begin /papersizes [8.5 inch 11 inch 14 inch 17 inch] def /mappapersize { /val exch def /slop .5 inch def /diff slop def /j 0 def 0 1 papersizes length 1 sub { /i exch def papersizes i get val sub abs dup diff le {/diff exch def /j i def} {pop} ifelse } for diff slop lt {papersizes j get} {val} ifelse } def pagebbox 0 0 put pagebbox 1 0 put pagebbox dup 2 get mappapersize 2 exch put pagebbox dup 3 get mappapersize 3 exch put end } bind def %%EndProlog %%BeginSetup mark /linewidth 0.5 def /#copies 1 store /landscape false def /resolution 720 def % % Encoding vector and redefinition of findfont for the ISO Latin1 standard. % The 18 characters missing from ROM based fonts on older printers are noted % below. % /ISOLatin1Encoding [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /minus /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space /exclamdown /cent /sterling /currency /yen /brokenbar % missing /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree % missing /plusminus % missing /twosuperior % missing /threesuperior % missing /acute /mu % missing /paragraph /periodcentered /cedilla /onesuperior % missing /ordmasculine /guillemotright /onequarter % missing /onehalf % missing /threequarters % missing /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth % missing /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply % missing /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute % missing /Thorn % missing /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth % missing /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide % missing /oslash /ugrave /uacute /ucircumflex /udieresis /yacute % missing /thorn % missing /ydieresis ] def /NewFontDirectory FontDirectory maxlength dict def % % Apparently no guarantee findfont is defined in systemdict so the obvious % % systemdict /findfont get exec % % can generate an error. So far the only exception is a VT600 (version 48.0). % userdict /@RealFindfont known not { userdict begin /@RealFindfont systemdict begin /findfont load end def end } if /findfont { dup NewFontDirectory exch known not { dup %dup systemdict /findfont get exec % not always in systemdict dup userdict /@RealFindfont get exec dup /Encoding get StandardEncoding eq { dup length dict begin {1 index /FID ne {def}{pop pop} ifelse} forall /Encoding ISOLatin1Encoding def currentdict end /DummyFontName exch definefont } if NewFontDirectory 3 1 roll put } if NewFontDirectory exch get } bind def setup 2 setdecoding %%EndSetup %%Page: 1 1 /saveobj save def mark 1 pagesetup 12 B f (The Use of Name Spaces in Plan 9)7 1737 1 2011 1230 t 10 I f (Rob Pike)1 363 1 2698 1470 t (Dave Presotto)1 574 1 2593 1590 t (Ken Thompson)1 603 1 2578 1710 t (Howard Trickey)1 652 1 2554 1830 t (Phil Winterbottom)1 742 1 2509 1950 t 10 R f (AT&T Bell Laboratories)2 993 1 2383 2130 t (Murray Hill, New Jersey 07974)4 1267 1 2246 2250 t (USA)2780 2370 w 10 I f (ABSTRACT)2643 2750 w 10 R f ( distributed system built at the Computing Sciences Research Center of)10 2918(Plan 9 is a)3 432 2 1330 3010 t ( goal is to provide a production\255)6 1378( Its)1 166( last few years.)3 646(AT&T Bell Laboratories over the)4 1410 4 1080 3130 t ( development and general computation using heterogeneous)6 2474(quality system for software)3 1126 2 1080 3250 t ( file servers in a)4 677( Plan 9 system comprises CPU and)6 1466( A)1 133(hardware and minimal software.)3 1324 4 1080 3370 t ( networks fan out to)4 931( Slower)1 366( fast networks.)2 651(central location connected together by)4 1652 4 1080 3490 t ( a few)2 259( 9 argues that given)4 818( Plan)1 237(workstation\255class machines that serve as user terminals.)6 2286 4 1080 3610 t ( to produce a small operating system that)7 1661(carefully implemented abstractions it is possible)5 1939 2 1080 3730 t ( largest systems on a variety of architectures and networks. The)10 2616(provides support for the)3 984 2 1080 3850 t ( are built on two ideas: a per\255process name space and a simple)12 2555(foundations of the system)3 1045 2 1080 3970 t (message\255oriented file system protocol.)3 1542 1 1080 4090 t ( single)1 269(The operating system for the CPU servers and terminals is structured as a traditional kernel: a)15 3801 2 970 4366 t ( control, user processes, virtual memory,)5 1625(compiled image containing code for resource management, process)7 2695 2 720 4486 t ( system is not compiled in, although the man\255)8 1833( the file server is a separate machine, the file)9 1778( Because)1 382(and I/O.)1 327 4 720 4606 t ( kernel for the multiprocessor SGI Power)6 1665( entire)1 256( The)1 209(agement of the name space, a per\255process attribute, is.)8 2190 4 720 4726 t ( including the Ether\255)3 836(Series machine is 25000 lines of C, the largest part of which is code for four networks)16 3484 2 720 4846 t ( a functional kernel)3 803( than 1500 lines are machine\255specific, and)6 1748( Fewer)1 310(net with the Internet protocol suite.)5 1459 4 720 4966 t (with minimal I/O can be put together from source files totaling 6000 lines. [Pike90])13 3347 1 720 5086 t ( accrete as)2 418( it is all new: it has not had time to)10 1394( First,)1 260(The system is relatively small for several reasons.)7 1998 4 970 5242 t ( other than the network protocol, it adheres to no external)10 2353( Also,)1 270(many fixes and features as other systems.)6 1697 3 720 5362 t ( stems from careful selection of services and)7 1853( Economy)1 443(interface; in particular, it is not Unix\255compatible.)6 2024 3 720 5482 t ( wherever possible the system is built around two simple ideas: every resource in the)14 3538(interfaces. Finally,)1 782 2 720 5602 t ( or remote, is represented by a hierarchical file system; and a user or process assembles)15 3540(system, either local)2 780 2 720 5722 t (a private view of the system by constructing a file)9 1994 1 720 5842 t 10 I f (name space)1 468 1 2739 5842 t 10 R f (that connects these resources. [Needham])4 1653 1 3232 5842 t 10 B f (File Protocol)1 546 1 720 6082 t 10 R f ( does not mean that they are repositories for per\255)9 1982( That)1 238( 9 look like file systems.)5 1003(All resources in Plan)3 847 4 970 6238 t ( finding files \(resources\) in a hierarchical)6 1651(manent files on disk, but that the interface to them is file\255oriented:)11 2669 2 720 6358 t ( are)1 162( There)1 298(name tree, attaching to them by name, and accessing their contents by read and write calls.)15 3860 3 720 6478 t ( this level of abstraction,)4 993( At)1 152( traditional files.)2 662(dozens of file system types in Plan 9, but only a few represent)12 2513 4 720 6598 t ( objects, except that files are already provided with naming, access, and protec\255)12 3203(files in Plan 9 are similar to)6 1117 2 720 6718 t ( this)1 173( readers may approach the rest of)6 1347( Object\255oriented)1 680(tion methods that must be created afresh for objects.)8 2120 4 720 6838 t (paper as a study in how to make objects look like files.)11 2192 1 720 6958 t (The interface to file systems is defined by a protocol, called 9P, analogous but not very similar to the)18 4070 1 970 7114 t ( of a file)3 350( protocol talks about files, not blocks; given a connection to the root directory)13 3186( The)1 211(NFS protocol.)1 573 4 720 7234 t cleartomark showpage saveobj restore %%EndPage: 1 1 %%Page: 2 2 /saveobj save def mark 2 pagesetup 10 R f (\255 2 \255)2 166 1 2797 480 t ( bytes in)2 355(server, the 9P messages navigate the file hierarchy, open files for I/O, and read or write arbitrary)16 3965 2 720 840 t ( initializing and authenticating a connection and fourteen)7 2305( contains 17 message types: three for)6 1505( 9P)1 161(the files.)1 349 4 720 960 t ( user\255 or kernel\255level I/O)4 1003( messages are generated by the kernel in response to)9 2104( The)1 207(for manipulating objects.)2 1006 4 720 1080 t ( is a quick tour of the major message types: The)10 1924(requests. Here)1 596 2 720 1200 t 10 CW f (auth)3266 1200 w 10 R f (and)3532 1200 w 10 CW f (attach)3702 1200 w 10 R f (messages authenticate a)2 953 1 4087 1200 t ( result is an authenticated)4 1043( The)1 212(connection, established by means outside 9P, and validate its user.)9 2716 3 720 1320 t 10 I f (channel)4724 1320 w 10 R f ( The)1 217(that points to the root of the server.)7 1488 2 720 1440 t 10 CW f (clone)2462 1440 w 10 R f ( existing)1 353(message makes a new channel identical to an)7 1888 2 2799 1440 t ( a)1 78(channel, which may be moved to a file on the server using)11 2417 2 720 1560 t 10 CW f (walk)3249 1560 w 10 R f (message to descend each level in the)6 1517 1 3523 1560 t (hierarchy. The)1 608 1 720 1680 t 10 CW f (stat)1354 1680 w 10 R f (and)1620 1680 w 10 CW f (wstat)1790 1680 w 10 R f (messages read and write the attributes of the file pointed to by a channel.)13 2924 1 2116 1680 t (The)720 1800 w 10 CW f (open)900 1800 w 10 R f (message prepares a channel for subsequent)5 1714 1 1165 1800 t 10 CW f (read)2904 1800 w 10 R f (and)3169 1800 w 10 CW f (write)3338 1800 w 10 R f (messages to access the contents of)5 1377 1 3663 1800 t (the file, while)2 554 1 720 1920 t 10 CW f (create)1300 1920 w 10 R f (and)1686 1920 w 10 CW f (remove)1856 1920 w 10 R f ( The)1 205( actions implied by their names.)5 1277(perform, on the files, the)4 991 3 2242 1920 t 10 CW f (clunk)4740 1920 w 10 R f ( of the 9P messages consider caching; file)7 1791( None)1 283(message discards a channel without affecting the file.)7 2246 3 720 2040 t ( within the server \(centralized caching\) or by implementing the)9 2619(caches are provided, when needed, either)5 1701 2 720 2160 t (cache as a transparent file system between the client and the 9P connection to the server \(client caching\).)17 4184 1 720 2280 t ( the connection to local kernel\255resident file systems, misleadingly called)9 2912(For efficiency,)1 589 2 970 2436 t 10 I f (devices,)4499 2436 w 10 R f (is by)1 195 1 4845 2436 t ( types.)1 310( 9P message)2 542( procedures map one\255to\255one with)4 1419( The)1 230(regular rather than remote procedure calls.)5 1819 5 720 2556 t ( associated data structure that holds a type field used to index a table of proce\255)15 3184(Locally each channel has an)4 1136 2 720 2676 t ( kernel\255)1 317(dure calls, one set per file system type, analogous to selecting the method set for an object. One)17 4003 2 720 2796 t (resident file system, the)3 958 1 720 2916 t 10 I f (mount device,)1 557 1 1706 2916 t 10 R f (translates the local 9P procedure calls into RPC messages to remote)10 2748 1 2292 2916 t ( or IL, a new reliable datagram protocol,)7 1629(services over a separately provided transport protocol such as TCP)9 2691 2 720 3036 t ( The)1 212( transmit the messages over the transport layer.)7 1929( and read calls)3 591( Write)1 283(or over a pipe to a user process.)7 1305 5 720 3156 t ( by user programs and remote and)6 1424(mount device is the sole bridge between the procedural interface seen)10 2896 2 720 3276 t ( associated marshaling, buffer management, and multiplexing and is the only)10 3104( does all)2 337( It)1 113(user\255level services.)1 766 4 720 3396 t ( stub)1 200( is no RPC)3 459( There)1 291( mount device is in effect a proxy object.)8 1705( The)1 214(integral RPC mechanism in Plan 9.)5 1451 6 720 3516 t (compiler; instead the mount driver and all servers just share a library that packs and unpacks 9P messages.)17 4254 1 720 3636 t 10 B f (Examples)720 3876 w 10 R f ( stand\255alone multiprocessor)2 1122(One file system type serves permanent files from the main file server, a)12 2948 2 970 4032 t ( the data, fronted by a two\255level block cache)8 1786(system with a 350\255gigabyte optical WORM jukebox that holds)8 2534 2 720 4152 t ( connect to the file server)5 1066( Clients)1 345( megabytes of RAM.)3 871(comprising 7 gigabytes of magnetic disk and 128)7 2038 4 720 4272 t ( runs a distinct)3 604( file server)2 440( The)1 212(using any of a variety of networks and protocols and access files using 9P.)13 3064 4 720 4392 t ( restricted set of commands available)5 1523(operating system and has no support for user processes; other than a)11 2797 2 720 4512 t (on the console, all it does is answer 9P messages from clients.)11 2478 1 720 4632 t ( and marks dirty blocks)4 998(Once a day, at 5:00 AM, the file server sweeps through the cache blocks)13 3072 2 970 4788 t ( current date, for example)4 1099( creates a copy of the root directory and labels it with the)12 2501(copy\255on\255write. It)1 720 3 720 4908 t 10 CW f (1992/0314)720 5028 w 10 R f ( result is that)3 517( The)1 206( to copy the dirty blocks to the WORM.)8 1599( then starts a background process)5 1322(. It)1 136 5 1260 5028 t ( is)1 92( set of old root directories)5 1034( The)1 206(the server retains an image of the file system as it was early each morning.)14 2988 4 720 5148 t ( advantages)1 477( Several)1 357(accessible using 9P, so a client may examine backup files using ordinary commands.)12 3486 3 720 5268 t ( com\255)1 237( obviously, ordinary)2 824( Most)1 264(stem from having the backup service implemented as a plain file system.)11 2995 4 720 5388 t ( example, to see when a bug was fixed)8 1538( For)1 189(mands can access them.)3 953 3 720 5508 t 9 CW f (grep 'mouse bug fix' 1992/*/sys/src/cmd/8\275/file.c)4 2646 1 1008 5678 t 10 R f ( it is a)3 260( Because)1 388( and other properties of the files are also backed up.)10 2124(The owner, access times, permissions,)4 1548 4 720 5858 t (file system, the backup still has protections; it is not possible to subvert security by looking at the backup.)18 4232 1 720 5978 t ( within the)2 434( number of unusual services are provided)6 1658( A)1 124(The file server is only one type of file system.)9 1854 4 970 6134 t ( include net\255)2 505( They)1 258( such as disks.)3 581( services are not limited to I/O devices)7 1567( These)1 292(kernel as local file systems.)4 1117 6 720 6254 t ( and their associated protocols, the bitmap display and mouse, a representation of processes)13 3782(work devices)1 538 2 720 6374 t (similar to)1 384 1 720 6494 t 10 CW f (/proc)1132 6494 w 10 R f ( that form the `environment' passed to a new process, pro\255)10 2351([Killian], the name/value pairs)3 1229 2 1460 6494 t ( represented as a file system)5 1152( of these is)3 445( Each)1 254(filing services, and other resources.)4 1433 4 720 6614 t 10 S1 f (\320)4035 6614 w 10 R f (directories containing)1 874 1 4166 6614 t (sets of files)2 461 1 720 6734 t 10 S1 f (\320)1209 6734 w 10 R f ( they are closer)3 612( Instead,)1 365( constituent files do not represent permanent storage on disk.)9 2448(but the)1 278 4 1337 6734 t (in properties to UNIX device files.)5 1386 1 720 6854 t (For example, the)2 756 1 970 7010 t 10 I f (console)1792 7010 w 10 R f (device contains the file)3 1049 1 2164 7010 t 10 CW f (/dev/cons)3280 7010 w 10 R f (, similar to the UNIX file)5 1220 1 3820 7010 t 10 CW f (/dev/console)720 7130 w 10 R f (: when written,)2 638 1 1440 7130 t 10 CW f (/dev/cons)2121 7130 w 10 R f ( the console typescript; when read, it returns)7 1888(appends to)1 448 2 2704 7130 t ( in the console device include)5 1234( files)1 206( Other)1 286(characters typed on the keyboard.)4 1379 4 720 7250 t 10 CW f (/dev/time)3860 7250 w 10 R f (, the number of)3 640 1 4400 7250 t cleartomark showpage saveobj restore %%EndPage: 2 2 %%Page: 3 3 /saveobj save def mark 3 pagesetup 10 R f (\255 3 \255)2 166 1 2797 480 t (seconds since the epoch,)3 1005 1 720 840 t 10 CW f (/dev/cputime)1758 840 w 10 R f ( reading the device,)3 802(, the computation time used by the process)7 1760 2 2478 840 t 10 CW f (/dev/pid)720 960 w 10 R f (, the process id of the process reading the device, and)10 2158 1 1200 960 t 10 CW f (/dev/user)3386 960 w 10 R f (, the login name of the user)6 1114 1 3926 960 t ( so their use is free of byte\255order)7 1390( these files contain text, not binary numbers,)7 1871( All)1 192(accessing the device.)2 867 4 720 1080 t ( when read; when written, they cause modifications to)8 2184( contents are synthesized on demand)5 1471(problems. Their)1 665 3 720 1200 t (kernel data structures.)2 878 1 720 1320 t (The)970 1476 w 10 I f (process)1160 1476 w 10 R f (device contains one directory per live local process, named by its numeric process id:)13 3540 1 1500 1476 t 10 CW f (/proc/1)720 1596 w 10 R f (,)1140 1596 w 10 CW f (/proc/2)1197 1596 w 10 R f ( example, in)2 503( For)1 195( the process.)2 508( directory contains a set of files that access)8 1763( Each)1 256(, etc.)1 198 6 1617 1596 t ( the file)2 309(each directory)1 568 2 720 1716 t 10 CW f (mem)1624 1716 w 10 R f (is an image of the virtual memory of the process that may be read or written for)16 3209 1 1831 1716 t (debugging. The)1 666 1 720 1836 t 10 CW f (text)1425 1836 w 10 R f ( the file from which the process was executed; it may be)11 2391(file is a sort of link to)6 945 2 1704 1836 t ( The)1 214(opened to read the symbol tables for the process.)8 2021 2 720 1956 t 10 CW f (ctl)2989 1956 w 10 R f ( such as)2 336(file may be written textual messages)5 1501 2 3203 1956 t 10 CW f (stop)720 2076 w 10 R f (or)994 2076 w 10 CW f (kill)1111 2076 w 10 R f ( The)1 213(to control the execution of the process.)6 1604 2 1385 2076 t 10 CW f (status)3235 2076 w 10 R f (file contains a fixed\255format line of)5 1412 1 3628 2076 t ( strings written to the)4 862( Text)1 236( its name, owner, state, and so on.)7 1372(text containing information about the process:)5 1850 4 720 2196 t 10 CW f (note)720 2316 w 10 R f ( to the process as)4 690(file are delivered)2 681 2 988 2316 t 10 I f (notes,)2386 2316 w 10 R f ( providing these services as)4 1106( By)1 169(analogous to UNIX signals.)3 1116 3 2649 2316 t ( as system calls \(such as)5 1063(textual I/O on files rather than)5 1296 2 720 2436 t 10 CW f (kill)3123 2436 w 10 R f (\) or special\255purpose operations \(such as)5 1677 1 3363 2436 t 10 CW f (ptrace)720 2556 w 10 R f ( For)1 190( and related programs.)3 895(\), the Plan 9 process device simplifies the implementation of debuggers)10 2875 3 1080 2556 t (example, the command)2 929 1 720 2676 t 9 CW f (cat /proc/*/status)1 972 1 1008 2846 t 10 R f (is a crude form of the)5 856 1 720 3026 t 10 CW f (ps)1601 3026 w 10 R f (command; the actual)2 832 1 1746 3026 t 10 CW f (ps)2603 3026 w 10 R f (merely reformats the data so obtained.)5 1530 1 2748 3026 t (The)970 3182 w 10 I f (bitmap)1160 3182 w 10 R f (device contains three files,)3 1097 1 1474 3182 t 10 CW f (/dev/mouse)2607 3182 w 10 R f (,)3207 3182 w 10 CW f (/dev/screen)3268 3182 w 10 R f (, and)1 205 1 3928 3182 t 10 CW f (/dev/bitblt)4169 3182 w 10 R f (, that)1 211 1 4829 3182 t ( The)1 218(provide an interface to the local bitmap display \(if any\) and pointing device.)12 3198 2 720 3302 t 10 CW f (mouse)4174 3302 w 10 R f (file returns a)2 528 1 4512 3302 t ( of)1 113(fixed\255format record containing 1 byte of button state and 4 bytes each)11 2830 2 720 3422 t 10 I f (x)3693 3422 w 10 R f (and)3767 3422 w 10 I f (y)3941 3422 w 10 R f ( If)1 121(position of the mouse.)3 904 2 4015 3422 t ( The)1 208( a subsequent read will block.)5 1202(the mouse has not moved since the file was last read,)10 2156 3 720 3542 t 10 CW f (screen)4314 3542 w 10 R f (file con\255)1 338 1 4702 3542 t ( display; the)2 521(tains a memory image of the contents of the)8 1873 2 720 3662 t 10 CW f (bitblt)3155 3662 w 10 R f (file provides a procedural interface.)4 1484 1 3556 3662 t (Calls to the graphics library are translated into messages that are written to the)13 3157 1 720 3782 t 10 CW f (bitblt)3904 3782 w 10 R f (file to perform bit\255)3 749 1 4291 3782 t ( is essentially a nested RPC protocol.\))6 1519( \(This)1 261(map graphics operations.)2 1001 3 720 3902 t ( process's)1 403(The various services being used by a process are gathered together into the)12 3059 2 970 4058 t 10 I f (name space,)1 500 1 4464 4058 t 10 R f (a)4996 4058 w ( a process forks, the child process shares the name space with)11 2510( When)1 293( hierarchy of file names.)4 992(single rooted)1 525 4 720 4178 t ( a file descriptor)3 684( Given)1 305( system calls manipulate name spaces.)5 1586( Several)1 359(the parent.)1 431 5 720 4298 t 10 CW f (fd)4121 4298 w 10 R f (that holds an open)3 763 1 4277 4298 t (communications channel to a service, the call)6 1816 1 720 4418 t 9 CW f (mount\(int fd, char *old, int flags\))5 1890 1 1008 4588 t 10 R f ( by)1 131(authenticates the user and attaches the file tree of the service to the directory named)14 3411 2 720 4768 t 10 CW f (old)4293 4768 w 10 R f (. The)1 236 1 4473 4768 t 10 CW f (flags)4740 4768 w 10 R f (specify how the tree is to be attached to)8 1596 1 720 4888 t 10 CW f (old)2343 4888 w 10 R f ( or appearing before or after the)6 1273(: replacing the current contents)4 1244 2 2523 4888 t ( directory with several services mounted is called a)8 2064( A)1 125( the directory.)2 563(current contents of)2 752 4 720 5008 t 10 I f (union)4252 5008 w 10 R f (directory and)1 532 1 4508 5008 t ( call)1 169( The)1 205(is searched in the specified order.)5 1335 3 720 5128 t 9 CW f (bind\(char *new, char *old, int flags\))5 1998 1 1008 5298 t 10 R f (takes the portion of the existing name space visible at)9 2211 1 720 5478 t 10 CW f (new)2964 5478 w 10 R f ( a file or a directory, and makes it also)9 1611(, either)1 285 2 3144 5478 t (visible at)1 364 1 720 5598 t 10 CW f (old)1109 5598 w 10 R f ( example,)1 388(. For)1 214 2 1289 5598 t 9 CW f (bind\("1992/0301/sys/include", "/sys/include", REPLACE\))2 2916 1 1008 5768 t 10 R f (causes the directory of include files to be overlaid with its contents from the dump on March first.)17 3911 1 720 5948 t ( created by the)3 596(A process is)2 494 2 970 6104 t 10 CW f (rfork)2089 6104 w 10 R f (system call, which takes as argument a bit vector defining which)10 2622 1 2418 6104 t ( of the attributes)3 667( One)1 221( the process are to be shared between parent and child instead of copied.)13 2946(attributes of)1 486 4 720 6224 t ( made by either process are visible in the other; when copied,)11 2610(is the name space: when shared, changes)6 1710 2 720 6344 t (changes are independent.)2 1005 1 720 6464 t ( local name spaces must)4 969(Although there is no global name space, for a process to function sensibly the)13 3101 2 970 6620 t ( these)1 230( Both)1 245( global conventions. Nonetheless, the use of local name spaces is critical to the system.)14 3476(adhere to)1 369 4 720 6740 t ( binaries for a given architec\255)5 1176( The)1 206( to handle heterogeneity.)3 990(ideas are illustrated by the use of the name space)9 1948 4 720 6860 t ( the architecture, for example)4 1175(ture are contained in a directory named by)7 1701 2 720 6980 t 10 CW f (/mips/bin)3622 6980 w 10 R f (; in use, that directory)4 878 1 4162 6980 t (is bound to the conventional location)5 1515 1 720 7100 t 10 CW f (/bin)2267 7100 w 10 R f ( not know the CPU type)5 1004( such as shell scripts need)5 1064(. Programs)1 465 3 2507 7100 t ( directory of private binaries is usually unioned with)8 2108( A)1 124(they are executing on to find binaries to run.)8 1796 3 720 7220 t 10 CW f (/bin)4775 7220 w 10 R f (.)5015 7220 w cleartomark showpage saveobj restore %%EndPage: 3 3 %%Page: 4 4 /saveobj save def mark 4 pagesetup 10 R f (\255 4 \255)2 166 1 2797 480 t (\(Compare this to the)3 825 1 720 840 t 10 I f (ad hoc)1 271 1 1572 840 t 10 R f (and special\255purpose idea of the)4 1253 1 1871 840 t 10 CW f (PATH)3152 840 w 10 R f (variable, which is not used in the Plan 9)8 1620 1 3420 840 t ( also helpful for debugging, for example by binding an old library to the standard)14 3271( bindings are)2 522(shell.\) Local)1 527 3 720 960 t (place and linking a program to see if recent changes to the library are responsible for a bug in the program.)20 4265 1 720 1080 t (The window system,)2 854 1 970 1236 t 10 CW f (8\275)1861 1236 w 10 R f ( files such as)3 552([Pike91], is a server for)4 987 2 2018 1236 t 10 CW f (/dev/cons)3595 1236 w 10 R f (and)4173 1236 w 10 CW f (/dev/bitblt)4355 1236 w 10 R f (.)5015 1236 w ( of)1 133(Each client sees a distinct copy of these files in its local name space: there are many instances)17 4187 2 720 1356 t 10 CW f (/dev/cons)720 1476 w 10 R f (, each served by)3 675 1 1260 1476 t 10 CW f (8\275)1971 1476 w 10 R f ( Again,)1 331( local name space of a window.)6 1327(to the)1 236 3 2127 1476 t 10 CW f (8\275)4058 1476 w 10 R f (implements services)1 825 1 4215 1476 t ( client just connects its)4 955( Each)1 261(using local name spaces plus the use of I/O to conventionally named files.)12 3104 3 720 1596 t (standard input, output, and error files to)6 1629 1 720 1716 t 10 CW f (/dev/cons)2381 1716 w 10 R f ( graph\255)1 293(, with analogous operations to access bitmap)6 1826 2 2921 1716 t ( the implementation of)3 908( this to)2 275(ics. Compare)1 553 3 720 1836 t 10 CW f (/dev/tty)2481 1836 w 10 R f (on UNIX, which is done by special code in the ker\255)10 2054 1 2986 1836 t ( arrange\255)1 360( Special)1 348( when opened, with the standard input or output of the process.)11 2560(nel that overloads the file,)4 1052 4 720 1956 t (ment must be made by a UNIX window system for)9 2066 1 720 2076 t 10 CW f (/dev/tty)2814 2076 w 10 R f (to behave as expected;)3 909 1 3322 2076 t 10 CW f (8\275)4259 2076 w 10 R f (instead uses the)2 633 1 4407 2076 t ( critically on local name)4 1009(provision of the corresponding file as its central idea, which to succeed depends)12 3311 2 720 2196 t (spaces.)720 2316 w (The environment)1 688 1 970 2472 t 10 CW f (8\275)1686 2472 w 10 R f (provides its clients is exactly the environment under which it is implemented: a)12 3206 1 1834 2472 t (conventional set of files in)4 1076 1 720 2592 t 10 CW f (/dev)1825 2592 w 10 R f ( own)1 200( permits the window system to be run recursively in one of its)12 2518(. This)1 257 3 2065 2592 t ( also means that if the files are exported to another machine, as)12 2562( It)1 114(windows, which is handy for debugging.)5 1644 3 720 2712 t ( remote machines,)2 743(described below, the window system or client applications may be run transparently on)12 3577 2 720 2832 t ( X win\255)2 319( mechanism is used for Plan 9's implementation of the)9 2233( This)1 234(even ones without graphics hardware.)4 1534 4 720 2952 t (dow system: X is run as a client of)8 1414 1 720 3072 t 10 CW f (8\275)2163 3072 w 10 R f ( this configura\255)2 616( In)1 136(, often on a remote machine with lots of memory.)9 2005 3 2283 3072 t ( degradation in graphics perfor\255)4 1311(tion, using Ethernet to connect MIPS machines, we measure only a 10%)11 3009 2 720 3192 t (mance relative to running X on a bare Plan 9 machine.)10 2176 1 720 3312 t ( application of these ideas is a statistics\255gathering file system implemented by a command)13 3612(An unusual)1 458 2 970 3468 t (called)720 3588 w 10 CW f (iostats)998 3588 w 10 R f ( command encapsulates a process in a local name space, monitoring 9P requests)12 3377(. The)1 245 2 1418 3588 t (from the process to the outside world)6 1535 1 720 3708 t 10 S1 f (\320)2288 3708 w 10 R f (the name space in which)4 1013 1 2421 3708 t 10 CW f (iostats)3467 3708 w 10 R f ( the)1 155( When)1 296(is itself running.)2 669 3 3920 3708 t (command completes,)1 849 1 720 3828 t 10 CW f (iostats)1594 3828 w 10 R f ( example)1 363( For)1 189(reports usage and performance figures for file activity.)7 2177 3 2039 3828 t 9 CW f (iostats 8\275)1 540 1 1008 3998 t 10 R f (can be used to discover how much I/O the window system does to the bitmap device, font files, and so on.)20 4242 1 720 4178 t (The)970 4334 w 10 CW f (import)1164 4334 w 10 R f ( of name space from a remote system to the local name)11 2363(command connects a piece)3 1114 2 1563 4334 t ( dial the remote machine and start a process there that serves the remote)13 3024( implementation is to)3 887(space. Its)1 409 3 720 4454 t ( calls)1 213( then)1 201( It)1 115(name space using 9P.)3 872 4 720 4574 t 10 CW f (mount)2151 4574 w 10 R f (to attach the connection to the name space and finally dies; the)11 2559 1 2481 4574 t ( exam\255)1 280( For)1 195( use is to access devices not available locally.)8 1864( One)1 223(remote process continues to serve the files.)6 1758 5 720 4694 t (ple, to write a floppy one may say)7 1359 1 720 4814 t 9 CW f (import lab.pc /a: /n/dos)3 1296 1 1008 4984 t (cp foo /n/dos/bar)2 918 1 1008 5094 t 10 R f (The call to)2 437 1 720 5274 t 10 CW f (import)1187 5274 w 10 R f (connects the file tree from)4 1067 1 1577 5274 t 10 CW f (/a:)2674 5274 w 10 R f ( machine)1 369(on the)1 252 2 2884 5274 t 10 CW f (lab.pc)3536 5274 w 10 R f (\(which must support 9P\) to)4 1113 1 3927 5274 t (the local directory)2 726 1 720 5394 t 10 CW f (/n/dos)1471 5394 w 10 R f ( the file)2 305(. Then)1 280 2 1831 5394 t 10 CW f (foo)2441 5394 w 10 R f (can be written to the floppy just by copying it across.)10 2123 1 2646 5394 t (Another application is remote debugging:)4 1665 1 970 5550 t 9 CW f (import helix /proc)2 972 1 1008 5720 t 10 R f ( system on machine)3 860(makes the process file)3 950 2 720 5900 t 10 CW f (helix)2578 5900 w 10 R f (available locally; commands such as)4 1551 1 2926 5900 t 10 CW f (ps)4525 5900 w 10 R f (then see)1 347 1 4693 5900 t 10 CW f (helix)720 6020 w 10 R f ( debugger may then look at a remote process:)8 1813( The)1 205('s processes instead of the local ones.)6 1494 3 1020 6020 t 9 CW f (db /proc/27/text /proc/27/mem)2 1566 1 1008 6190 t 10 R f ( Since)1 276(allows breakpoint debugging of the remote process.)6 2090 2 720 6370 t 10 CW f (db)3115 6370 w 10 R f (infers the CPU type of the process from the)8 1776 1 3264 6370 t ( is taken within)3 623( Care)1 241(executable header on the text file, it supports cross\255architecture debugging, too.)10 3204 3 720 6490 t 10 CW f (db)4815 6490 w 10 R f (to)4962 6490 w ( byte order and floating point; it is possible to breakpoint debug a big\255endian MIPS process)15 3680(handle issues of)2 640 2 720 6610 t (from a little\255endian i386.)3 999 1 720 6730 t ( example,)1 401(Network interfaces are also implemented as file systems. [Presotto] For)9 2964 2 970 6886 t 10 CW f (/net/tcp)4373 6886 w 10 R f (is a)1 149 1 4891 6886 t (directory somewhat like)2 997 1 720 7006 t 10 CW f (/proc)1758 7006 w 10 R f ( set of numbered directories, one per connection, each of)9 2398(: it contains a)3 584 2 2058 7006 t ( process allocates a new connection)5 1446( A)1 127(which contains files to control and communicate on the connection.)9 2747 3 720 7126 t (by accessing)1 517 1 720 7246 t 10 CW f (/net/tcp/clone)1272 7246 w 10 R f ( make a)2 328( To)1 170( evaluates to the directory of an unused connection.)8 2126(, which)1 304 4 2112 7246 t cleartomark showpage saveobj restore %%EndPage: 4 4 %%Page: 5 5 /saveobj save def mark 5 pagesetup 10 R f (\255 5 \255)2 166 1 2797 480 t (call, the process writes a textual message such as)8 1970 1 720 840 t 10 CW f ('connect 135.104.53.2!512')1 1527 1 2717 840 t 10 R f (to the)1 228 1 4271 840 t 10 CW f (ctl)4527 840 w 10 R f (file and)1 305 1 4735 840 t (then reads and writes the)4 1036 1 720 960 t 10 CW f (data)1792 960 w 10 R f (file. An)1 341 1 2068 960 t 10 CW f (rlogin)2444 960 w 10 R f (service can be implemented in a few of lines of shell)10 2201 1 2839 960 t (code.)720 1080 w ( machines with Datakit interfaces)4 1340( have)1 213( We)1 188(This structure makes network gatewaying easy to provide.)7 2329 4 970 1236 t ( such a machine one may type)6 1203( On)1 172(but no DOD Internet interface.)4 1227 3 720 1356 t 9 CW f (import helix /net)2 918 1 1008 1526 t (telnet tcp!ai.mit.edu)1 1134 1 1008 1636 t 10 R f (The)720 1816 w 10 CW f (import)906 1816 w 10 R f ( interface from)2 606(uses Datakit to pull in the TCP)6 1270 2 1297 1816 t 10 CW f (helix)3205 1816 w 10 R f (, which can then be used directly; the)7 1535 1 3505 1816 t 10 CW f (tcp!)720 1936 w 10 R f ( multiple networks and protocols on Plan 9)7 1733(notation is necessary because we routinely use)6 1875 2 988 1936 t 10 S1 f (\320)4596 1936 w 10 R f (it identi\255)1 344 1 4696 1936 t (fies the network in which)4 1015 1 720 2056 t 10 CW f (ai.mit.edu)1760 2056 w 10 R f (is a valid name.)3 627 1 2385 2056 t (In practice we do not use)5 1010 1 970 2212 t 10 CW f (rlogin)2007 2212 w 10 R f (or)2394 2212 w 10 CW f (telnet)2505 2212 w 10 R f ( a command called)3 760( Instead)1 341(between Plan 9 machines.)3 1046 3 2893 2212 t 10 CW f (cpu)720 2332 w 10 R f (in effect replaces the CPU in a window with that on another machine, typically a fast multiprocessor)16 4109 1 931 2332 t ( implementation is to recreate the name space on the remote machine, using the equivalent)14 3627( The)1 205(CPU server.)1 488 3 720 2452 t (of)720 2572 w 10 CW f (import)831 2572 w 10 R f ( space to that of the process \(shell\) on the CPU server,)11 2190(to connect pieces of the terminal's name)6 1631 2 1219 2572 t ( devices such as fast file system connections are)8 1966( CPU\255local)1 478( for the CPU.)3 551(making the terminal a file server)5 1325 4 720 2692 t ( result is unlike UNIX)4 908( The)1 210( devices are imported.)3 896(still local; only terminal\255resident)3 1326 4 720 2812 t 10 CW f (rlogin)4090 2812 w 10 R f (, which moves)2 590 1 4450 2812 t (into a distinct name space on the remote machine, or file sharing with)12 2782 1 720 2932 t 10 CW f (NFS)3527 2932 w 10 R f (, which keeps the name space the)6 1333 1 3707 2932 t ( in)1 109( Bindings)1 418(same but forces processes to execute locally.)6 1823 3 720 3052 t 10 CW f (/bin)3101 3052 w 10 R f (may change because of a change in CPU)7 1668 1 3372 3052 t ( because of differing hardware, but the effect feels)8 2038(architecture, and the networks involved may be different)7 2282 2 720 3172 t (like simply speeding up the processor in the current name space.)10 2576 1 720 3292 t 10 B f (Position)720 3532 w 10 R f ( how the ideas of representing resources as file systems and per\255process)11 3027(These examples illustrate)2 1043 2 970 3688 t ( there are)2 388( Nonetheless)1 547( often left to more exotic mechanisms.)6 1588(name spaces can be used to solve problems)7 1797 4 720 3808 t ( could)1 258( We)1 199( example is process creation.)4 1194( An)1 183( are not mapped into file I/O.)6 1228(some operations in Plan 9 that)5 1258 6 720 3928 t (imagine a message to a control file in)7 1502 1 720 4048 t 10 CW f (/proc)2248 4048 w 10 R f ( constructing the envi\255)3 896(that creates a process, but the details of)7 1570 2 2574 4048 t (ronment of the new process)4 1143 1 720 4168 t 10 S1 f (\320)1898 4168 w 10 R f (its open files, name space, memory image, etc.)7 1943 1 2033 4168 t 10 S1 f (\320)4012 4168 w 10 R f (are too intricate to be)4 892 1 4148 4168 t ( new processes on Plan 9 are created by fairly conven\255)10 2181( Therefore)1 443( in a simple I/O operation.)5 1054(described easily)1 642 4 720 4288 t (tional)720 4408 w 10 CW f (rfork)973 4408 w 10 R f (and)1298 4408 w 10 CW f (exec)1467 4408 w 10 R f (system calls;)1 514 1 1732 4408 t 10 CW f (/proc)2271 4408 w 10 R f (is used only to represent and control existing processes.)8 2222 1 2596 4408 t ( file system name space, for several rea\255)7 1614(Plan 9 does not attempt to map network name spaces into the)11 2456 2 970 4564 t ( different addressing rules for various networks and protocols cannot be mapped uniformly into a)14 3910(sons. The)1 410 2 720 4684 t ( the various mechanisms to authenticate, select a ser\255)8 2187( if they could be,)4 706( Even)1 263(hierarchical file name space.)3 1164 4 720 4804 t (vice, and control the connection would not map consistently into operations on a file.)13 3405 1 720 4924 t ( takes)1 242( 9)1 86( Plan)1 239(Shared memory is another resource not adequately represented by a file name space.)12 3503 4 970 5080 t ( is con\255)2 298( Memory)1 396( memory.)1 385(care to provide mechanisms to allow groups of local processes to share and map)13 3241 4 720 5200 t ( would)1 287(trolled by system calls rather than special files, however, since a representation in the file system)15 4033 2 720 5320 t (imply that memory can be imported from remote machines.)8 2383 1 720 5440 t ( an effective model around which to)6 1531(Despite these limitations, file systems and name spaces offer)8 2539 2 970 5596 t ( provide a uniform, familiar, transparent interface to a)8 2294( well, they can)3 639( Used)1 274(build a distributed system.)3 1113 4 720 5716 t ( carry well\255understood properties of access, protection, and nam\255)8 2633( They)1 260(diverse set of distributed resources.)4 1427 3 720 5836 t ( 9 pushes)2 380( Plan)1 232( the best idea in UNIX.)5 946( integration of devices into the hierarchical file system was)9 2399(ing. The)1 363 5 720 5956 t ( used inventively, have plenty of scope for pro\255)8 1896(the concepts much further and shows that file systems, when)9 2424 2 720 6076 t (ductive research.)1 675 1 720 6196 t 10 B f (References)720 6436 w 10 R f ([Killian] T. Killian, ``Processes as Files'', USENIX Summer Conf. Proc., Salt Lake City, 1984)13 3797 1 720 6592 t ([Needham] R. Needham, ``Names'', in)4 1559 1 720 6712 t 10 I f (Distributed systems,)1 811 1 2304 6712 t 10 R f (S. Mullender, ed., Addison Wesley, 1989)5 1654 1 3140 6712 t ( ``Plan 9 from Bell Labs'', UKUUG Proc. of the)9 2001([Pike90] R. Pike, D. Presotto, K. Thompson, H. Trickey,)8 2319 2 720 6832 t (Summer 1990 Conf., London, England, 1990)5 1808 1 720 6952 t ( for Plan 9'', UKUUG Proc. of the Summer 1990 Conf.,)10 2347([Presotto] D. Presotto, ``Multiprocessor Streams)4 1973 2 720 7072 t (London, England, 1990)2 944 1 720 7192 t ([Pike91] Pike, R., ``8.5, The Plan 9 Window System'', USENIX Summer Conf. Proc., Nashville, 1991)14 4114 1 720 7312 t cleartomark showpage saveobj restore %%EndPage: 5 5 %%Trailer done %%Pages: 5 %%DocumentFonts: Times-Roman Times-Bold Times-Italic Times-Roman Courier