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