Segmented Stackについて

RustとかGoとかHaskellに関して,ソース読む時ようにとりあえずメモ
11
Masanori Ogino @omasanori

Rustがsegmented stackをやめた件 https://t.co/fSibG8zoqA を見逃していたので、別の議論でsegmented stackをやめてないと成り立たない話が展開されて混乱した

2013-11-15 19:28:47
SKS rep @repeatedly

@omasanori 詳細教えてください! > segumented stack周り

2013-11-15 19:29:22
Masanori Ogino @omasanori

@repeatedly SS自体は説明しなくてもいいですよね? ・RustのランタイムがSSを廃止した ・理由はスタックのスイッチコスト、及びそれを最適化することにかかる労力が割に合わないと判断したから ・スタックの割り当てとスイッチは予測不可能な性能低下を起こす

2013-11-15 19:36:13
SKS rep @repeatedly

@omasanori SSってgoroutineとかでも使われてるあの仮想的なスタックなことだよね?そうだとすると,Rustの並行処理はこれに依存していたのでは?

2013-11-15 19:37:08
Masanori Ogino @omasanori

@repeatedly ・SSしてるとFFIの難易度が増す ・LLVMの一部の命令はlibcにリンクするか組み込み命令になるかをLLVMが判断するので上述の理由によりFFIと同様の考慮が必要になる ・上2つの問題を回避するためにスタックの初期サイズを大きくしたらSSの意味がない

2013-11-15 19:39:46
Masanori Ogino @omasanori

@repeatedly そうです。OSやMMUがうまくやってくれることに頼ることにしたようです。x86_64だとSSやってた頃と大差ないだろう、32ビットのアドレス空間だときついかもしれないけどそれは"calculated risk"だ、とのこと。

2013-11-15 19:43:51
SKS rep @repeatedly

@omasanori OSやMMUがうまくやるってのがどこまで現実的かよくわかってないんですが,Rustで並行処理のユニットを一つspawnすると,それはネイティブスレッドが起動する?それとも今まで通りなんか間に一つ挟む?

2013-11-15 19:46:21
Masanori Ogino @omasanori

予測不能な性能低下はGoではhot split problemと呼ばれているらしい。 https://t.co/HESNe52lun

2013-11-15 19:46:42
SKS rep @repeatedly

Rustでポンポン並行処理の単位を生成出来るのはSegmented Stackのおかげだったはずだけど,それをやめるとなると,いわゆるネイティブスレッドでほげほげ,という感じになるんだろうか?Goでもパフォーマンス低下が知られてるようだけど,今は無視出来るほどなのかな…?

2013-11-15 19:47:38
SKS rep @repeatedly

GHCの軽量スレッドは同じような問題抱えてないのかな?実装の問題だろうか? > "[rust-dev] Abandoning segmented stacks in Rust" https://t.co/T65emmLgri

2013-11-15 19:50:12
Masanori Ogino @omasanori

@repeatedly タスクとスレッドの間にはスケジューラがあった(=分離されている)ような。前にあなたが紹介していたあのスレッドでそれもどうしようかという話が挙がっていますが。(M:Nスレッドモデルと1:1スレッドモデルの両方の需要に応えられるようにしたいとか何とか)

2013-11-15 19:52:09
Masanori Ogino @omasanori

Rustできなかった時期にランタイムライブラリがごっそり入れ替わったので正直わからない部分ある

2013-11-15 19:53:17
Masanori Ogino @omasanori

0.8のリリースノート読むところからかな

2013-11-15 19:53:35
Masanori Ogino @omasanori

"Having memory is cheap, accessing it isn't." https://t.co/KLTPAJaqLP

2013-11-15 19:54:22
SKS rep @repeatedly

@omasanori なるほどー.タスクの割り当て先としてのSegmented Stackが消えて,そこは適当に環境に任せる,という感じかー.複数のスレッドモデル対応はなんか面倒そうだ

2013-11-15 19:56:43
Masanori Ogino @omasanori

shelarcy氏が補足してくれるでしょう #他力本願

2013-11-15 19:57:00
SKS rep @repeatedly

実装レベルで理解するにはソース読んだ方が早いか

2013-11-15 19:57:01
SKS rep @repeatedly

"Memory is cheap"を見て,某JVM実装の"Buy more RAM"を思い出した

2013-11-15 19:57:42
Masanori Ogino @omasanori

HaskellのIOスケジューラを改善する"Mio: A High-Performance Multicore IO Manager for GHC"という論文がrust-devで話題になっていたので、多分GHCも何かやってはいるはず

2013-11-15 19:59:15
SKS rep @repeatedly

Erlangもそうなのかな?皆この軽量スレッドなアプローチ取ってて,追求し出すと終わらんな…

2013-11-15 20:00:04
SKS rep @repeatedly

Rust,順調に茨の道に行ってるっぽい

2013-11-15 20:01:13
Masanori Ogino @omasanori

きっと最初から茨の道です。いやでも方針としては既に誰かがやったことある技術の組み合わせだったはず。

2013-11-15 20:03:44
SKS rep @repeatedly

#[fixed_stack_segment] というのが大量にRustのコードから消えてるけど,これがsegmented stackを示すattributeなのか?Task周りのコード読むか…

2013-11-15 20:06:20
1 ・・ 5 次へ
まとめたひと
SKS rep @repeatedly

アレな会社で一般人なイケメンやってます. Software Alchemist. D(Phobos committer), Ruby(1.9), Python(Tornado), Opera, Android, Mac, Emacs, No! SQL, Sports, Red Bull, No つけ麺 No Life!