Skip to content

Plan 9のnsecシステムコールはkreadにすべきだった

9fansに投稿されたRussのスレッドを読んで。

nsec(2) はもともと #c/bintimeopen(2) したままにする必要を解消し、標準ファイルディスクリプタを誤って使用する問題を解決するために導入された。後者の話は分からないが、確かに全てのプログラムで #c/bintime を開いたままにするのは無駄が大きいなとは思った。

このスレッドによると、時刻だけではなく最近はランダムな数も高い頻度で必要となるので、pread(2)pwrite(2) のように動作する、ただしカーネル内で常に開かれている関数を追加するといいんじゃないかと提案されていた。

long kread(int kfd, void *data, long n, long off);
long kwrite(int kfd, void *data, long n, long off);

kfd は常に開かれているカーネル内部のファイルディスクリプタで、以下の意味を持つ。

  • 0#c/bintime
  • 1#c/random

Ronからも、#c/bintime を読み書きするIOオーバーヘッドはハイパフォーマンス領域に近づくにつれて無視できなくなるとコメントがあった。Ronは別のアプローチを取ったようだが、ここで重要なのはファイルディスクリプタを開いたままにしたくないところだろう。

いい話だと思ったけど、結局この案は破棄されて、Goでは #c/bintime を読むようになった。