aboutsummaryrefslogtreecommitdiff
path: root/ja_JP.eucJP/books/design-44bsd/book.xml
blob: 5dd4cb51916599a5423e5978e237f986e8e47757 (plain) (blame)
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
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
<?xml version="1.0" encoding="euc-jp" standalone="no"?>
<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook XML V4.5-Based Extension//EN"
	"../../../share/xml/freebsd45.dtd">

<!--
     The FreeBSD Documentation Project
     The FreeBSD Japanese Documentation Project

     Original revision: 1.8
     $FreeBSD$
-->

<book lang='ja'>
  <bookinfo>
    <title>4.4BSD オペレーティングシステムの設計と実装</title>

    <authorgroup>
      <author>
	<firstname>Marshall</firstname>
	<othername>Kirk</othername>
	<surname>McKusick</surname>
      </author>

      <author>
	<firstname>Keith</firstname>
	<surname>Bostic</surname>
      </author>

      <author>
	<firstname>Michael</firstname>
	<othername>J.</othername>
	<surname>Karels</surname>
      </author>

      <author>
	<firstname>John</firstname>
	<othername>S.</othername>
	<surname>Quarterman</surname>
      </author>
    </authorgroup>

    <copyright>
      <year>1996</year>
      <holder>Addison-Wesley Longman, Inc</holder>
    </copyright>

    <releaseinfo>$FreeBSD$</releaseinfo>

<!-- I seem to recall the editor wanting this notice to be bold.  In html, I'd
     use the _strong_ tag.  What should I use instead? -->

  <legalnotice id="legalnotice">
      <para>この文書は出版元の許可の下に
        <citetitle>The Design and
	  Implementation of the 4.4BSD Operating System</citetitle>
        の第二章を抜粋したものです。
        この抜粋の複製や再配布を出版元の明示的な<ulink url="mailto:peter.gordon@awl.com">許可</ulink
          >なく行なうことは禁止されています。
        この章で紹介されている各概念については
        <ulink url="http://cseng.aw.com/book/0,3828,0201549794,00.html"></ulink
          >の残りの部分に非常に詳細に書かれており、
        BSD UNIX に興味を持つ読者にとって優れた参考文献の一つとなっています。
        この本に関する詳細は出版元から提供されています。
        そこで登録することで
        <ulink url="mailto:curt.johnson@awl.com">関連書籍</ulink>
        のニュースを受け取ることも可能です。
        また、Kirk McKusick 氏より
        <ulink url="http://www.mckusick.com/courses/">BSD
	  courses</ulink> に関する情報も提供されています。</para>

      <para>この文書の日本語化は FreeBSD
        日本語ドキュメンテーションプロジェクトによって行なわれました。
        日本語化の詳細は<xref linkend="jacknowledgement"/>を参照してください。</para>

      <para>The second chapter of the book,  <citetitle>The Design and
          Implementation of the 4.4BSD Operating System</citetitle> is
        excerpted here with the permission of the publisher.  No part of it
        may be further reproduced or distributed without the publisher's
        express written
        <ulink url="mailto:peter.gordon@awl.com">permission</ulink>.  The
        rest of
        <ulink url="http://cseng.aw.com/book/0,3828,0201549794,00.html">the
          book</ulink> explores the concepts introduced in this chapter in
        incredible detail and is an excellent reference for anyone with an
        interest in BSD UNIX.  More information about this book is available
        from the publisher, with whom you can also sign up to receive news
        of <ulink url="mailto:curt.johnson@awl.com">related titles</ulink>.
        Information about <ulink url="http://www.mckusick.com/courses/">BSD
          courses</ulink> is available from Kirk McKusick.</para>
    </legalnotice>
  </bookinfo>

  <chapter id="overview" label="2">
    <title>4.4BSD の設計の概要</title>

    <sect1 id="overview-facilities">
      <title>4.4BSD の機能とカーネル</title>

      <para>4.4BSD カーネルは 4 つの基本機能を提供します。
	それはプロセス、ファイルシステム、コミュニケーション、そしてシステムの起動です。
	この節ではその 4 つの基本サービスのそれぞれについて
	この本で書かれていることを紹介します。</para>

      <orderedlist>
        <listitem>
	  <para>プロセスはアドレス空間上でのコントロールの流れを構成します。
	    生成や終了やその他のプロセスをコントロールするための仕組みは
	    4 章に述べます。システムは各プロセスの個別の仮想アドレス空間を
	    多重化します。このメモリ管理については 5 章で議論します。</para>
        </listitem>

        <listitem>
	  <para>ファイルシステムとデバイスへのユーザインタフェースは似ているため、
	    6 章ではそれらに共通する特徴について議論します。
	    7 章で説明するファイルシステムは、
            ディレクトリが木構造になった階層で組織された名前付きのファイルと、
            それらを扱うための操作からなります。
	    ファイルはディスクのような物理的なメディア上に存在します。
	    4.4BSD はディスク上のデータ配置法をいくつかサポートしており、
	    それは 8 章の中で述べます。
	    遠隔マシン上のファイルへのアクセスについては 9 章、
	    システムにアクセスするために使われている端末とその動作については
            10 章で扱います。</para>
	</listitem>

	<listitem>
	  <para>UNIX で古くから提供されている通信機構には、
	    関連するプロセス間における単純で信頼性の高いバイトストリーム
            (11.1 節パイプを参照)および、
            例外イベントの通知 (4.7 節シグナルを参照)があります。
	    また、4.4BSD は汎用のプロセス間通信機構も備えています。
	    11 章に述べるこの通信機構は、
            ファイルシステムのものとは異なるアクセス機構を使用していますが、
            一度接続が確立されれば、
            プロセスからはパイプと同じようにアクセスすることができます。
	    12 章では汎用のネットワーク通信フレームワークについて扱っています。
	    これは通常、IPC 機構の下位レイヤとして使われているものです。
	    13 章では、ある特定のネットワークの実装について詳細に述べます。</para>
	</listitem>

	<listitem>
	  <para>いかなる実際のオペレーティングシステムにも、
	    どのように起動するかというような運用上の話題があります。
	    14 章では起動時や運用上の話題について述べます。</para>
	</listitem>
      </orderedlist>

      <para>2.3 節から 2.14 節は 3 章から 14 章の内容を紹介するものです。
	わたしたちは用語を定義し、基本的なシステムコールについて扱い、
	開発の歴史について解説していきます。
	そして最後に、中心となっている数多くの設計が、
        どうやって選ばれたのかという理由を示します。</para>

      <sect2>
	<title>カーネル</title>

	<para><emphasis>カーネル</emphasis> はプロテクトモードで動作し、
	  すべてのユーザプログラムが基本的なハードウェア
	  (たとえば CPU、ディスク、端末、ネットワーク接続機器) および
	  ソフトウェアを構成するもの (たとえばファイルシステム、
	  ネットワークプロトコル) へのアクセスを解決します。
	  カーネルは基礎的なシステムの機能を提供します。
	  それはプロセスを生成して管理を行い、ファイルシステムへのアクセス機能や
	  コミュニケーション機能を提供します。
	  <emphasis>システムコール</emphasis> と呼ばれるこれらの機能は
	  ライブラリのサブルーチンとしてユーザプロセスに現れます。
	  これらのシステムコールはプロセスがこれらの機能に対して持っている
	  唯一のインタフェースです。
	  システムコール機構の詳細は、
          システムコールを実行することで実現されているもの以外の、
          いくつかのカーネル内機構を説明した 3 章で扱います。</para>

	<para>従来のオペレーティングシステムの用語における
	  <emphasis>カーネル</emphasis> とは、
	  オペレーティングシステムにサービスを追加する実装を行うために必要な
	  最小限の仕組みだけを提供する、
          ソフトウェアの小さな核となる部分のことです。
	  同時代のオペレーティングシステムの研究、たとえば
	  Chorus
	  <xref linkend="biblio-rozier"/>,
	  Mach
	  <xref linkend="biblio-accetta"/>,
	  Tunis
	  <xref linkend="biblio-ewens"/>,
	  V Kernel
	  <xref linkend="biblio-cheriton"/> では、
	  このカーネルという機能による区分が、さらに論理的に複数に分けられています。
	  ファイルシステムやネットワークプロトコルといったサービスは、
	  その核もしくはカーネルに対するクライアントアプリケーションプロセスとして
	  実装されています。</para>

	<para>4.4BSD カーネルは複数のプロセスには分割されていません。
	  この基本設計の決定は UNIX の最初のバージョンで行われました。
	  Ken Thompson によって行われた初めの 2 つの実装では
	  メモリマッピングがなく、
	  ユーザおよびカーネル空間はハードウェアによる分離が行なわれていませんでした
	  <xref linkend="biblio-ritchie"/>。
	  メッセージ伝達システムは、
          実際に実装されたカーネルとユーザプロセスのモデルと
          同じくらい容易に実装することが可能でした。
	  単純化と性能のためにモノリシックカーネルが選ばれました。
	  また、初期のカーネルは非常に小さいものでしたが、
	  ネットワークのような機能が追加されることで
	  次第に大きくなっていきました。
	  現在のオペレーティングシステムの研究の最先端では
	  そのようなサービスをユーザ空間に置くことで
	  カーネルの大きさを減らそうとする傾向にあります。</para>

	<para>ユーザは通常、
          <emphasis>シェル</emphasis>と呼ばれる
	  コマンド言語インタプリタや、
	  追加されたユーザアプリケーションプログラムを通してシステムと対話します。
	  そのようなプログラムやシェルは、プロセスを使って実装されています。
	  それらのプログラムの詳細についてはこの本の範囲を超えますので、
	  ここではカーネルについてのみ、考えることにします。</para>

	<para>2.3 節、2.4 節では
	  4.4BSD カーネルによって提供されるサービスや最近の設計の概要について扱います。
	  そして後の章では、
          4.4BSD に現れるそれらのサービスの設計と実装の詳細を説明します。</para>
      </sect2>
    </sect1>

    <sect1 id="overview-kernel-organization">
      <title>カーネルの構成</title>

      <para>この節では、2 つの側面から 4.4BSD
        カーネルの構成を見ていきます。</para>

      <orderedlist>
	<listitem>
	  <para>ソフトウェアの静的側面、つまりカーネルを構築するためのモジュール
	    によって提供された機能性による分類</para>
	</listitem>

	<listitem>
	  <para>その動的な機能、つまりユーザに提供されるサービスによる分類</para>
	</listitem>
      </orderedlist>

      <para>カーネルの大部分は、システムコールを通してアプリケーションが
        アクセスするためのシステムサービスを実装しています。
	4.4BSD では、このソフトウェアは次のような構成になっています。</para>

      <itemizedlist>
	<listitem>
	  <para>基礎的なカーネル機能:
	    タイマーおよびシステム時計の取り扱い、
	    記述子管理、そしてプロセス管理</para>
	</listitem>

	<listitem>
	  <para>メモリ管理のサポート:
	    ページングとスワッピング</para>
	</listitem>

	<listitem>
	  <para>汎用のシステムインタフェース:
	    I/O、コントロール、
            記述子によって実現される多重化操作</para>
	</listitem>

	<listitem>
	  <para>ファイルシステム:
	    ファイル、ディレクトリ、パス名の解釈、ファイルロック、
	    I/O バッファ管理</para>
	</listitem>

	<listitem>
	  <para>端末の取り扱いのサポート:
	    端末のインタフェースドライバと
            ラインディシプリン</para>
	</listitem>

	<listitem>
	  <para>プロセス間通信機能:
            ソケット</para>
	</listitem>

	<listitem>
	  <para>ネットワーク通信への対応:
	    経路制御等の通信プロトコル、一般的なネットワーク機能</para>
	</listitem>
      </itemizedlist>

      <table frame="none" id="table-mach-indep">
	<title>4.4BSD カーネルにおける機種非依存なソフトウェア</title>
	<tgroup cols="3">
	  <thead>
	    <row>
	      <entry>分類</entry>
	      <entry>コード行数</entry>
	      <entry>カーネル内での割合</entry>
	    </row>
	  </thead>

	  <tfoot>
	    <row>
	      <entry>機種非依存部分の総計</entry>
	      <entry>162,617</entry>
	      <entry>80.4</entry>
	    </row>
	  </tfoot>

	  <tbody>
	    <row>
	      <entry>ヘッダ</entry>
	      <entry>9,393</entry>
	      <entry>4.6</entry>
	    </row>

	    <row>
	      <entry>初期化部分</entry>
	      <entry>1,107</entry>
	      <entry>0.6</entry>
	    </row>

	    <row>
	      <entry>カーネルの機能</entry>
	      <entry>8,793</entry>
	      <entry>4.4</entry>
	    </row>

	    <row>
	      <entry>汎用のインタフェース</entry>
	      <entry>4,782</entry>
	      <entry>2.4</entry>
	    </row>

	    <row>
	      <entry>プロセス間通信</entry>
	      <entry>4,540</entry>
	      <entry>2.2</entry>
	    </row>

	    <row>
	      <entry>端末の取り扱い</entry>
	      <entry>3,911</entry>
	      <entry>1.9</entry>
	    </row>

	    <row>
	      <entry>仮想メモリ</entry>
	      <entry>11,813</entry>
	      <entry>5.8</entry>
	    </row>

	    <row>
	      <entry>vnode 管理</entry>
	      <entry>7,954</entry>
	      <entry>3.9</entry>
	    </row>

	    <row>
	      <entry>ファイルシステムネーミング</entry>
	      <entry>6,550</entry>
	      <entry>3.2</entry>
	    </row>

	    <row>
	      <entry>FFS</entry>
	      <entry>4,365</entry>
	      <entry>2.2</entry>
	    </row>

	    <row>
	      <entry>ログ構造化ファイルシステム</entry>
	      <entry>4,337</entry>
	      <entry>2.1</entry>
	    </row>

	    <row>
	      <entry>メモリベースのファイルシステム</entry>
	      <entry>645</entry>
	      <entry>0.3</entry>
	    </row>

	    <row>
	      <entry>cd9660 ファイルシステム</entry>
	      <entry>4,177</entry>
	      <entry>2.1</entry>
	    </row>

	    <row>
	      <entry>その他のファイルシステム (10)</entry>
	      <entry>12,695</entry>
	      <entry>6.3</entry>
	    </row>

	    <row>
	      <entry>ネットワークファイルシステム</entry>
	      <entry>17,199</entry>
	      <entry>8.5</entry>
	    </row>

	    <row>
	      <entry>ネットワーク通信</entry>
	      <entry>8,630</entry>
	      <entry>4.3</entry>
	    </row>

	    <row>
              <entry>インターネットプロトコル</entry>
	      <entry>11,984</entry>
	      <entry>5.9</entry>
	    </row>

	    <row>
	      <entry>ISO プロトコル</entry>
	      <entry>23,924</entry>
	      <entry>11.8</entry>
	    </row>

	    <row>
	      <entry>X.25 プロトコル</entry>
	      <entry>10,626</entry>
	      <entry>5.3</entry>
	    </row>

	    <row>
	      <entry>XNS プロトコル</entry>
	      <entry>5,192</entry>
	      <entry>2.6</entry>
	    </row>
	  </tbody>
	</tgroup>
      </table>

      <para>これらのカテゴリのソフトウェアのほとんどは機種非依存であり、しかも
	異なるハードウェアアーキテクチャに移植できるものです。</para>

      <para>カーネルの機種依存部分は本流のコードから分離されています。
	特に、機種依存しているコードのどれを取っても、
	特定のアーキテクチャのためのコードを含んでいません。
	機種に依存する機能が必要なときには、機種に依存しないコードは
	機種依存のコード内にあるアーキテクチャ依存の関数を呼び出します。
	機種依存であるソフトウェアは次のものを含んでいます。</para>

      <itemizedlist>
	<listitem>
	  <para>低レベルなシステム起動のための動作</para>
	</listitem>

	<listitem>
	  <para>トラップおよびフォールトの扱い</para>
	</listitem>

	<listitem>
	  <para>プロセスの動作状態に関する低レベルな操作</para>
	</listitem>

	<listitem>
	  <para>ハードウェアデバイスの設定と初期化</para>
	</listitem>

	<listitem>
	  <para>I/O デバイスのランタイムサポート</para>
	</listitem>
      </itemizedlist>

      <table frame="none" id="table-mach-dep">
	<title>4.4BSD カーネル内にある HP300 用の機種依存部分</title>

	<tgroup cols="3">
	  <thead>
	    <row>
	      <entry>分類</entry>
	      <entry>コード行数</entry>
	      <entry>カーネル内での割合</entry>
	    </row>
	  </thead>

	  <tfoot>
	    <row>
	      <entry>機種依存部分の総計</entry>
	      <entry>39,634</entry>
	      <entry>19.6</entry>
	    </row>
	  </tfoot>

	  <tbody>
	    <row>
	      <entry>機種依存部分のヘッダ</entry>
	      <entry>1,562</entry>
	      <entry>0.8</entry>
	    </row>

	    <row>
	      <entry>デバイスドライバのヘッダ</entry>
	      <entry>3,495</entry>
	      <entry>1.7</entry>
	    </row>

	    <row>
	      <entry>デバイスドライバのソースコード</entry>
	      <entry>17,506</entry>
	      <entry>8.7</entry>
	    </row>

	    <row>
	      <entry>仮想メモリ</entry>
	      <entry>3,087</entry>
	      <entry>1.5</entry>
	    </row>

	    <row>
	      <entry>他の機種依存部分</entry>
	      <entry>6,287</entry>
	      <entry>3.1</entry>
	    </row>

	    <row>
	      <entry>アセンブリ言語で書かれたルーチン</entry>
	      <entry>3,014</entry>
	      <entry>1.5</entry>
	    </row>

	    <row>
	      <entry>HP/UX 互換機能</entry>
	      <entry>4,683</entry>
	      <entry>2.3</entry>
	    </row>
	  </tbody>
	</tgroup>
      </table>

      <para><xref linkend="table-mach-indep"/> は
        HP300 用 4.4BSD カーネルを構成するソフトウェアのうち、
        機種非依存の部分をまとめたものです。
        2 列目の数値は C 言語のソースコード、ヘッダファイル、そして
	アセンブリ言語のものを表しており、
        アセンブリ言語のものは 2% 以下しかありません。
	また、<xref linkend="table-mach-dep"/> の統計が示しているように、
	機種依存のソフトウェアは、HP/UX やデバイスサポートを除いて、
	カーネルのうちわずかに 6.9% しかありません。</para>

      <para>カーネルのごく小さな部分だけがシステムの初期化に専念します。
	このコードはシステムが <emphasis>起動する</emphasis> ときに用いられ、
	カーネルがハードウェアやソフトウェアの環境構築をするための基本部分と
	なります (14 章参照)。
	(制限された物理メモリを持つものには特に) オペレーティングシステムの中には
	これらの機能が実行された後にそのソフトウェアを廃棄してしまうか、
	<emphasis>上から覆ってしまう</emphasis> ものもあります。
	4.4BSD カーネルは、起動するために要したコードのためのメモリを再利用しません。
	それは通常の機種ではカーネルのリソースのうち 0.5% に過ぎないからです。
	そして、起動のためのコードはカーネルの中の一部分に固まってはいません。
	それは全体にわたって散在しており、初期化されたときに論理的に関連していた
	場所に存在します。</para>
    </sect1>

    <sect1 id="overview-kernel-service">
      <title>カーネル サービス</title>

      <para>カーネルレベルコードとユーザレベルコードの間の境界は、
        基盤となるハードウェアで提供されるハードウェアレベルの保護機能によって
        分離されています。
        カーネルは、ユーザプロセスにとってアクセスしにくい切り離された
        アドレス空間で作動します。特権のある操作 -- たとえば
        I/O の開始や中央処理装置 (CPU) の停止 --
        は、カーネルだけが利用可能です。
        アプリケーションは<emphasis>システムコール</emphasis>を用いてカーネルに
        サービスを要求します。システムコールは二次記憶装置にデータを
        書き込むような複雑な作業や、現在の日時を返すような単純な作業を
        カーネルに実行させるために使用されます。
        アプリケーションからは、
        すべてのシステムコールが<emphasis>同期的に実行</emphasis>するように見えます。
        つまりアプリケーションは、カーネルがシステムコールに関連した
        動作をしているときには停止しています。
        カーネルはシステムコール操作の一部を、
        システムコールが戻った後に完了することもあります。
        たとえば <emphasis>write</emphasis> システムコールは、
        プロセスが待っている間に書き込むデータをユーザプロセスからカーネルバッファにコピーしますが、
        通常、そのカーネルバッファがディスクに書き込まれる前にシステムコールから戻ります。</para>

      <para>
        通常、システムコールは CPU
        の実行モードおよび現在のアドレス空間マッピングを変更する
        ハードウェアトラップとして実装されています。
        ユーザによって与えられたシステムコール中のパラメータは、
        使用される前にカーネルによって検証されます。
        そのようなチェックはシステムの完全性を保証します。
        カーネルへ渡されたパラメータはすべてカーネルのアドレス空間にコピーされます。
        これは、システムコールの副作用により検証されたパラメータが
        変更されないことを保証するためです。
        システムコールの戻り値は、カーネルによってハードウェアレジスタ中に返されるか、
        あるいはユーザが指定したメモリアドレスにコピーされる値で返されます。
        カーネルへ渡されたパラメータのように
        結果を戻すためにアプリケーションによって指定されたアドレスは、
        それらが確実にアプリケーションのアドレス空間の一部である、
        ということが検証されなければなりません。
        システムコールを処理する間にカーネルがエラーに遭遇した場合、カーネルは
        ユーザにエラーコードを返します。
        C プログラミング言語においては、このエラーコードが大域変数
        <emphasis>errno</emphasis>に格納されます。また、システムコールを
        実行した関数は -1 の値を返します。</para>

      <para>ユーザアプリケーションとカーネルは、互いに独立して動作します。
        4.4BSD は I/O コントロールブロックや、
        オペレーティングシステムに関連するその他のデータ構造体を
        アプリケーションのアドレス空間に格納しません。
        ユーザレベルのアプリケーションはそれぞれ、
        実行のための独立したアドレス空間を提供されます。
        カーネルは、たとえば別のプロセスが走っている間そのプロセスを停止させ、
        関係するプロセスに見えないようにするというような、
        状態変更のほとんどを実現しています。</para>
    </sect1>

    <sect1 id="overview-process-management">
      <title>プロセス管理</title>

      <para>4.4BSD はマルチタスク環境をサポートしています。
	実行されたそれぞれのタスクまたはスレッドは
	<emphasis>プロセス</emphasis>と呼ばれています。
	4.4BSD のプロセスの<emphasis>コンテキスト</emphasis>は、
	アドレス空間の内容とランタイム環境を含むユーザレベルの状態と、
	スケジューリングのパラメータやリソース制御、識別情報を含む
	カーネルレベルの状態から構成されています。
	コンテキストにはカーネルがプロセスにサービスを
	提供する際に使用するすべてが含まれています。
	ユーザはプロセスを生成し、その実行を制御し、
	プロセスの実行状態が変化したときに通知を受け取ることができます。
	すべてのプロセスには<emphasis>プロセス ID</emphasis> (PID)
	と呼ばれる一意の値が割り当てられます。
	この値はカーネルがユーザに実行状態の変化を報告するときにプロセスの身元を確認したり、
	ユーザがシステムコールを実行するために参照する際に使用されます。</para>

     <para>カーネルは他のプロセスのコンテキストを複製してプロセスを生成します。
	新しく生成されたプロセスを
	元の<emphasis>親プロセス</emphasis><emphasis>子プロセス</emphasis>と呼びます。
	プロセス生成時に複製されたコンテキストは、ユーザレベルのプロセスの実行状態と
	カーネルが管理しているプロセスのシステム状態の両方を含んでいます。
	カーネルの状態に関する重要な構成要素については、4 章で解説しています。</para>

      <figure id="fig-process-lifecycle">
	<title>プロセスのライフサイクル</title>

	<mediaobject>
	  <imageobject>
	    <imagedata fileref="fig1" format="EPS"/>
	  </imageobject>

	  <textobject>
	    <literallayout class="monospaced">+--------------+             wait               +--------------+
|  親プロセス  |------------------------------->|  親プロセス  |--->
+--------------+                                +--------------+
        |                                               ^
        | fork                                          |
        V                                               |
+--------------+ execve +--------------+  wait  +----------------+
|  子プロセス  |------->|  子プロセス  |------->| ゾンビプロセス |
+--------------+        +--------------+        +----------------+</literallayout>
	  </textobject>

	  <textobject>
	    <phrase>プロセス管理システムコール</phrase>
	  </textobject>
	</mediaobject>
      </figure>

      <para><xref linkend="fig-process-lifecycle"/>ではプロセスのライフサイクルを示しています。
	プロセスは <emphasis>fork</emphasis> システムコールを用いて、
	元のプロセスのコピーとして新しいプロセスを生成することができます。
	<emphasis>fork</emphasis> は呼び出されると
	二度戻ります。一方は親プロセスに子プロセスのプロセス ID を返し、
	もう一方は子プロセスに 0 を返します。
	プロセスの親子関係はシステム上のプロセスの組に階層構造をもたらします。
	新しく生成されたプロセスはファイル記述子やシグナルハンドラの状態、
	メモリレイアウトのような親が持っているリソースすべてを共有します。</para>

      <para>親のコピーとして生成された新しいプロセスであっても、
	別のプログラムをロードし実行することでより便利で特有の動作をすることもできます。
	プロセスは <emphasis>execve</emphasis> システムコールを用いることで、
	別のプログラムのメモリイメージで自分自身を上書きして、
	新しい引数の組をその新しく作成したイメージに引き渡すことができます。
	引数の一つは、システムで認識されるフォーマット
	(バイナリ実行ファイルや指定されたインタプリタプログラムの起動を促すファイル)
        をしたファイルの名前です。</para>

      <para>プロセスは <emphasis>exit</emphasis> システムコールを実行することで、
	親プロセスに 8 ビットの exit ステータスを送信して終了することができます。
	もしプロセスが 1 バイト以上の情報を親プロセスに伝えたい場合には、
	パイプやソケット、または仲介ファイルを用いて
	プロセス間通信チャネルをセットアップする必要があります。
	プロセス間通信については 11 章で大きく取り上げています。</para>

      <para>プロセスは、<emphasis>wait</emphasis> システムコールを用いて
	子プロセスのいずれかが終了するまで実行を中断することができ、
	wait システムコールは終了した子プロセスの PID と終了ステータスを返します。
	親プロセスは、子プロセスが終了または異常終了したときのシグナルによる通知のされ方を調整できます。
	<emphasis>wait4</emphasis> システムコールを使用することで、
	親プロセスは子プロセスの終了を引き起こしたイベントについての情報と、
	子プロセスが生存期間の間に消費したリソースについての情報を取得することができます。
	もし親プロセスが先に終了したためにリソースがオーファンド (親のない状態) になってしまった場合、カーネルは
	<!-- FIXME, the emphasis is wrong -->
	<emphasis>init</emphasis>
	という特別なプロセスにその子プロセスの
	終了ステータスが渡されるよう調整します。これについては
	3.1 節および 14.6 節を参照してください。</para>

      <para>5 章では、カーネルがどのようにしてプロセスを生成し
        消滅させるかについての詳細を述べています。</para>

      <para>プロセスは<emphasis>プロセス優先度</emphasis>というパラメータに従って
	実行をスケジュールされます。
	この優先度はカーネルベースのスケジューリングアルゴリズムによって管理されています。
	スケジューリングの優先度全体に重みづけする特別なパラメータ
	(<emphasis>nice</emphasis>) によって、ユーザはプロセスの実行優先度に影響を与えることができますが、
	カーネルのスケジューリングポリシに従って、基本となる CPU リソースを共有する必要があります。</para>

      <sect2>
	<title>シグナル</title>

	<para>システムはプロセスに送ることができる
	  <emphasis>シグナル</emphasis>のセットを定義しています。
	  4.4BSD におけるシグナルはハードウェア割り込みをモデルとしています。
	  プロセスはユーザレベルのサブルーチンをシグナルが送られるべき
	  <emphasis>ハンドラ</emphasis>として指定できます。
	  シグナルが発生して、それがハンドラによって<emphasis>捕捉</emphasis>されている間は
	  さらなるシグナルの発生はブロックされます。
	  シグナルを捕捉することで、現在のプロセスのコンテキストを保存し、
	  ハンドラを実行するための新たなコンテキストを構築することになります。
	  シグナルがハンドラに伝わると、そのハンドラはプロセスをアボートさせたり、
	  (おそらく大域変数に値を設定した後で) 実行中のプロセスに戻ることもできます。
	  ハンドラから戻ると、そのシグナルはブロックされなくなり、
	  発生する (そして捕捉される) ことが再び可能になります。</para>

	<para>また、プロセスはシグナルを<emphasis>無視</emphasis>することや、
	  カーネルで定義されているデフォルトの動作を行なうように指定することができます。
	  ある種のシグナルのデフォルトでの動作はプロセスを終了させることです。
	  このような場合の終了は、事後のデバッグに使用できるようにその時のプロセスのメモリイメージを含んだ
	  <emphasis>コアファイル</emphasis>の生成を伴います。</para>

	<para>いくつかのシグナルは捕捉することも無視することもできません。
	  そのシグナルは、暴走したプロセスを停止させる
	  <emphasis>SIGKILL</emphasis> や、
	  ジョブコントロールシグナルである
	  <emphasis>SIGSTOP</emphasis> です。</para>

	<para>プロセスはシグナルを特別なスタックに伝達させることも選択できます。
	  これにより、洗練されたソフトウェアスタック操作が可能です。
	  たとえば、コルーチンをサポートしている言語では
	  それぞれのコルーチンにスタックを提供する必要があります。
	  その言語の実行システムは、4.4BSD で提供される単一のスタックを分割することで、
	  これらのスタックを割り当てることができます。
	  もしカーネルが独立したシグナルスタックをサポートしていない場合、
	  それぞれのコルーチンに割り当てられた領域を
	  シグナルの捕捉に必要な分だけ拡張しなければなりません。</para>

	<para>すべてのシグナルは、同じ<emphasis>優先度</emphasis>を持っています。
	  もし複数のシグナルが同時に未処理となっている場合は、
	  シグナルの届く順序は実装に依存します。
	  シグナルハンドラは、そのシグナルがブロックされるようにして実行しますが、
	  他のシグナルは依然発生可能です。
	  このメカニズムにより、プロセスは
	  コードのクリティカルな部分を特定のシグナルの発生に対して保護することができるのです。</para>

	<para>シグナルの設計と実装の詳細は、4.7 節で解説しています。</para>
      </sect2>

      <sect2>
	<title>プロセスグループとセッション</title>

	<para>複数のプロセスを組織して<emphasis>プロセスグループ</emphasis>が作られます。
	  プロセスグループは端末へのアクセスの制御や
	  関係プロセスの集合にシグナルを送る手段を提供するのに使用されます。
	  プロセスは親プロセスからプロセスグループを引き継ぎます。
	  プロセスが自分自身または自分の子孫のプロセスグループを変更できるようにする
	  メカニズムをカーネルは提供しています。
	  新しいプロセスグループを作成することは簡単です。
	  新しいプロセスグループの値はたいてい
	  作成したプロセスのプロセス ID となります。</para>

	<para>プロセスグループにおけるプロセスの集合は、<emphasis>ジョブ</emphasis>と呼ばれることがあり、
	  シェルのような高レベルのシステムソフトウェアで操作されます。
	  シェルによって生成されるよくある類のジョブは、いくつかのプロセスをパイプでつないだ
	  <emphasis>パイプライン</emphasis>で、最初のプロセスの出力が 2 番目の入力となり、
	  2 番目の出力が 3 番目の入力となり、4 番目も同様に… というものです。
	  シェルはパイプラインの各段階においてプロセスを fork して、
	  これらすべてのプロセスを別個のプロセスグループにおくことで
	  このようなジョブを生成します。</para>

	<para>ユーザプロセスは、単独のプロセスに送る場合と同様に
	  プロセスグループのそれぞれのプロセスにまとめてシグナルを送ることができます。
	  指定されたプロセスグループに属するプロセスが
	  そのプロセスグループに影響するソフトウェア割り込みを受け取ると、
	  それによってプロセスグループは実行を中断や再開をしたり、
	  割り込みを受けたり、終了させられたりします。</para>

	<para>端末にはプロセスグループ ID が割り当てられています。
	  この ID は、端末に関連づけられたプロセスグループの ID が通常セットされます。
	  ジョブコントロール機能を持つシェルは、同じ端末に関連づけされた
	  プロセスグループを多数作成することができます。
	  その端末は、これらのプロセスグループに属するプロセスの<emphasis>制御端末</emphasis>となります。
	  プロセスは、端末のプロセスグループ ID とそのプロセスのプロセスグループ ID が一致したときのみ、
	  制御端末を記述子から読むことができます。
	  もしプロセスグループ ID が一致していなければ、
          プロセスがその端末から読み込もうとする際にブロックされます。
	  端末のプロセスグループ ID を変更することで、
	  シェルはいくつかの異なるジョブの間で端末を調停することができます。
	  この調停は<emphasis>ジョブコントロール</emphasis>と呼ばれ、
	  プロセスグループとともに 4.8 節で解説しています。</para>

	<para>関連するプロセスの集合をプロセスグループとしてまとめることができるのと同じように、
	  プロセスグループの集合を<emphasis>セッション</emphasis>としてまとめることができます。
	  セッションのおもな用途は、デーモンプロセスとその子プロセスに対して隔離した環境を作り出したり、
	  ユーザのログインシェルとそのシェルが作り出すジョブをひとまとめにすることです。</para>
      </sect2>
    </sect1>

    <sect1 id="overview-memory-management">
      <title>メモリ管理</title>

      <para>それぞれのプロセスはプロセスごとのプライベートアドレス空間を持っています。
	アドレス空間は、最初に論理的な3つのセグメントに分割されます:
	<emphasis>テキスト</emphasis><emphasis>データ</emphasis>、および
	<emphasis>スタック</emphasis>です。
	テキストセグメントは読み出し専用で、プログラムの命令を含んでいます。
	データ及びスタックセグメントは読み取り書き込みともに可能です。
	データセグメントには
	初期化されているデータと初期化されていないデータがあるのに対し、
	スタックセグメントはランタイムスタックを保持します。
	ほとんどのマシンでは、プロセスが実行するとともに、
	カーネルによってスタックセグメントは自動的に拡張されます。
	プロセスはシステムコールによりデータセグメントを拡張する事が可能ですが、
	セグメントの内容がファイルシステムからのデータである場合、あるいは
	デバッグ時に限りプロセスはそのテキストセグメントのサイズを変更することができます。
	子プロセスのセグメントの初期の内容は親プロセスのセグメントのコピーです。</para>

      <para>プロセスアドレス空間の全内容はプロセスが実行するのには必要がありません。
	プロセスがメインメモリにおいて保持されていないアドレス空間の一部を参照する場合、
	システムはメインメモリーからメモリの中の必要な情報を
	<emphasis>ページ</emphasis>
	につけます。
	システムリソースが不足する場合、システムは利用可能な資源を維持するために2レベルのアプローチをします。
	適度の量のメモリが利用可能な場合でこれらの資源が最近使用されていない場合、
	システムはプロセスからメモリリソースを解放します。
	メモリー不足が深刻だった場合、システムはプロセスの全情況を2次キャッシュの
	<emphasis>スワップ</emphasis>
	に頼ります。
	<emphasis>ページング</emphasis><emphasis>スワップ</emphasis>
	の交換はシステムによって行われた、プロセスに有効です。
	プロセスは実行援助として予期された将来のメモリ利用についてシステムに助言するかもしれません。</para>

      <sect2>
          <title>BSDメモリ管理設計の決定</title>

	<para>疎の広いアドレス空間のサポート、
          メモリマップファイル、共有メモリは、
          4.2BSD に要求されたものの一つでした。
          独立したプロセス群がプロセスのアドレス空間をファイルにマッピングし、
          それの共有を可能にする
	  <emphasis>mmap</emphasis> と呼ばれるインタフェースが規定されました。
          複数のプロセスが同じファイルにプロセスのアドレス空間をマッピングした場合、
          一つのプロセスがファイルにマッピングされたアドレス空間の一部分に対して
          加えた変更は、通常のファイルがそうであるのと同様、
          同じ部分をマッピングしている他のプロセスにも反映されます。
	  しかし結局、4.2BSDは <emphasis>mmap</emphasis>
          インタフェースを含まない形でリリースされました。
          これはネットワークのような他の機能を実現する方が重要で、
          時間的な余裕がなかったからです。</para>

	<para><emphasis>mmap</emphasis>
          インタフェースの開発は、4.3BSD の作業の間も続けられました。
	  40 社を超える会社と研究グループが、
          Berkeley Software Architecture Manual <xref linkend="biblio-mckusick-1"/>
          に記載されたアーキテクチャの改訂版を策定する議論に参加し、
          いくつかの企業はその改訂版のインタフェースを実装しました
          <xref linkend="biblio-gingell"/></para>

	<para>しかし、またもや時間的な問題により
          4.3BSD への mmap インタフェースの実装は見送られました。
          もちろん既存の 4.3BSD 仮想記憶システムにそのインタフェースを組み込むことは
          可能だったのですが、4.3BSD の仮想記憶システムの実装は 10
          年近く前のものであったため、開発者たちはそれを組み込まないことに決定したのです。
          4.3BSD の仮想記憶システムはローカルに接続されたディスク装置は高速・大容量・安価で、
          コンピュータのメモリは小容量・高価であるという仮定に基づいて設計されており、
          そのため、その設計はメモリ利用量を節約できる代わりに
          余分なディスクアクセスを生成してしまうものでした。
          また、この実装は VAX のメモリ管理ハードウェアに強く依存するもので、
          他のコンピュータアーキテクチャへの移植が困難でした。
          最後にもう一つ付け加えるなら、この仮想記憶システムは
          現在普及がすすみ重要になってきている密結合マルチプロセッサに
          対応するように設計されていなかったのです。</para>

	<para>古い仮想記憶システムの実装を改良しようという試みは、
          ますます失敗が運命づけられたように思われました。
          その一方で、完全に新しい設計は大容量メモリを利用し、
          ディスクへのデータ転送を低減し、
          マルチプロセッサで動作することができる能力を持っていました。
          その結果、仮想記憶システムは 4.4BSD で完全に置き換えられることになったのです。
          4.4BSD 仮想記憶システムは Mach 2.0 VM システム <xref linkend="biblio-tevanian"/>
          をベースに、Mach 2.5 と Mach 2.0 の改良を採り入れたものです。
          この実装は、
          メモリ共有の効率が良く機種依存部分と機種非依存部分がきれいに分離されていて、
          (現在は使われていませんが)
          マルチプロセッサに対応しているという特徴を持っています。
          各プロセスは自分のアドレス空間のあらゆる部分をファイルにマッピングすることができ、
          互いに同一のファイルにアドレス空間をマッピングすることで、
          プロセス間でアドレス空間の一部を共有することが可能になりました。
          一つのプロセスが加えた変更は他のプロセスのアドレス空間にも反映され、
          マッピングされたファイル自身にも書き込まれます。
          また、プロセスはファイルをプライベートマッピングすることも可能です。
          プライベートマッピングとは、プロセスが加えた変更が、
          そのファイルをマッピングしている他のプロセスから見えないようにしたり、
          ファイル自身に書き戻されないようにするものです。</para>

        <para>仮想記憶システムの抱えるもう一つの問題は、
          システムコールが発行された時にカーネルに情報を渡す方法です。
          4.4BSD では、常にプロセスのアドレス空間からカーネル内のバッファに
          データをコピーしていました。
          大容量のデータを転送する読み書き操作が発生することを考えると、
          このコピーの実行には時間がかかる可能性があります。
          コピーを実現するもう一つの方法として、
          プロセスのメモリをカーネル内に再マッピングする方法があります。
          しかし 4.4BSD カーネルは、
          以下の理由から常にデータをコピーします。</para>

	<itemizedlist>
	  <listitem>
	    <para>ほとんどの場合ユーザデータはページ境界にアラインされていませんし、
              ハードウェアページ長の倍数でもありません。</para>
	  </listitem>

	  <listitem>
            <para>そのページをプロセスが破棄してしまうと、
              カーネルがページを参照できなくなってしまいます。
              プログラムの中には、カーネル内のバッファに
              書かれたデータが残っていることを想定しているものがあります。
            </para>
	  </listitem>

	  <listitem>
            <para>(現在の 4.4BSD セマンティクスで可能なように)
              プロセスがページのコピーを持てる場合、
              そのページは必ず<emphasis>コピーオンライト(copy-on-write)</emphasis>
              になっています。
              コピーオンライトのページとは、
              読み込み専用に設定することで書き込みに対する保護機能を有効化したページのことです。
              プロセスがそのページを変更しようとするとカーネルは書き込み例外を検出します。
              その際カーネルは、プロセスが変更できるようにそのページのコピーを作成します。
              残念ながら、プロセスは通常すぐに出力バッファに新しいデータを書こうとするため、
              結局データのコピーが発生してしまいます。</para>
	  </listitem>

	  <listitem>
            <para>ページが新しい仮想メモリアドレスに再マッピングされる際、
              ほとんどのメモリ管理ハードウェアでは、
              ハードウェアアドレス変換キャッシュの一部を破棄する必要があります。
              多くの場合、このキャッシュの破棄は時間がかかるため、
              4 から 8 キロバイトより小さいデータブロックに対しては、
              コピーするよりも再マッピングする方が実質的に遅い、
              という結果となります。</para>
	  </listitem>
	</itemizedlist>

        <para>メモリマッピングの最も大きな目的は、
          巨大なファイルへのアクセスと、
          プロセス間の大容量のデータ転送という要求に応えることです。
          <emphasis>mmap</emphasis> インタフェースは、
          両方の要求をコピーを行なうことなく実現する一つの方法を提供します。</para>
      </sect2>

      <sect2>
	<title>カーネル内部のメモリ管理</title>

        <para>カーネルは一つのシステムコールの間だけ必要とされるメモリの割り当てを頻繁に行ないます。
          ユーザプロセスではおそらく、
          そのような短期間使われるメモリはランタイムスタックに割り当てられるでしょう。
          カーネルのランタイムスタックには上限があるため、
          小さめのメモリブロックだとしてもスタックにメモリを割り当てることはできません。
          そのため、
          そのようなメモリはもっと動的な機能を用いて割り当てる必要があります。
          たとえば、システムがパス名の解釈を行なう場合、
          パス名を保持するために 1 キロバイトのバッファを割り当てる必要があります。
          しかしメモリブロックは一つのシステムコールよりも
          長く持続していなければならないため、
          スタックに空きがあったとしても、そこに割り当てることはできないでしょう。
          こういう例の一つに、ネットワークが接続されている間維持している必要がある
          プロトコル制御ブロックがあります。</para>

        <para>カーネル内の動的なメモリ割り当てに対する需要は、
          サービスが追加されるにつれて増加しています。
          汎用のメモリアロケータがあれば、
          カーネル内部のコードを書く際の複雑さを低減することができます。
          そのため 4.4BSD カーネルでは、システムのあらゆる場面で利用可能な
          単一のメモリアロケータを備えています。
          これは、
          アプリケーションプログラム用のメモリ割り付けを実現するために
          C ライブラリルーチンに含まれている <emphasis>malloc</emphasis><emphasis>free</emphasis> と類似したインタフェースを持っています
          <xref linkend="biblio-mckusick-2"/>。
          この割り付けルーチンは C ライブラリインタフェースと同様、
          引数として必要なメモリサイズを指定します。
          割り当てるメモリサイズの上限はありませんが、
          割り当てられるのは物理メモリであり、ページではありません。
          メモリ解放ルーチンは解放するメモリへのポインタを引数にとります。
          その際、解放するメモリサイズを指定する必要はありません。</para>
      </sect2>
    </sect1>

    <sect1 id="overview-io-system">
      <title>I/O システム</title>

      <para>基本的な UNIX の I/O システムモデルは、ランダムアクセスおよび
        シーケンシャルアクセスの可能なバイト列です。
        通常の UNIX ユーザープロセスには、
        <emphasis>アクセスメソッド</emphasis><emphasis>コントロールブロック</emphasis> は存在しません。</para>

      <para>I/O にさまざまなレベルの構造を期待するプログラムは各種ありますが、
        カーネルは I/O に構造を課しません。
        たとえば、テキストファイルは改行文字
        (ASCII LF 文字) で区切られた
        ASCII 文字の行の集まりですが、
        カーネルはそのような構造を関知しません。
        ほとんどのプログラムにとって、
        このモデルはデータバイトのストリームもしくは
        <emphasis>I/O ストリーム</emphasis>
        にすぎません。
        このような単一のデータ構造が、UNIX
        のツールベースのアプローチ (tool-based approach)
        を可能にしているのです<xref linkend="biblio-kernighan"/>。
        あるプログラムの出力ストリームは、他のほとんどのプログラムの入力
        ストリームとしてそのまま与える事ができます (このような伝統的な
        UNIX の I/O ストリームを、Eighth Edition
        のストリーム I/O システムや、
        System V Release 3 の STREAMS と混同すべきではありませんが、
        どちらのストリームも伝統的な I/O
        ストリームと同じようにアクセスすることが可能です)。</para>

      <sect2>
        <title>記述子と I/O</title>

	<para>UNIX のプロセスは、I/O ストリームを参照するのに
          <emphasis>記述子(descriptor)</emphasis>を使用します。
          記述子は
          <emphasis>open</emphasis> または <emphasis>socket</emphasis>
          システムコールにより取得される符号無しの小さな整数です。
          <emphasis>open</emphasis>システムコールは、
          引数にファイル名および許可モードをとり、
          それぞれ開くファイルおよび、モード
          (読み込み、書き込みまたは読み書き)
          を指定します。
          <emphasis>open</emphasis>
          システムコールは、新しい空のファイルの作成にも使用できます。
          <emphasis>read</emphasis>および
          <emphasis>write</emphasis>システムコールを記述子に対して使用し、
          データの転送を行います。
          <emphasis>close</emphasis>システムコールは、任意の記述子を開放します。</para>

	<para>記述子は、カーネルでサポートされるオブジェクトを表します。
          4.4BSD では、ファイル、パイプ、ソケットの 3 つのオブジェクトを
          表すことができます。</para>

        <itemizedlist>
          <listitem>
            <para><emphasis>ファイル</emphasis>は、少なくとも
              1 個の名前を持つバイト列です。
              ファイルは、すべての名前を明示的に削除し、
              その記述子を持つすべてのプロセスが消滅するまで存在します。
              プロセスは、<emphasis>open</emphasis>
              システムコールにより、
              指定されたファイル名を持つファイルのファイル記述子を取得します。
              I/O デバイスはファイルとしてアクセスされます。</para>
          </listitem>

	  <listitem>
	    <para><emphasis>パイプ</emphasis>とは、
              ファイルと同じくバイト列ですが
              I/O ストリームとしてのみ使われ、単一方向にのみ使われます。
              パイプには名前がないので、<emphasis>open</emphasis>
              システムコールでは開くことができません。
              パイプを開くには、<emphasis>pipe</emphasis>
              システムコールを使用します。
              <emphasis>pipe</emphasis>システムコールは 2 つの記述子を返します。
              ひとつの記述子に入力されたデータは、
              もう一方の記述子にそのまま順序を変えずに出力されます。
              名前付きパイプ (FIFO) も使用できます。
              名前があるのでファイルシステム上に配置され、
              <emphasis>open</emphasis> システムコールでアクセスできる以外は、
              パイプと同一の機能を持ちます。
              FIFO を使用してプロセス間通信を行いたい場合は、
              片方のプロセスが FIFO を書き込み用に開き、
              もう片方では読み込み用に開きます。</para>
          </listitem>

	  <listitem>
	    <para><emphasis>ソケット</emphasis>は、
              プロセス間通信のために使用されるオブジェクトで、
              ソケットを参照する記述子を持つプロセスが存在する間のみ存在します。
              ソケットは
              <emphasis>socket</emphasis> システムコールで作成します。
              <emphasis>socket</emphasis> システムコールは、
              作成したソケットの記述子を返します。
              さまざまな通信方法を実現するために、
              各種のソケットがあります。
              たとえば、信頼性の高いデータ転送を目的としたソケット、
              メッセージの順番を保持するソケット、
              メッセージの境界を保護するソケットなどがあります。</para>
	  </listitem>
	</itemizedlist>

	<para>4.2BSD でソケットが導入されるまで、
          パイプはファイルシステムを用いて実装されていました。
          4.2BSD 以降では、ソケットを使用して実装されています。</para>

	<para>カーネルはそれぞれのプロセスの<emphasis>記述子テーブル</emphasis>を保持しており、
          記述子の外部表現を内部表現に変換するために用いられます
          (記述子そのものはこのテーブルへのインデックス値にすぎません)。
          記述子テーブルは、親プロセスから子プロセスに継承されます。
          そのため、記述子の参照先も同じく継承されます。
          記述子を得るためには、オブジェクトを開いたり、
          作成したりする以外に、
          このような親プロセスからの継承による方法があります。
          また IPC ソケットを使用すれば、
          同一マシン上で動作している無関係なプロセス間で、
          記述子のやりとりが可能です。</para>

	<para>すべての有効な記述子は、
          オブジェクトの先頭からの位置を
          <emphasis>ファイルオフセット</emphasis>
          としてバイト単位で保持しています。
          読み込みおよび書き込み動作は、
          このオフセット位置から行われ、
          データが転送される毎にオフセットの位置は更新されます。
          ランダムアクセスを許可しているオブジェクトの場合、
          ファイルオフセットは、<emphasis>lseek</emphasis>
          システムコールを利用して移動することもできます。
          通常のファイルやある種のデバイスはランダムアクセス可能です。
          パイプ、ソケットはランダムアクセスできません。</para>

	<para>プロセスが終了すると、
          カーネルはそのプロセスに使用されていたすべての識別子を回収します。
          プロセスがオブジェクトへの参照を保持したまま終了した場合は、
          オブジェクトマネージャに通知し、ファイルの削除、
          ソケットの開放などの必要なクリーンアップを行わせます。</para>
      </sect2>

      <sect2>
	<title>記述子の管理</title>

	<para>ほとんどの場合、プロセスが起動されると、
          3 つの記述子がすでに開かれています。
          それらの記述子は、012 で、それぞれ一般的には、
          <emphasis>標準入力</emphasis><emphasis>標準出力</emphasis><emphasis>標準エラー出力</emphasis>
          として知られています。
          通常これらの識別子は、
          ログインプロセスによりユーザの端末に割り当てられています
          (14.6 節参照)。すなわち、キーボードからの入力を標準入力として受け取り、
          標準出力への出力は端末の画面に表示されます。
          標準エラー出力もエラー出力用に書き込み用に開かれていますが、
          通常の出力には標準出力が利用されます。</para>

	<para>これらの記述子を
          (他の記述子も)
          端末以外のオブジェクトに割り当てることも可能です。
          このような割り当てを、
          <emphasis>I/O リダイレクト</emphasis>と呼びます。
          すべての標準シェルでは、ユーザが I/O リダイレクトを行うことができます。
          記述子 1 (標準出力) を閉じ、
          指定したファイルを記述子 1 として開くことで、
          シェルは出力をファイルに送ることができます。
          同様に、記述子 0 を閉じ、
          指定したファイルを開くことで、
          ファイルから標準入力を受け取るようにできます。</para>

	<para>パイプは、プログラムの変更をまったく行わず
          (再リンクも必要ありません)、あるプログラムの出力を
          他のプログラムに入力することを可能にします。
          出力側のプログラムの記述子 1 (標準出力)
          は、端末出力の代わりにパイプの入力記述子に割り当てられます。
          同様に入力側のプログラムの記述子 0 (標準入力) は、
          端末からのキーボード入力ではなくパイプの出力記述子に割り当てられます。</para>

	<para><emphasis>open</emphasis><emphasis>pipe</emphasis><emphasis>socket</emphasis>
	  システムコールは、新しい記述子を生成し、
          使用できる最も小さい番号を割り当てます。
          パイプを動作させるためには、そのように生成された記述子を
          01 にマップする仕組みが必要になります。
	  <emphasis>dup</emphasis>
	  システムコールは、
          同一のファイルテーブルエントリを指す記述子のコピーを作成します。
          新しい記述子も同じく使用可能な最小の番号が使われるため、
          <emphasis>dup</emphasis>システムコールを使用して、
          必要なマップを行えます。
          ただ、記述子 1 が必要な場合でも、記述子 0 が既に閉じられていると、
          記述子 0 が割り当てられてしまいますので注意が必要です。
          この問題を避けるため、
	  <emphasis>dup2</emphasis> システムコールがあります。
	  <emphasis>dup</emphasis> に引数が 1 つ追加され、
          割り当てたい記述子の番号を指定することができます
          (もし、指定された番号の記述子が使用中の場合、
          <emphasis>dup2</emphasis> は、まずその記述子を閉じたのち、
          再割り当てします)。</para>
      </sect2>

      <sect2>
	<title>デバイス</title>

	<para>ハードウェアデバイスはファイル名を持ち、通常のファイルと
	  同一のシステムコールでアクセスできます。カーネルは、
	  <emphasis>デバイス特殊ファイル</emphasis><emphasis>特殊ファイル</emphasis>を区別し、
          参照しているデバイスを特定できますが、
          ほとんどのプロセスにとって、このような区別は必要ありません。
          端末、プリンタ、テープデバイスは、4.4BSD のディスクファイルと同様、
          バイト列としてアクセスされます。そのため、デバイス依存部分や特殊部分は、
          可能な限りカーネルに隠蔽され、さらにカーネル内でも、
          それらの大部分がデバイスドライバ内に分離されています。</para>

	<para>ハードウェアデバイスは、
	  <emphasis>構造を持つ</emphasis>デバイスと
	  <emphasis>構造を持たない</emphasis>デバイスに分けられます。
	  それぞれ、
	  <emphasis>ブロック</emphasis>デバイス、
	  <emphasis>キャラクタ</emphasis>デバイスと呼ばれます。
	  それらのデバイスファイルへのアクセスは、カーネル内の
	  <emphasis>デバイスドライバ</emphasis>
          と呼ばれるソフトウェアモジュールによって処理されます。
          ほとんどのネットワーク通信ハードウェアデバイスは、
          ファイルシステム上に特殊ファイルを持たず、
	  プロセス間通信機能によってのみアクセスできます。
          それは、<emphasis>raw-socket</emphasis>の方が特殊ファイルより、
          より自然なインタフェースを提供できるためです。</para>

	<para>典型的なブロックデバイス (構造を持つデバイス) としては、
          ディスク、磁気テープがあげられますが、
          ほとんどのランダムアクセスデバイスがそれに該当します。
          カーネルは、読み込み-変更-書き込みに対してバッファリングを提供し、
          通常ファイルと同様の、
          完全なバイトアドレス指定のランダムアクセスを提供します。
          ファイルシステムは、ブロックデバイス上に構築されます。</para>

	<para>構造を持たないデバイスは、
          ブロック構造をサポートしないデバイスで、通信線、ラスタプロッタ、
          バッファのない磁気ディスクやテープなどです。
          構造を持たないデバイスは通常、
          大容量のブロック I/O 転送をサポートします。</para>

	<para>構造を持たないファイルは<emphasis>キャラクタデバイス</emphasis>と呼ばれます。
          これは最初に実装されたこの種類のデバイスが、
          端末デバイスドライバだったからです。
          このようなデバイスに対するカーネルのインタフェースは、
          他のブロック構造を持たないデバイスに対しても有用であることが証明されました。</para>

        <para>デバイス特殊ファイルは、
          <emphasis>mknod</emphasis>システムコールにより作成されます。
          <emphasis>ioctl</emphasis>システムコールは、
          特殊ファイルに対応するデバイスのパラメータを操作するのに使われます。
          このシステムコールは、他のシステムコールに新たな機能を追加せずに、
          デバイスの特殊な機能を操作することを可能にします。
          たとえば、<emphasis>ioctl</emphasis>を使用して、
          終了マークをテープデバイスに書き込むことができます。
          <emphasis>write</emphasis> に変更を加えたり、
          特殊なバージョンを用意する必要はありません。</para>
      </sect2>

      <sect2>
	<title>ソケット IPC</title>

	<para>4.2BSD カーネルはソケットを利用して、パイプより柔軟な
          IPC 機能を導入しました。ソケットは、ファイルやパイプと同様、
          記述子により参照される、通信の末端点です。
          2 つのプロセスがそれぞれ、ソケットを作成して接続することにより、
          信頼性の高いバイトストリームを作成できます。
          接続されれば、それぞれのプロセスは、パイプと同じように、
          読み込み書き込みをソケットに対して行えます。
          ソケットの透明性により、カーネルはプロセスの出力を、
          別のマシン上のプロセスの入力に送ることも可能です。
          パイプとソケットの大きな違いは、
          パイプは共通の親プロセスが設定する必要があるのに対して、
          ソケットはまったく無関係の
          (異なるマシン上で動作する)
          プロセス間でも使用できる点です。</para>

	<para>System V は、FIFO
          もしくは<emphasis>名前付きパイプ</emphasis>と呼ばれる
          ローカルプロセス間通信の仕組みを備えています。
	  FIFO はファイルシステム上のオブジェクトとして現われ、
          パイプと同様な方法でオープンし、データを送ることができます。
          そのため、FIFO は共通の親プロセスによって設定される必要はなく、
          プロセス同士が起動し動作開始してから接続することが可能です。
	  しかしソケットとは異なり、
          異なるマシン上で動作するプロセスに対しては使用できません。
          4.4BSD で、FIFO が実装されているのは、
          POSIX.1 標準に準拠するためのみです。
          FIFO の機能は、ソケットの機能の一部になっています。</para>

	<para>ソケット機構を実現するには、
          伝統的な UNIX の I/O システムコールに名前付けや接続機能を追加する必要がありました。
          開発者は、既存のインタフェースへの拡張は既存のシステムコールが変更なしに使用できる範囲にとどめ、
          追加機能を扱う新しいインタフェースを設計しました。
          バイトストリーム型の接続の読み込み書き込みを行う
          <emphasis>read</emphasis><emphasis>write</emphasis> システムコールに加え、
          ネットワークダイアグラムのような宛名付きメッセージを読み込むため、
          新たに 6 つのシステムコールが追加されました。
          メッセージ書き込み用の
          <emphasis>send</emphasis><emphasis>sendto</emphasis><emphasis>sendmsg</emphasis> システムコールと、
          メッセージの読み込み用の
          <emphasis>recv</emphasis><emphasis>recvfrom</emphasis><emphasis>recvmsg</emphasis> システムコールです。
          考え直して見ると、
          それぞれの読み書き用のシステムコールのうち最初の 2
          つは次のシステムコールの特殊な場合であるので、
          <emphasis>recvfrom</emphasis><emphasis>sendto</emphasis> システムコールは、それぞれ
          <emphasis>recvmsg</emphasis><emphasis>sendmsg</emphasis> のライブラリインタフェースとし
          て追加すべきだったかも知れません。</para>
      </sect2>

      <sect2>
	<title>Scatter/Gather I/O</title>

	<para>既存の
	  <emphasis>read</emphasis> および
	  <emphasis>write</emphasis> システムコールに加え、
          4.2BSD で scatter/gather I/O 機能が導入されました。
          scatter 入力は
	  <emphasis>readv</emphasis>
          システムコールによって行われ、
          複数の異なるバッファに対して単一の読み込みを実行できます。
	  逆に <emphasis>writev</emphasis>
          システムコールは、複数の異なるバッファに対してアトミックな書き込みを実行できます。
	  <emphasis>read</emphasis><emphasis>write</emphasis> によって行われるように、
          単一のバッファと長さをパラメータとして渡す代わりに、
          バッファと長さの配列へのポインタとそのサイズを渡します。</para>

	<para>この機能により、
          プロセスアドレス空間の異なる場所にあるバッファに対してアトミックな単一の書き込みを行え、
          隣接するバッファにコピーする必要もありません。
          テープデバイスのように、それぞれの要求に対し、
          テープブロックを出力をする必要があるようなレコードベースのデバイスを抽象化した場合、
          アトミックな書き込みが必要になります。
          また、単一の読み込みリクエストで複数のバッファに読み込めるのは非常に便利です
          (たとえばレコードヘッダとデータをそれぞれ別のバッファに読み込む場合など)。
	  もちろん単一の大きなバッファにデータを読み込み、
          読み込んだデータを必要な場所に移動することで
          scatter 動作をシミュレートすることは可能です。
          ただし、このようなメモリ間のコピーのコストは、
          アプリケーションの動作に必要な時間を 2 倍以上にしてしまうことも良くあります。</para>

        <para><emphasis>send</emphasis><emphasis>recv</emphasis> がそれぞれ、
          <emphasis>sendto</emphasis><emphasis>recvfrom</emphasis>
          のライブラリインタフェースとして実装可能であったのと同じく、
          <emphasis>read</emphasis><emphasis>write</emphasis> をそれぞれ、
          <emphasis>readv</emphasis><emphasis>writev</emphasis>
          のライブラリインタフェースとして実装も可能であったでしょう。
          しかし、
          <emphasis>read</emphasis><emphasis>write</emphasis> はより頻繁に使われるため、
          シミュレートするための追加コストを考えると
          ライブラリインタフェースとしての実装は割に合わなかったでしょう。</para>
      </sect2>

      <sect2>
	<title>複数のファイルシステムのサポート</title>

	<para>ネットワークコンピューティングの発達により、
          ローカルおよびリモートファイルシステムへの対応が望まれるようになりました。
          複数のファイルシステムのサポートを簡単にするために、
          開発者は
          <emphasis>vnode</emphasis>
	  インタフェースをカーネルに追加しました。
          vnode インタフェースから提供される操作は、
          以前にローカルファイルシステムでサポートされていたファイルシステム操作とほぼ同じですが、
          幅広いファイルシステムにより使用ができるようになっています。</para>

	<itemizedlist>
	  <listitem>
	    <para>ローカルのディスクファイルシステム</para>
	  </listitem>

	  <listitem>
	    <para>各種リモートファイルシステムプロトコルによりインポートされたファイル</para>
	  </listitem>

	  <listitem>
	    <para>読み込み専用 CD-ROM ファイルシステム</para>
	  </listitem>

	  <listitem>
	    <para>特殊機能を提供するファイルシステム。
              たとえば <filename>/proc</filename>
              ファイルシステムなど</para>
	  </listitem>
	</itemizedlist>

	<para>4.4BSD 由来の OS の中には FreeBSD のように、
          <emphasis>mount</emphasis>
          でファイルシステムが初めて参照された時にファイルシステムを動的に読み込むことが
          できるものもあります。
          vnode インタフェースについては 6.5 節、
          補助サポートルーチンについては 6.6 節、
          特殊機能ファイルシステムについては 6.7 節に記載されています。</para>
      </sect2>
    </sect1>

    <sect1 id="overview-filesystem">
      <title>ファイルシステム</title>

      <para>通常ファイルとは一次元のバイト列であり、
        任意の場所から読み込み・書き込みが可能です。
        カーネルは、ファイルのレコード境界を認識しませんが、
        多くのプログラムは 改行 (LF) 文字を行の終りと認識します。
        またこれとは異なるファイル構造を利用するアプリケーションもあります。
        ファイル自身には、ファイルに関するシステム情報はまったく含まれません。
        各ファイルのファイル所有者、許可属性、
        使用状況などのいくつかの情報はファイルではなくファイルシステムが保持しています。</para>

      <para><emphasis>ファイル名</emphasis>は最大 255 文字までの文字列です。
        ファイル名は<emphasis>ディレクトリ</emphasis>
        と呼ばれる型のファイルに保管されます。
        ディレクトリに含まれるファイルの情報は<emphasis>ディレクトリエントリ</emphasis>と呼ばれ、
        ファイル名以外にファイルそのものへのポインタも含みます。
        ディレクトリエントリには通常のファイル以外に、
        他のディレクトリを参照するエントリが含まれます。
        このようにしてディレクトリとファイルによる階層が形作られ、
        その階層構造を<emphasis>ファイルシステム</emphasis>と呼びます。</para>

      <figure id="fig-small-fs">
        <title>小規模なファイルシステム</title>

        <mediaobject>
          <imageobject>
            <imagedata fileref="fig2" format="EPS"/>
          </imageobject>

          <textobject>
            <literallayout class="monospaced">                                    +-------+
                                    |       |
                                    +-------+
                                   /         \
                              usr /           \ vmunix
                                |/             \|
                        +-------+               +-------+
                        |       |               |       |
                        +-------+               +-------+
                       /    |    \
                staff /     |     \ bin
                    |/      | tmp  \|
            +-------+       V       +-------+
            |       |   +-------+   |       |
            +-------+   |       |   +-------+
           /    |    \  +-------+  /    |    \
 mckusick /     |     \|         |/     |     \ ls
        |/      | karels                | vi   \|
+-------+       V                       V       +-------+
|       |   +-------+               +-------+   |       |
+-------+   |       |               |       |   +-------+
            +-------+               +-------+</literallayout>
          </textobject>

          <textobject>
            <phrase>小規模なファイルシステムツリー</phrase>
          </textobject>
        </mediaobject>
      </figure>

      <para><xref linkend="fig-small-fs"/>は小規模なファイルシステムの一例です。
        ディレクトリはサブディレクトリを含むことができ、
        入れ子の深さには特に制限はありません。
        ファイルシステムの一貫性を保つため、
        カーネルはプロセスが直接ディレクトリへ書き込むことを禁止しています。
        ファイルシステムには、通常ファイル、ディレクトリ以外に、
        デバイスファイルやソケットなどの他のオブジェクトへの参照も含まれます。</para>

      <para>ファイルシステムは、
        <emphasis>ルートディレクトリ</emphasis>
        を始点とする木構造を持っています。
        ルートディレクトリは、
        <emphasis>スラッシュ</emphasis>
        と呼ばれる場合もあり、斜線文字(/)で表されます。
        ルートディレクトリにはファイルが含まれます。
        図 2.2 の例では、
        <filename>usr</filename>
        ディレクトリが含まれ、その
        <filename>usr</filename>
        ディレクトリには、
        <filename>bin</filename>
        ディレクトリが含まれます。
        <filename>bin</filename>
        ディレクトリには、通常
        <filename>ls</filename><filename>vi</filename>
        をはじめとする、プログラムの実行可能コードが含まれます。</para>

      <para>プロセスは、ファイルの指定を<emphasis>パス名</emphasis>によって行います。
        パス名は、0 個以上のファイル名を斜線文字(/)で区切った文字列です。
        カーネルはパス名を解釈するため、それぞれのプロセスに 2 つのパス名を関連付けます。
        プロセスの<emphasis>ルートディレクトリ</emphasis>は、
        プロセスがアクセスできるファイルシステム上で最も上位の点です。
        通常、このルートディレクトリは、
        ファイルシステム全体のルートディレクトリに設定されます。
        斜線文字 (/) ではじまるパス名は<emphasis>絶対パス名</emphasis>と呼ばれ、
        カーネルは、そのパス名がプロセスのルートディレクトリから
        開始するものと解釈します。</para>

      <para>斜線文字 (/) ではじまらないパス名は<emphasis>相対パス名</emphasis>と呼ばれ、
        プロセスの<emphasis>カレント作業ディレクトリ</emphasis>を基準とした相対的なパスとして解釈されます
        (このディレクトリは、短縮して
        <emphasis>カレントディレクトリ</emphasis>
        または、
        <emphasis>作業ディレクトリ</emphasis>
        とも呼ばれます)。
        カレントディレクトリそのものは、
        <emphasis>ドット</emphasis>
        とも呼ばれ、1 つのピリオド (<filename>.</filename>) で表されます。
        ファイル名
        <emphasis>ドットドット</emphasis> (<filename>..</filename>) は、
        ディレクトリの親ディレクトリを表します。
        ルートディレクトリの親ディレクトリはルートディレクトリ自身です。</para>

      <para><emphasis>chroot</emphasis>
        システムコールにより、プロセスのルートディレクトリを、
        <emphasis>chdir</emphasis>
        システムコールにより、カレントディレクトリを変更できます。
        <emphasis>chdir</emphasis>
        はいつでも行えますが、
        <emphasis>chroot</emphasis>
        の実行は、管理者特権を持つプロセスに限られます。
        <emphasis>chroot</emphasis>
        は通常、システムに対するアクセス制限を課すために用いられます。</para>

      <para>2.2 のファイルシステムにおいて、プロセスのルートディレクトリ
        がファイルシステムのルートディレクトリで、カレントディレクトリが
        <filename>/usr</filename>
        であったとします。このとき、
        <filename>vi</filename>
        を参照するには、絶対パスを用いて、
        <filename>/usr/bin/vi</filename>
        とも書けますし、カレントディレクトリからの相対パスを用いて、
        <filename>bin/vi</filename>
        とも書けます。</para>

      <para>システムのユーティリティやデータベースは、
        よく知られたある決まったディレクトリに保存されます。
        ファイルシステムの階層構造としてよく知られたものに、
        各々のユーザの<emphasis>ホームディレクトリ</emphasis>があります。
        たとえば、図 2.2<filename>/usr/staff/mckusick</filename><filename>/usr/staff/karels</filename>
        などです。 ユーザがログインすると、
        シェルのカレントディレクトリはホームディレクトリに設定されます。
        ユーザはホームディレクトリ内で通常ファイルの作成と同様にディレクトリも作成できるため、
        複雑な階層構造を構築することも可能です。</para>

      <para>ユーザからはファイルシステムが 1 つに見えますが、
        システムは 1 つの仮想ファイルシステムが、
        実際には異なるデバイス上の複数の物理ファイルシステムから構成されていることを認識しています。
        物理ファイルシステムは、異なったデバイスにまたがることはできません。
        ほとんどの場合、物理ディスクデバイスは複数の論理デバイスに分割されるため、
        1 つの物理デバイス上に複数のファイルシステムを構成することもできます。
        すべての絶対パス名を解決できるファイルシステムを
        <emphasis>ルートファイルシステム</emphasis>と呼び、
        常に利用可能な状態になっています。
        他のファイルシステムは、マウントすることができます。
        マウントとは、ルートファイルシステムのディレクトリ構造の一部として統合する操作です。
        ファイルシステムにマウントされたディレクトリの参照は、
        そのマウントされたファイルシステムのルートディレクトリの参照へと
        カーネルによって透過的に変換されます。</para>

      <para><emphasis>link</emphasis>
        システムコールは、既存のファイル名に、別名を与えます。
        <emphasis>リンク</emphasis>が成功すると、
        ファイルはどちらのファイル名からでもアクセスできるようになります。
        ファイル名は <emphasis>unlink</emphasis>
        システムコールにより削除できます。
        ファイルを参照していた最後の名前が削除されると
        (さらにファイルを開いていた最後のプロセスがファイルを閉じると)
        ファイルそのものも削除されます。</para>

      <para>ファイルは<emphasis>ディレクトリ</emphasis>内で階層構造を持って保持されます。
        ディレクトリそのものも一種のファイルですが、
        ディレクトリは一般のファイルと異なり、
        システムによって決められた構造を持っています。
        ディレクトリは一般のファイルと同じくプロセスから読み込むことが可能ですが、
        ディレクトリに変更を加えられるのはカーネルだけです。
        ディレクトリは
        <emphasis>mkdir</emphasis> システムコールで作成し、
        <emphasis>rmdir</emphasis> システムコールで削除します。
        4.2BSD 以前のシステムにおける
        <emphasis>mkdir</emphasis><emphasis>rmdir</emphasis>
        システムコールは、一連の
        <emphasis>link</emphasis><emphasis>unlink</emphasis>
        システムコールの実行として実装されていました。
        明示的にディレクトリの作成、
        削除を行うシステムコールを新たに追加した理由は、3 つあります。</para>

      <orderedlist>
        <listitem>
          <para>アトミックな動作を可能にするため。
            link システムコールによる実装の場合と異なり、
            システムがクラッシュした場合に
            ディレクトリの構造が中途半端なままになることがありません。</para>
        </listitem>

        <listitem>
          <para>ネットワークファイルシステムを使用している場合には
            シリアライズ (操作順序の保証) を行うため、ファイルおよびディレクトリの作成、
            削除はアトミックに行われる必要があります。</para>
        </listitem>

        <listitem>
          <para>UNIX 以外のファイルシステム
            (他のパーティション上の MS-DOS
            ファイルシステムなど) をサポートする場合、
            そのファイルシステムが
            link システムコールをサポートしない可能性があります。
            たとえそれがディレクトリをサポートするファイルシステムであっても、
            UNIX ファイルシステムとは異なり、ディレクトリをリンクとして作成、
            削除しないものもあります。
            そのためそのようなファイルシステムでは、
            ディレクトリの作成、削除は、
            明示的に要求されない限り行われません。</para>
        </listitem>
      </orderedlist>

      <para>
        <emphasis>chown</emphasis>
        システムコールはファイルの所有者とグループを設定します。
        <emphasis>chmod</emphasis>
        システムコールは、ファイルの保護モードを変更します。
        これらのファイルの属性は、
        <emphasis>stat</emphasis>
        システムコールをファイル名に対し実行することで読み出すことができます。
        <emphasis>fchown</emphasis><emphasis>fchmod</emphasis><emphasis>fstat</emphasis>
        システムコールは、同様な動作をファイル名ではなくファイル記述子に対して行います。
        <emphasis>rename</emphasis>
        システムコールは、ファイルに新しい名前をつけて古い名前を削除します。
        ディレクトリ作成・削除操作と同じように、
        <emphasis>rename</emphasis>
        システムコールはローカルファイルシステムの名前変更動作をアトミックにするため
        4.2BSD で追加されました。
        後に、この動作はネットワーク上の非 UNIX
        ファイルシステムに対して名前変更操作を行う場合に有効であることがわかりました。</para>

      <para>
        <emphasis>truncate</emphasis>は、
        4.2BSD で追加されたファイルを任意の長さに切り詰めるシステムコールです。
        このシステムコール追加の主な目的は
        ランダムアクセスファイルの最後をプログラムが最後にアクセスした場所に設定する、
        という動作を持つ Fortran ランタイムライブラリのサポートでした。
        <emphasis>truncate</emphasis>
        システムコールを使用しない場合、
        ファイルの長さを縮める唯一の方法は必要な部分をコピーしたファイルを作成し、
        元のファイルを削除した後にコピーしたファイルをリネームする方法です。
        このアルゴリズムは遅いだけでなく、
        空き容量の少ないファイルシステムでは失敗する可能性があります。</para>

      <para>ファイルシステムにファイルを縮める機能が追加されると、
        それはカーネルが大きな空のディレクトリを小さくする用途に使用するようになりました。
        空のディレクトリを縮小すると、
        ファイルの作成、
        削除時にカーネルがファイルを検索する時間を短縮できるという利点があります。</para>

      <para>新規に作成されたファイルには、
        作成したプロセスのユーザ識別子と作成が行われたディレクトリのグループ識別子を与えられます。
        ファイルの保護用に 3 レベルのアクセス制御機構が用意されています。
        この 3 レベルのファイルアクセス許可は</para>

      <orderedlist>
        <listitem>
          <para>ファイルを所有しているユーザ</para>
        </listitem>

        <listitem>
          <para>ファイルを所有しているグループ</para>
        </listitem>

        <listitem>
          <para>他のすべて</para>
        </listitem>
      </orderedlist>

      <para>に対して設定することができます。
        それぞれのアクセスレベルは、さらに
        読み取り許可、書き込み許可、実行許可に分けられています。</para>

      <para>ファイルは作成時に長さが 0 であり、
        書き込みされるにつれて長くなっていきます。
        システムはファイルが開かれると、
        対応する記述子の現在位置を指定するポインタを保持します。
        このポインタはファイル内をランダムアクセスするように動かすことが可能です。
        <emphasis>fork</emphasis><emphasis>dup</emphasis>
        システムコールによりファイル記述子を共有するプロセス間では、
        この現在位置ポインタは共有されます。
        別々の <emphasis>open</emphasis> システムコールによって
        作成されたファイル記述子は、独立した現在位置ポインタを持ちます。
        ファイルは<emphasis></emphasis>を持つことがあります。
        穴とはファイルの一次元構造の中で、
        データが一度も書き込まれたことのない空の部分です。
        ファイルの最後尾より後にポインタを動かし書き込みを行うことで、
        ファイルに穴をつくることができます。
        読み込まれた場合、穴は 0 の値をもつバイトとして扱われます。</para>

      <para>初期の UNIX システムではファイル名に 14 文字以内という制限があり、
        よく問題となっていました。
        たとえば、ユーザは当然ながら長く説明的なファイル名を付けたいと望みますし、
        <filename><replaceable>basename</replaceable>.<replaceable>extension</replaceable></filename>
        という慣用的なファイル命名規則を考えると、
        extension (C のソースファイルの <literal>.c</literal>、
        中間バイナリオブジェクトファイルの <literal>.o</literal>
        というように、ファイルの種類を示す部分) に 1 から 3 文字必要ですから、
        basename に付けられる文字数は 10 から 12 しか残っていません。
        ソースコード制御システムやエディタは通常、
        独自の目的のためにさらに 2 文字をファイル名の前後に付加しますので、
        実際に使えるのは、8 から 10 文字になります。
        basename として英語を一単語 (たとえば multiplexer) 使うだけで、
        簡単に 10 から 12 文字になってしまうでしょう。</para>

      <para>このような制限を守るのは不可能ではありませんが、
        危険な場合もあります。
        他の UNIX システムでは、
        より長いファイル名を受け付けるものの実際にファイルを作成する時点でファイル名を
        <emphasis>切り詰める</emphasis>ものがあるからです。
        C のソースコードファイル <filename>multiplexer.c</filename>
        (すでに 13 文字です) のソースコード制御ファイルは、
        頭に <literal>s.</literal> が付加されて <filename>s.multiplexer</filename>
        となります。
        このファイルは、C ソースの文書の
        <literal>troff</literal> ソースファイル <filename>multiplexer.ms</filename>
        のソースコード制御ファイルと区別がつきません。
        ソースコード制御システムはこの問題に対して警告を出さないため、
        これらの 2 つのファイル内容の取り違えは容易に発生します。
        注意深くコーディングすればこのような問題は避けられますが、
        4.2BSD でロングファイルネームが導入されたことで
        この問題は実質的になくなりました。</para>
    </sect1>

    <sect1 id="overview-filestore">
      <title>ファイル記録機構</title>

      <para>ローカルファイルシステムに対する操作には二種類あります。
        まず、ローカルファイルシステムすべてに共通して
        階層化されたファイルのネーミング、ロック、割り当て、
        属性管理、保護といった、データの記録方法とは独立した機能です。
        4.4BSD はこれらの機能を提供する単一の実装を備えています。</para>

      <para>もう一つは記録媒体上におけるデータ構成と管理です。
        ファイル内容を記録媒体上に配置するのはファイル記録機構の役割であり、
        4.4BSD は 3 種類の異なるファイル配置法に対応しています。</para>

      <itemizedlist>
        <listitem>
          <para>伝統的な Berkeley Fast Filesystem</para>
        </listitem>

        <listitem>
          <para>Sprite という OS の設計に由来する
            ログ構造化ファイルシステム
            <xref linkend="biblio-rosenblum"/></para>
        </listitem>

        <listitem>
          <para>メモリベースのファイルシステム</para>
        </listitem>
      </itemizedlist>

      <para>これらのファイル記録機構の構成はまったく異なるものですが、
        それを使用するプロセスからは違いを意識することはありません。</para>

      <para>Fast Filesystem は、データをシリンダグループという単位で構成します。
        ファイルシステム階層の配置から考えて同時にアクセスされやすいと考えられるファイルは、
        同じシリンダグループに記録され、同時にアクセスされる可能性の低いファイルは
        異なるシリンダグループに記録されます。
        この記録機構では以上のように、複数のファイルが同時に書き込まれたとしても、
        記録される場所はディスクのまったく違う場所になる可能性があるのです。</para>

      <para>ログ構造化ファイルシステムは、データをログという形で構成します。
        ある時点で記録されたデータはすべて一つに集められ、
        同じディスクの場所に書き込まれます。
        データが上書きされることは絶対にありません。
        ファイルの更新は、ファイルを上書きする代わりに
        新しいファイルを書き込んでそのファイルを置き換えることによって行なわれます。
        ファイルシステムに空き容量がなくなり新たに空き容量が必要になった場合は
        ゴミ集め (garbage-collection) プロセスが実行され、
        古いファイルが再利用されます。</para>

      <para>メモリベースのファイルシステムは、
        データを仮想メモリに記録するように設計されたものです。
        これは <filename>/tmp</filename> のように高速アクセスが必要で、
        永続的でないファイルシステムに使われます。
        メモリベースファイルシステムの目標は、
        仮想メモリ資源の利用量を可能な限り最小限に保つことにあります。</para>
    </sect1>

    <sect1 id="overview-nfs">
      <title>ネットワークファイルシステム</title>

      <para>当初、ネットワーク通信はデータをあるマシンから
        他のマシンへ転送するために用いられていましたが、
        のちにそれは、ユーザが離れたマシンへログイン可能な形に発展しました。
        次に期待されたのはユーザがデータを取り行くのではなく、
        ユーザの元にデータがやってくるようにすることでした。
        そのために生まれたのがネットワークファイルシステムです。
        ローカルで作業しているユーザはキー入力時にネットワークの遅れを感じず、
        より応答性の良い環境を手に入れたのです。</para>

      <para>ファイルシステムをローカルマシンに持ってくることは
        初期のサーバ-クライアント型アプリケーションの中で主要なもののひとつでした。
        <emphasis>サーバ</emphasis>1 つもしくはそれ以上のファイルシステムを
        エクスポートするリモートのマシンです。
        <emphasis>クライアント</emphasis>
        はそのファイルシステムをインポートするローカルのマシンです。
        ローカルのクライアントから見ると、
        リモートでマウントされたファイルシステムは
        ローカルにマウントされた他のファイルシステムのように
        ファイルツリーの名前空間に現れます。
        ローカルのクライアントは
        リモートのファイルシステム上にディレクトリを変えたり、
        ローカルのファイルシステム上でするのとまったく同じように
        リモートのファイルシステムで読み書きをしたり、
        バイナリを実行したりできます。</para>

      <para>ローカルのクライアントが
        リモートのファイルシステム上で操作すると、
        その操作要求がひとまとめにされてサーバに送られます。
        サーバは要求された操作を行い、
        クライアントから要求された情報、もしくは、
        なぜその要求が拒絶されたかを示すエラーを返します。
        適切な性能を得るには、
        クライアントは頻繁にアクセスされたデータをキャッシュしなければなりません。
        リモートファイルシステムの複雑さは、
        サーバと多くのクライアントの間のキャッシュの一貫性を維持することにあります。</para>

      <para>長期にわたって数多くのリモートファイルシステムプロトコルが開発されてきましたが、
        UNIX システムにおいて最も普及しているものは、
        そのプロトコルと実装の大部分が Sun Microsystems によって行なわれた
        ネットワークファイルシステム (NFS) です。
        実装はプロトコル規格から独立して行われましたが、
        4.4BSD カーネルは NFS プロトコルをサポートしています
        <xref linkend="biblio-macklem"/>。
        NFS プロトコルについては 9 章で説明しています。</para>
    </sect1>

    <sect1 id="overview-terminal">
      <title>端末</title>

      <para>端末は、標準的なシステム I/O 操作はもちろんのこと、
        入力文字の編集や出力のディレイの制御をするための端末固有の操作をひととおり
        サポートしています。
        一番低いレベルにあるのは、ハードウェア端末ポートを制御する端末デバイスドライバです。
        端末入力は、たとえばボーレートのような基礎的な通信特性や、
        パリティ検査のようなソフトウェアで制御可能なパラメータ類に
        従って扱われます。</para>

      <para>端末デバイスドライバの上の層には、
        文字処理をどの程度行なうかを定義している
        ラインディシプリン (line discipline; 回線端末制御) と呼ばれるものがあります。
        対話的なログインをするためにポートが
        用いられるときにはデフォルトのラインディシプリンが選択され、
        そのラインディシプリンは<emphasis>カノニカルモード</emphasis>で動作します。
        これは、入力が標準的な行指向編集機能を提供するように処理され、
        入力自体を行単位の処理で表現するモードです。</para>

      <para>スクリーンエディタや、他のコンピュータと通信をするプログラム
        (訳注: telnet など) は、普通<emphasis>非カノニカルモード</emphasis>
        (<emphasis>raw モード</emphasis><emphasis>キャラクタごとのモード
          (character-at-a-time mode)</emphasis>
        などとも呼ばれます) で動作します。
        これらのモードでは、入力はそのまますぐに読み込み側の
        プロセスへと渡されます。
        すべての特殊文字入力の処理は無効化されていて、
        削除やその他の行編集処理は行なわれず、
        すべての文字はその端末から読み込もうとしているプロセスへと渡されます。</para>

      <para>端末は、この二つの両極端のモードの中間の多くの組み合わせで
        設定することが可能です。
        たとえば、あるスクリーンエディタがユーザからの割り込みを非同期的に
        受け入れたい場合に、シグナルを生成する文字や出力の流量制御を許可したまま、
        それ以外を非カノニカルモードで動かして、これらの文字以外の文字を
        まったく解釈しないまま渡す、ということが可能です。</para>

      <para>出力では、端末処理は次のような単純な整形サービスを提供しています。</para>

      <itemizedlist>
	<listitem>
	  <para>ラインフィードをキャリッジリターンとラインフィードの並びへと変換</para>
	</listitem>

	<listitem>
	  <para>特定の標準的な制御文字の後にディレイを挿入</para>
	</listitem>

	<listitem>
	  <para>タブ文字の展開</para>
	</listitem>

	<listitem>
	  <para>
            エコーされた非表示アスキー文字を ``^C'' (すなわち、アスキーのキャレット文字
            の後に、そのキャラクタの値をアスキーの ``@'' 文字からのオフセットとした
            アスキー文字) という二文字の並びとして表示</para>
	</listitem>
      </itemizedlist>

      <para>これらの整形機能は、コントロールリクエストを使ってそれぞれ独立に
        無効化することが可能です。</para>
    </sect1>

    <sect1 id="overview-ipc">
      <title>プロセス間通信 (IPC)</title>

      <para>4.4BSD のプロセス間通信 (IPC) は、<emphasis>コミュニケーション
	ドメイン</emphasis>内で働くようになっています。現在サポートされて
	いるドメインには、同じマシン上で実行している複数のプロセス間
	での通信用の<emphasis>ローカルドメイン</emphasis>、
	TCP/IP プロトコルスイート用の (おそらく the Internet 内)
	<emphasis>インターネットドメイン</emphasis>、
	ISO/OSI プロトコルファミリでの通信を行なうことが必要なサイト間通信用の ISO/OSI
	プロトコルファミリ、
	XEROX Network Systems (XNS) を使用したプロセス間通信用の
	<emphasis>XNS ドメイン</emphasis>が含まれています。</para>

      <para>ドメイン内では、<emphasis>ソケット</emphasis>として知られ
	ている通信終端間で通信が行なわれます。
	2.6 節で説明しているように、
	<emphasis>socket</emphasis>
	システムコールはソケットを生成し、その記述子を返します。
	他の IPC システムコールについては 11 章で解説します。
	各ソケットは、通信セマンティクスを定義した型を持ちます。
	このセマンティクスには信頼性、順序、メッセージの重複防止が
	含まれています。</para>

      <para>各ソケットは、<emphasis>通信プロトコル</emphasis>
	と関連しています。
	ここでのプロトコルは、通信相手のソケットの型に従って
	そのソケットで要求されているセマンティクスを提供します。
	アプリケーションは、ソケットを生成する際に特定のプロトコルを
	要求することができますし、また、そのシステムは、将来生成される
	ソケットの型にふさわしいプロトコルを選択するようにすることも
	可能です。</para>

      <para>ソケットは、そのソケットと関連づけされた (バインドされた)
	アドレスを持つことができます。
	ソケットアドレスの形式と意味は、そのソケットが生成された
	コミュニケーションドメインに依存します。
	ローカルドメインにおいてソケットに名前をバインドすると、
	そのファイルシステムにおいてファイルが生成されます。</para>

      <para>ソケットを通じて送受信される通常のデータは型づけされていません。
	データ表現については、プロセス間通信機能の最上位に位置するライブラリに責任があります。
	通常データの配送に加えて、コミュニケーションドメインは
	<emphasis>access rights</emphasis> という特別な型のデータの
	送受信をサポートすることができます。
	たとえばローカルドメインはプロセス間で記述子を渡すために、
	この機能を使用します。</para>

      <para>4.2BSD より前の UNIX におけるネットワーク機能の実装は、
	大抵キャラクタデバイスインタフェースをオーバロードさせることで
	動作していました。
	ソケットインタフェースの目的の一つは、単純なプログラムが
	ストリーム型の通信を変更せずに動作するようにすることです。
	そのようなプログラムは、<emphasis>read</emphasis><emphasis>write</emphasis> のシステムコールが変更されなければ
	動作します。
	当然、元のインタフェースがそのまま残されれば、
	ストリーム型のソケット上で動作し続けるようになります。
	<emphasis>send</emphasis> の各呼び出しで指定しなければならない
	送信先アドレスを持つデータグラムを送信するような、
	より複雑なソケット用に新しいインタフェースが追加されました。</para>

      <para>もう一つの利点は、この新しいインタフェースは移植性が
	非常に良いということです。
	バークレーから入手できたテストリリースのすぐ後で、
	ソケットインタフェースは UNIX ベンダによって System III
	に移植されました (しかし、AT&amp;T は System V Release 4
	のリリースまでソケットインタフェースをサポートせず、
	その代わりに Eighth Edition のストリーム機構を使用する
	ことを決めました)。
	ソケットインタフェースはまた、Excelan 社や Interlan 社のような
	ベンダによって多くのイーサネットカードで動作するように移植され、
	マシンが小さすぎてメインプロセッサ中でネットワーク通信を動作
	させることができない PC 市場に売り出されました。
	ごく最近では、Microsoft 社の Windows 用の Winsock
	ネットワークインタフェースの基盤として
	ソケットインタフェースが使われています。</para>
    </sect1>

    <sect1 id="overview-network-communication">
      <title>ネットワーク通信</title>

      <para><emphasis>ソケット</emphasis> IPC 機構が対応している
	ネットワークドメインのいくつかは、
        ネットワークプロトコルへのアクセスを提供しています。
	これらのプロトコルは理論上、
        カーネルのソケットソフトウェアよりも下の層にある
        別のソフトウェアとして実装されています。
	カーネルは、バッファ管理、メッセージ配送、
	各プロトコルへの汎用インタフェースを提供し、
        また、さまざまなネットワークプロトコルを使用するための
        ネットワークインタフェースドライバへのインタフェースなど、
        多くの付随サービスを提供します。</para>

      <para>4.2BSD が実装された時点ではさまざまなネットワークプロトコルが
        使用され、また開発中の段階にありました。
        それらはそれぞれ固有の強みと弱みを持っており、
	明らかに優れたプロトコルやプロトコルスイートというものは存在しませんでした。
        4.2BSD は複数のプロトコルに対応することで、
	バークレー校の環境で利用可能だったさまざまなマシン間での
        資源の共有や、相互運用の提供を可能にしていました。
        またこの複数プロトコルへの対応は、
        将来的な変更に備えて設計されていました。
        今日利用されている 10-100Mbps のイーサネット用のプロトコルは、
        将来の 1-10Gbps 光ファイバネットワークに対して、
        おそらく十分なものではないでしょう。
        そのため、ネットワーク通信レイヤは複数のプロトコルに対応できるように
        設計されています。
        新しいプロトコルがカーネルに追加されても、
        既存のプロトコルがその影響を受けることはまったくありません。
        新しいアプリケーションは新しいネットワークプロトコルで動作し、
        一方で既存のアプリケーションもまた、
        それと同じ物理ネットワーク上で今までどおりのプロトコルを
        利用し続けることが可能です。</para>
    </sect1>

    <sect1 id="overview-network-implementation">
      <title>ネットワーク実装</title>

      <para>4.2BSD で実装された最初のプロトコルスイートは
        DARPA の Transmission Control Protocol/Internet Protocol (TCP/IP) でした。
        CSRG は、ソケット IPC フレームワークに組み込む最初のネットワークとして
        TCP/IP を選択しました。その理由は、4.1BSD ベースの実装が
        DARPA がスポンサーとなっていた Bolt、Beranek、Newman (BBN)
        におけるプロジェクトからパブリックに入手可能だったからです。
        それは大きな選択でした。
        このプロトコルスイートが非常に広く利用されたのは、
        主に 4.2BSD でのこの実装が理由となっています。
        TCP/IP の実装に対するその後の性能と能力の改善も広く採用されました。
        TCP/IP の実装については、13 章で詳細に解説しています。</para>

      <para>4.3BSD のリリースでは、メリーランド大学とコーネル大学で部分的に
        開発された Xerox Network Systems (XNS) プロトコルスイートが追加されました。
        このプロトコルスイートは、TCP/IP を使用して通信できない孤立したマシンと
        通信するのに必要でした。</para>

      <para>4.4BSD のリリースでは、近頃米国内外で増加している
        ISO プロトコルスイートが追加されました。
        ISO プロトコル群のために多少異なるセマンティクスを定義したので、
        これらのセマンティクスに適合させるため
        ソケットインタフェースにいくつかの小さな変更が必要となりました。
        その変更は、
        他の既存プロトコルのクライアントには分からないようになされています。
        ISO プロトコル群用に 4.3BSD カーネルで提供された
        2 レベルルーティングテーブルに対する大規模な追加も必要でした。
        4.4BSD で大きく拡張されたルーティング機能は、
        可変長アドレスと
        ネットワークマスクを持つ任意のレベルのルーティングが含まれています。</para>
    </sect1>

  <sect1 id="overview-operation">
      <title>システム運用</title>

      <para>ブートストラップ機構はシステムを起動するために利用されます。
        まず最初に、4.4BSD カーネルは CPU のメインメモリに読み込まれます。
        カーネルが読み込まれると、
        特定の状態へハードウェアを設定する初期化フェーズに移行します。
        次に、カーネルは自動設定 (autoconfiguration) を行ないます。
        これは CPU に接続された周辺機器の検出と設定を行なう過程です。
        システムは最初、ディスクチェック、アカウント処理、
        quota チェックを行なうスタートアップスクリプトを
        シングルユーザモードで実行します。
        スタートアップスクリプトは最後に一般的に利用されるシステムサービス群を起動し、
        システムを完全なマルチユーザモードに移行させます。</para>

      <para>マルチユーザモードでは、プロセスが
        ユーザがアクセスできるように設定された端末回線や
        ネットワークポート上でのログイン要求を待ちます。
        ログイン要求が検出されるとログインプロセスが生成され、
        ユーザの確認処理が行われます。
        そしてユーザの確認処理が成功すると、
        そのユーザに対して、
        他のプロセスを実行できるようにするためのログインシェルが生成されます。</para>
    </sect1>

    <bibliography id="references">
      <title>参考文献</title>

      <biblioentry id="biblio-accetta">
        <abbrev>Accetta et al, 1986</abbrev>

        <biblioset relation="article">
          <title>Mach: A New Kernel Foundation for UNIX Development"</title>

          <authorgroup>
            <author>
              <firstname>M.</firstname>
              <surname>Accetta</surname>
            </author>
            <author>
              <firstname>R.</firstname>
              <surname>Baron</surname>
            </author>
            <author>
              <firstname>W.</firstname>
              <surname>Bolosky</surname>
            </author>
            <author>
              <firstname>D.</firstname>
              <surname>Golub</surname>
            </author>
            <author>
              <firstname>R.</firstname>
              <surname>Rashid</surname>
            </author>
            <author>
              <firstname>A.</firstname>
              <surname>Tevanian</surname>
            </author>
            <author>
              <firstname>M.</firstname>
              <surname>Young</surname>
            </author>
          </authorgroup>

          <pagenums>93-113</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>USENIX Association Conference Proceedings</title>
          <publishername>USENIX Association</publishername>
          <pubdate>June 1986</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-cheriton">
        <abbrev>Cheriton, 1988</abbrev>

        <biblioset relation="article">
          <title>The V Distributed System</title>

          <author>
            <firstname>D. R.</firstname>
            <surname>Cheriton</surname>
          </author>

          <pagenums>314-333</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>Comm ACM, 31, 3</title>

          <pubdate>March 1988</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-ewens">
        <abbrev>Ewens et al, 1985</abbrev>

        <biblioset relation="article">
          <title>Tunis: A Distributed Multiprocessor Operating System</title>

          <authorgroup>
            <author>
              <firstname>P.</firstname>
              <surname>Ewens</surname>
            </author>

            <author>
              <firstname>D. R.</firstname>
              <surname>Blythe</surname>
            </author>

            <author>
              <firstname>M.</firstname>
              <surname>Funkenhauser</surname>
            </author>

            <author>
              <firstname>R. C.</firstname>
              <surname>Holt</surname>
            </author>
          </authorgroup>

          <pagenums>247-254</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>USENIX Assocation Conference Proceedings</title>
          <publishername>USENIX Association</publishername>
          <pubdate>June 1985</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-gingell">
        <abbrev>Gingell et al, 1987</abbrev>

        <biblioset relation="article">
          <title>Virtual Memory Architecture in SunOS</title>

          <authorgroup>
            <author>
              <firstname>R.</firstname>
              <surname>Gingell</surname>
            </author>

            <author>
              <firstname>J.</firstname>
              <surname>Moran</surname>
            </author>

            <author>
              <firstname>W.</firstname>
              <surname>Shannon</surname>
            </author>
          </authorgroup>

          <pagenums>81-94</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>USENIX Association Conference Proceedings</title>
          <publishername>USENIX Association</publishername>
          <pubdate>June 1987</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-kernighan">
        <abbrev>Kernighan &amp; Pike, 1984</abbrev>

        <title>The UNIX Programming Environment</title>

        <authorgroup>
          <author>
            <firstname>B. W.</firstname>
            <surname>Kernighan</surname>
          </author>

          <author>
            <firstname>R.</firstname>
            <surname>Pike</surname>
          </author>
        </authorgroup>

        <publisher>
          <publishername>Prentice-Hall</publishername>
          <address>
            <city>Englewood Cliffs</city>
            <state>NJ</state>
          </address>
        </publisher>

        <pubdate>1984</pubdate>
      </biblioentry>

      <biblioentry id="biblio-macklem">
        <abbrev>Macklem, 1994</abbrev>

        <biblioset relation="chapter">
          <title>The 4.4BSD NFS Implementation</title>

          <author>
            <firstname>R.</firstname>
            <surname>Macklem</surname>
          </author>

          <pagenums>6:1-14</pagenums>
        </biblioset>

        <biblioset relation="book">
          <title>4.4BSD System Manager's Manual</title>

          <publisher>
            <publishername>O'Reilly &amp; Associates, Inc.</publishername>
            <address>
              <city>Sebastopol</city>
              <state>CA</state>
            </address>
          </publisher>

          <pubdate>1994</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-mckusick-2">
        <abbrev>McKusick &amp; Karels, 1988</abbrev>

        <biblioset relation="article">
          <title>Design of a General Purpose Memory Allocator for the 4.3BSD
            UNIX Kernel</title>

          <authorgroup>
            <author>
              <firstname>M. K.</firstname>
              <surname>McKusick</surname>
            </author>

            <author>
              <firstname>M. J.</firstname>
              <surname>Karels</surname>
            </author>
          </authorgroup>

          <pagenums>295-304</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>USENIX Assocation Conference Proceedings</title>
          <publishername>USENIX Assocation</publishername>
          <pubdate>June 1998</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-mckusick-1">
        <abbrev>McKusick et al, 1994</abbrev>

        <biblioset relation="manual">
          <title>Berkeley Software Architecture Manual, 4.4BSD Edition</title>

          <authorgroup>
            <author>
              <firstname>M. K.</firstname>
              <surname>McKusick</surname>
            </author>

            <author>
              <firstname>M. J.</firstname>
              <surname>Karels</surname>
            </author>

            <author>
              <firstname>S. J.</firstname>
              <surname>Leffler</surname>
            </author>

            <author>
              <firstname>W. N.</firstname>
              <surname>Joy</surname>
            </author>

            <author>
              <firstname>R. S.</firstname>
              <surname>Faber</surname>
            </author>
          </authorgroup>

          <pagenums>5:1-42</pagenums>
        </biblioset>

        <biblioset relation="book">
          <title>4.4BSD Programmer's Supplementary Documents</title>

          <publisher>
            <publishername>O'Reilly &amp; Associates, Inc.</publishername>
            <address>
              <city>Sebastopol</city>
              <state>CA</state>
            </address>
          </publisher>

          <pubdate>1994</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-ritchie">
        <abbrev>Ritchie, 1988</abbrev>

        <title>Early Kernel Design</title>
        <subtitle>private communication</subtitle>

        <author>
          <firstname>D. M.</firstname>
          <surname>Ritchie</surname>
        </author>

        <pubdate>March 1988</pubdate>
      </biblioentry>

      <biblioentry id="biblio-rosenblum">
        <abbrev>Rosenblum &amp; Ousterhout, 1992</abbrev>

        <biblioset relation="article">
          <title>The Design and Implementation of a Log-Structured File
            System</title>

          <authorgroup>
            <author>
              <firstname>M.</firstname>
              <surname>Rosenblum</surname>
            </author>

            <author>
              <firstname>K.</firstname>
              <surname>Ousterhout</surname>
            </author>
          </authorgroup>

          <pagenums>26-52</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>ACM Transactions on Computer Systems, 10, 1</title>

          <publishername>Association for Computing Machinery</publishername>
          <pubdate>February 1992</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-rozier">
        <abbrev>Rozier et al, 1988</abbrev>

        <biblioset relation="article">
          <title>Chorus Distributed Operating Systems</title>

          <authorgroup>
            <author>
              <firstname>M.</firstname>
              <surname>Rozier</surname>
            </author>

            <author>
              <firstname>V.</firstname>
              <surname>Abrossimov</surname>
            </author>

            <author>
              <firstname>F.</firstname>
              <surname>Armand</surname>
            </author>

            <author>
              <firstname>I.</firstname>
              <surname>Boule</surname>
            </author>

            <author>
              <firstname>M.</firstname>
              <surname>Gien</surname>
            </author>

            <author>
              <firstname>M.</firstname>
              <surname>Guillemont</surname>
            </author>

            <author>
              <firstname>F.</firstname>
              <surname>Herrmann</surname>
            </author>

            <author>
              <firstname>C.</firstname>
              <surname>Kaiser</surname>
            </author>

            <author>
              <firstname>S.</firstname>
              <surname>Langlois</surname>
            </author>

            <author>
              <firstname>P.</firstname>
              <surname>Leonard</surname>
            </author>

            <author>
              <firstname>W.</firstname>
              <surname>Neuhauser</surname>
            </author>
          </authorgroup>

          <pagenums>305-370</pagenums>
        </biblioset>

        <biblioset relation="journal">
          <title>USENIX Computing Systems, 1, 4</title>
          <pubdate>Fall 1988</pubdate>
        </biblioset>
      </biblioentry>

      <biblioentry id="biblio-tevanian">
        <abbrev>Tevanian, 1987</abbrev>

        <title>Architecture-Independent Virtual Memory Management for Parallel
          and Distributed Environments: The Mach Approach</title>
        <subtitle>Technical Report CMU-CS-88-106,</subtitle>

        <author>
          <firstname>A.</firstname>
          <surname>Tevanian</surname>
        </author>

        <publisher>
          <publishername>Department of Computer Science, Carnegie-Mellon
            University</publishername>

          <address>
            <city>Pittsburgh</city>
            <state>PA</state>
          </address>
        </publisher>

        <pubdate>December 1987</pubdate>
      </biblioentry>
    </bibliography>
  </chapter>

  <appendix id="jacknowledgement">
    <title>日本語化について</title>

    <para><citetitle>The Design and Implementation of 4.4BSD Operating System</citetitle>
      Chapter 2 の日本語化は、原著の出版元である Addison-Weslay、
      翻訳出版権を保有する Pearson Education Japan の協力を得て、
      FreeBSD 日本語ドキュメンテーションプロジェクト (FreeBSD doc-jp)
      によって行なわれました。
      日本語版について何かお気付きの点がありましたら
      日本語ドキュメンテーションプロジェクト
      <email>doc-jp@jp.FreeBSD.org</email> までご連絡ください。</para>

    <para>この日本語版の著作権は、原著者、原著の出版元である
      Addison-Weslay および日本語版の翻訳出版権を保有する
      Pearson Education Japan に帰属します。そのため、
      この文書をこれらの著作権保有者の明示的な許可なく複製、
      再配布することは禁止されています。</para>

    <para>200155 日にスタートした日本語化作業には、
      さまざまな方々が翻訳に参加されました。
      FreeBSD doc-jp では、FreeBSD
      関連文書の日本語版を作成する作業を精力的に続けています。
      この作業に協力したいと思われる方は、
      ぜひ<ulink url="http://www.jp.FreeBSD.org/doc-jp/">FreeBSD
        日本語ドキュメンテーションプロジェクトのページ</ulink>をご覧の上
      doc-jp へご参加ください。</para>

    <sect1>
      <title>翻訳者</title>

      <itemizedlist>
        <listitem>
          <para>杉村 貴士 <email>sugimura@jp.FreeBSD.org</email>
            (2.1, 2.2 節)</para>
        </listitem>

        <listitem>
          <para>IKENO Naoki <email>nao@mc.kcom.ne.jp</email>
            (2.3 節)</para>
        </listitem>

        <listitem>
          <para>田畑 喜晃 <email>ytabata@tkf.att.ne.jp</email>
            (2.4 節)</para>
        </listitem>

        <listitem>
          <para>Atsuto <email>atsuto@guitar.interq.or.jp</email>
            (2.5 節)</para>
        </listitem>

        <listitem>
          <para>はらだきろう <email>kiroh@jp.FreeBSD.org</email>
            (2.6, 2.7 節)</para>
        </listitem>

        <listitem>
          <para>高田 知樹 <email>tomoki@leergirls.org</email>
            (2.8 節)</para>
        </listitem>

        <listitem>
          <para>倉品 英行 <email>rushani@bl.mmtr.or.jp</email>
            (2.9 節)</para>
        </listitem>

        <listitem>
          <para>塩崎 拓也 <email>tshiozak@FreeBSD.org</email>
            (2.10 節)</para>
        </listitem>

        <listitem>
          <para>こが よういちろう <email>y-koga@jp.FreeBSD.org</email>
            (2.11, 2.13 節)</para>
        </listitem>

        <listitem>
          <para>森 直之 <email>mori@jp.FreeBSD.org</email>
            (2.12 節)</para>
        </listitem>

        <listitem>
          <para>坂井 順行 <email>sakai@lac.co.jp</email>
            (2.14 節)</para>
        </listitem>

        <listitem>
          <para>内川 喜章 <email>yoshiaki@kt.rim.or.jp</email>
            (査読)</para>
        </listitem>

        <listitem>
          <para>日野 浩志 <email>hino@ccm.cl.nec.co.jp</email>
            (査読)</para>
        </listitem>

        <listitem>
          <para>山口 雅信 <email>yamagu-m@titan.ocn.ne.jp</email>
            (翻訳提供)</para>
        </listitem>
      </itemizedlist>
    </sect1>
  </appendix>
</book>