Segmented Stackについて

RustとかGoとかHaskellに関して,ソース読む時ようにとりあえずメモ
11
前へ 1 ・・ 4 5
SKS rep @repeatedly

@methane ほー.てっきりgoしまくるとそれらが勝手にがんがん平行処理されると思ってたんですが,IOが発生するとかchannelでブロックするとか,そういうのがないと基本的にはgoroutineが順番に処理される,という感じなんですかね?

2013-11-17 02:51:59
methane @methane

@repeatedly GOMAXPROCS分は並列実行します。切り替えが preemptive じゃなくて協調的。で、切り替えのトリガーがシステムコール待ちやチャンネルとかだけだったのが、1.2からスタック伸びるタイミングも入ったので簡易 preemptive

2013-11-17 02:54:22
methane @methane

@repeatedly Go で CGO 使うプログラム書くときは、それを扱う goroutine 分けた方がよさそうですねぇ。その goroutine のスタックだけうにょーん。

2013-11-17 02:55:56
SKS rep @repeatedly

@methane ですねぇ.GHCはこの辺勝手にやってくれるっぽいのですが,どうやってるのかは実装読んでみないとわからんですね > https://t.co/pDDxhEw32y

2013-11-17 02:59:58
SKS rep @repeatedly

今時の言語はランタイムが複雑で俺みたいな年寄りにはつらい…

2013-11-17 03:01:38
methane @methane

@repeatedly あー、Go って M:N モデルで、GoroutineはNに紐付けた segmented stack 使ってるけど、C呼び出すときは M に紐付かれた (pthread とかがが用意した) スタックでそのC関数呼び出すみたいです。なのでうにょーんしない

2013-11-17 03:03:49
SKS rep @repeatedly

@methane ほぅ!それってどの辺のコードかとかわかります?

2013-11-17 03:05:50
methane @methane

@repeatedly http://t.co/wZomdNmgpq このファイルの先頭にコメントとして書かれてました。

2013-11-17 03:06:51
SKS rep @repeatedly

@methane おお,確かに書かれてますね.どうやって動作保証するんだと思ったら,runtime·lockOSThread()とかいろいろやってますね.なるほど…

2013-11-17 03:10:41
mkotha @mkotha

@repeatedly @methane Haskellコードの実行中もOSスレッドのスタックへのポインタがレジスタ(amd64ならrsp)に入っていて、外部関数を呼ぶときに使われます https://t.co/uqRQgdd2YE https://t.co/xavZJ2zfPN

2013-11-17 03:58:44
mkotha @mkotha

外部呼び出しとレジスタスピルの為だけにrspを使うのって無駄に思えるけどなんでこうなってるんだろう。どうせレジスタは沢山あるから大した問題じゃないのかもしれないけど

2013-11-17 04:04:43
mkotha @mkotha

いやしかしx86も現役だぞ(とくにwindows)

2013-11-17 04:06:42
前へ 1 ・・ 4 5