UNIX 4.3BSDの設計と実装 読書会(2)

メモと補足.

補足はこんな形.

2.2 カーネルの構成

  • VAX依存のメモリ管理機構は4.4BSDで捨てられた.Machから持ってきたものを使用.

参考文献[1] のp.155では,「Mach2.0の仮想メモリシステムに基づいたものだが、Mach2.5や、Mach3.0で加えられた修正も組み込まれている。」と記載あり.
ただし,MachシステムコールのI/Fは全く残っておらず,4.2BSDのI/Fに置き換えられている.

  • FreeBSDではさらに実装し直された?

参考文献[2] のp.68では,「4.4BSDの仮想記憶システムの実装を徹底的に最適化したものを使用している」とある.
マルチプロセッサもサポートしているが,初期のFreeBSDは対応していないように思う.

2.3 カーネルサービス

  • 下から4行目.読点は外して読んだほうが読みやすい.

2.4 プロセス管理

  • コルーチンとは?ユーザレベルでのスレッドのようなもの.yield がそれ.

yieldは初見.C#の機能のようだ*1

  • 追記。C#以前からyieldは存在する。GNU Pthなど。(@7shi さん)
  • コルーチンについて *2, *3

2.5 メモリ管理

  • Linuxではデマンドページングによる遅延が発生 → RTシステムでは問題となる.
  • mmap()インタフェースは4.2でも4.3でも導入を見送られた.

2.2節で補足したとおり,4.4BSDでMachベースのメモリ管理システムに置き換えられ,その際にmmap()が導入された.

  • システムコール時にカーネルに情報を渡す方法としてコピーを利用.再写像は使えない.
  • mmap()は導入されているが,カーネルへの情報渡しがコピーである点は同じ.copy on writeは実装されている[2] .
  • カーネル内部のメモリアロケータがゴチャゴチャしてしまっていた→単一のI/Fにすることでスッキリさせた.p.117にこのあたりの歴史の記載あり.

2.6 入出力システム

  • パイプ:4.2BSDより前(lionsなど)はFSで実装,4.2BSD〜はsocketで実装,

FreeBSDは,パイプを実装するのにsocketは使っていない([2]のp.72).

  • FreeBSDは三種類のオブジェクトではなく,四種類のオブジェクトになっている

名前付きパイプが追加されている([2]のp.72).

  • scriptコマンドでdup()を使っている?

FreeBSD9.0のscriptのソースコード(src/usr.bin/script)を眺めた限りは使っていないように見える.

  • sinkをどう訳すのが適切なのか?

「受信側」とか「出口」とかだろうか?

  • readv(),writev()をどのように使用するのか?
  • /proc(つまりprocfs)は無かったのか?

あった.最初の実装は,Version 8 UnixにTom J.Killianが実装したもの.
"Processes as Files"という論文がUSENIXで発表されたようだが現在は公開されていない?
BSD系では4.4BSDで実装されている.4.3BSDでは標準ではなかった?*4
FreeBSDではprocfsではなくsysfsを利用すべきとされており,標準では/procはマウントされていない.*5, *6

2.7 ファイルシステム

  • 空孔とは?

[2] p.80の説明の方が分かりやすい.
「ホールというのは,ファイルの中でデータが一度も書き込まれたことのない連続する空洞領域である.」
「書き込みポインタをファイルの終端よりも先に設定して書き込」んだり,「trancateシステムコールを使ってファイルの長さを伸ば」したりすることで作れる.

  • truncateコマンドはtruncateもextendも可能.
  • 4.2BSDより前はファイル名が14文字に制限されていた.以降は255文字以内.

2.8 機器

  • 現状のFreeBSDではブロックデバイスとキャラクタデバイスを区別していない.
  • FreeBSD勉強会で上記の話があったとのこと.ブロックデバイスという概念は存在しないということであった.

2.9 端末

  • 特になし.

2.10 プロセス間通信

ここではプロセス間通信(IPC)として,ネットワーク通信によった記載がされている.
[2]では,FreeBSDが「セマフォ,メッセージキュー,共有メモリなど」の「ローカルなIPC機構をサポートしている」と記載あり.

PF_UNIXとPF_LOCALは同じ値であり,/usr/include/sys/socket.h で定義されている.

       L.299
       #define	PF_LOCAL	AF_LOCAL
       #define	PF_UNIX		PF_LOCAL	/* backward compatibility */

では,PF_LOCAL(AF_LOCAL)を使うべきかというと,議論もあるため使用する環境を確認すべき.*7*8

2.11 ネットワーク通信

1つのドメイン(protcol family)の中に,複数のプロトコルが存在する.
ドメインの通信はソケット間で行われる.
socket()の引数typeでそのソケットの働き(意味,セマンティクス)を指定することになっている.
さらにこのtypeで利用できるプロトコルを引数protocolで指定する.
しかし,通常はtypeで一意にprotocolが決まってしまうため,protocolは指定しない.

  • socket()の呼び出し規約は次のとおり.
     socket(int domain, int type, int protocol);
  • domainとtypeとprotocolで指定する値はそれぞれ何か? → manに記載あり。

2.12 ネットワーク実装

  • 特になし.

2.13 システム操作

  • 課金とは? → p.64に記載あり.課金用の統計情報を集めている.実際の請求は別途運用次第.

参考文献

[1] Marshall Kirk McKusick他 著,砂原 秀樹 監訳,七丈 直弘 訳,「4.4BSDの設計と実装」,アスキー,2003.
[2] Marshall Kirk McKusick他 著,砂原 秀樹 監訳,歌代 和正 訳,「BSDカーネルの設計と実装−FreeBSD詳解−」,アスキー,2005.