Erlang VM
Erlangの軽量プロセスが軽いというので、ちょっと眺めている。
Erlangは、BEAMという仮想機械で動作する。BEAMのソースコードは、erts/emulator/beam以下にある。コンパイルは、erlcコマンドで、.erlから.beamに変換することにより行う。
さて、軽量プロセスってふと思えば、スレッドのことである。しかし、それでも309ワード(1236バイト)というのはすごい(うちヒープのサイズはデフォルト233ワードらしい)。さらに、ネイティブスレッドではなくグリーンスレッドなので、メモリ消費が少ない。軽量プロセスは、spawnの延長で呼ばれるerl_create_process関数で起動している。やっていることは、メモリを取得して、プロセス構造体を定義して、それをrunq(add2runq)につないで終了となっている。これしか作っていないのだから、プロセスの生成は早くて当然である。軽量プロセスが軽くてすむのは、アクターモデル(メッセージパッシング)なので、メモリ共有等の仕組みは不要になるためである。このためか、1マシンで100万プロセス可能というすごいことになる。
次に、ホットコードスワッピングは、モジュール構造体が、新旧のモジュールを定義出来るようにしているためできる。詳しくは、purge_module関数辺りを参照。もちろん、BEAMのソースコードで、module.hに定義されているモジュール構造体を見ても良い。
あと、メッセージパッシングは、メッセージをヒープ領域にコピーして実現している。
最後に、ErlangのミドルウェアパッケージであるOTP (Online Telecom Platform) を見てみた。振る舞い(behavior)を定義して、簡単に耐障害アプリケーションを書けるライブラリである。このライブラリを使って、RabbitMQサーバ等は書かれている。そんなに便利なら、何故ほかの言語に移植しないのと思ったら、Erlangの特徴を活用しているので難しいらしい。
- ソースコード
- (軽量)プロセス起動コード
- ヒープ周りのサイズ(233ワード, H_DEFAULT_SIZE)
- 起動コード
- BEAM
- ドキュメント
- ドキュメント
- Erlangのバイブル
- Robert Ellen - A Quick Introduction to Erlang and the OTP Libraries - BFPG - 2013-10-29 on Vimeo
- Etsukata blog: Erlang VM(BEAM) スレッド構成
- Etsukata blog: BEAM(Erlang VM) 参考資料まとめ
- What kind of virtual machine is BEAM (the Erlang VM)? - Stack Overflow
- Erlang (programming language) - Wikipedia
- "Look at Erlang, which maps lightweight erlang processes to operating system thr... | Hacker News
- http://internetcom.jp/developer/20091117/26.html
- http://www.erlang-factory.com/upload/presentations/708/HitchhikersTouroftheBEAM.pdf
- Erlangのメッセージパッシングとメモリモデル
- OTPが他言語に移植されないということについて
- その他
- ユースケース
- Javaとのメッセージパッシング
- JavaVMとの比較
- Erlang批評
- なぜErlang/OTPなのか - kuenishi's blog