[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:2812]Portable dumper



Yoshiki Hayashi <yoshiki@xxxxxxxxxx> writes:

> ここしばらく garbage collection の論文ばかり読んでいて、そう
> いう技術を使ったものをまったく実装していなかったので、
> portable dumper を Emacs 上に実装してみようか、と思っていま
> す。

というのを書いてから二ヶ月も経過していますが、ようやく
portable dumper そのものの説明を書いてみました。明らかに最後
の方は息切れしていますが、実際にどのように実装しているかの説
明は code と共に出します。
# 今までで full time に直すと total で 5 日くらい作業してい
# るので、one man week くらいという予想はそんなに外れていな
# かったようです。ただ、まとまった時間を割いて作業にかかるこ
# とがあんまりできないので結構時間がかかっています。

実装状況は code の量としては 9 割程度、完成度は 6 割程度の状
態です。今のところは Linux で Emacs 20.7 に対して実装してい
るのですが、普通に起動して落ちない程度までにはなっています。
Meadow に移植した版はもうすこし後になるでしょう。

Portable dumper とは

Emacs は起動の時間を短縮するために dump をします。
通常の dump は unexec を実行することでそれを行ないます。
unexec は実行中の program の memory image から新たな program の
実行 file を作成します。これは各 platform に非常に依存します。
私は詳細は知りませんが、何をやっているかは src の unuex*.c を
読めばわかります。

Portable dumper は、platform 固有の知識を使うかわりに、
Lisp interpreter としての Emacs の data 構造の知識を使って
起動時間の短縮をはかります。一言で説明すると、一回きりの
serialization, もしくは memory と file 間での Lisp Object の
copying garbage collection のようなものをします。
この方法では、dump の方法は platform には依存しなくなります。

ときどきある誤解に、data も platform 非依存になるというものがあります
が、data は platform に依存します。例えば、64bit architecture で dump 
した data は 32bit architecture では使用できません。Dump の format を
工夫すればできるようになるとは思いますが、そうすることは現時点では考え
ていません。ただ、各 Windows 間では CPU の architecture さえ違わなけれ
ば同じ dump data を共有できるはずなので、binary 配布は便利になるでしょ
う。

原理

Lisp interpreter の object は garbage collection の root object を
root に持つ directed graph になっています。これを、GC と同様の
方法でたどることにより、object を serialize して file に書き出すことが
できます。Load 時には dump 時の逆の操作をすれば Lisp Object の
構造は元に戻ります。Emacs はこれ以外に補助的な data をいくつか
もっているので、dump 時の状態を保持しなければいけないものは dump し、
それ以外のものは load 時に再作成します。

実装

Unexec は実行 file を作成するので、すべての作業は dump 時に行なわれま
す。Portable dumper は data file を作成するので、dump 時と実行時に
作業を行なう必要があります。Global static variable, heap variable, stack
variable の中で、前者二つを dump 時の状態に戻す必要があります。Heap に
あるものはほとんど Lisp_Object なので楽ですが、global varible がなかなか
曲者です。

...  詳しい説明を書こうと思っていたのですが、面倒なので省き
ます。詳細は近々公開する patch を見てください。そのときに簡
単な document を書きます。

-- 
Yoshiki Hayashi