Re: realtime GC (Re: GC Re: LISPを...)
新城です。こんにちは。
In article <m3sm9qr1d1.fsf@nospam.maedapc.cc.tsukuba.ac.jp>
MAEDA Atusi <maeda-news@ialab.is.tsukuba.ac.jp> writes:
> Cでも、同じプロセスでページフォルトとかディスクI/Oとかが起きちゃったら、
> リアルタイム性はなくなっちゃいますよね。1つのプロセスにunboundな部分と
> boundな部分を混ぜて書くのは無理でしょう?
C 言語というか、OS の機能になりますが、1つのプロセスでペー
ジ・フォールト起さないようにすることは、できます。Unix 系で
は、mlock()。C では、malloc() して、その番地付近を mlock()
するか、malloc() は使わないで /dev/zero を mmap() してとった
領域を mlock() するかでしょうか。
ディスクI/Oについても、ファイルのディスク・ブロックを並べ
替えたりするようなOSはあります。そうするとシーク時間とか回
転待ち時間まで計算すると上限がわかります。このあたり、言語の
問題ではないのですが。
C で、mlock() を使うに相当するのは、Lisp で cons する時に、
ページングされない領域にセルを取る、では足りないんですよね。
> じゃあ、なぜリアルタイムGCを持っている処理系がないんだと言うことになり
> ますが… それはUnixやWindowsでGCだけリアルタイムにしても無意味だから。
> リアルタイムGCの数%のオーバーヘッドの分だけ損してしまう。
実時間OSではないくせに、けっこう実時間のアプリケーション
(音楽とか動画の再生など)が、そこそこ走ってしまうという話も
あります。その「そこそこ」には涙ぐましい努力があるのでしょう。
本来ならOSがやるようなファイル入出力のバッファの管理を自分
でやるとか。
> # GCを止めたり、特別なアロケータを使ったりしないでOSを書いて見せればデ
> # モンストレーションになりますかね。
トータルのメモリが節約になるということも言えるかも。つまり、
静的に確保すると安全策でついつい多め、長めに確保して実は同時
には使わないという話も多いのかも。人間が考えて「ついつい」を
削除すればいいんですが、それは高度な話なので、自動化できれば
その方がいいでしょう。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735