- repeatedly
- 7024
- 3
- 18
- 0
@methane ほー.てっきりgoしまくるとそれらが勝手にがんがん平行処理されると思ってたんですが,IOが発生するとかchannelでブロックするとか,そういうのがないと基本的にはgoroutineが順番に処理される,という感じなんですかね?
2013-11-17 02:51:59@repeatedly GOMAXPROCS分は並列実行します。切り替えが preemptive じゃなくて協調的。で、切り替えのトリガーがシステムコール待ちやチャンネルとかだけだったのが、1.2からスタック伸びるタイミングも入ったので簡易 preemptive
2013-11-17 02:54:22@repeatedly Go で CGO 使うプログラム書くときは、それを扱う goroutine 分けた方がよさそうですねぇ。その goroutine のスタックだけうにょーん。
2013-11-17 02:55:56@methane ですねぇ.GHCはこの辺勝手にやってくれるっぽいのですが,どうやってるのかは実装読んでみないとわからんですね > https://t.co/pDDxhEw32y
2013-11-17 02:59:58@repeatedly あー、Go って M:N モデルで、GoroutineはNに紐付けた segmented stack 使ってるけど、C呼び出すときは M に紐付かれた (pthread とかがが用意した) スタックでそのC関数呼び出すみたいです。なのでうにょーんしない
2013-11-17 03:03:49@methane おお,確かに書かれてますね.どうやって動作保証するんだと思ったら,runtime·lockOSThread()とかいろいろやってますね.なるほど…
2013-11-17 03:10:41@repeatedly @methane Haskellコードの実行中もOSスレッドのスタックへのポインタがレジスタ(amd64ならrsp)に入っていて、外部関数を呼ぶときに使われます https://t.co/uqRQgdd2YE https://t.co/xavZJ2zfPN
2013-11-17 03:58:44外部呼び出しとレジスタスピルの為だけにrspを使うのって無駄に思えるけどなんでこうなってるんだろう。どうせレジスタは沢山あるから大した問題じゃないのかもしれないけど
2013-11-17 04:04:43