tarosukeの日記: [RWM] NPTL
今の環境はNPTLが有効なのでpthreadでもLinuxThread使ってくれるはずなのだが、実際に動かしたところではpthreadはコオペレイティブにスケジューリングしていて、プリエンプトはしてくれないように見える。とりあえずRiftの処理をLinuxThreadに書き換えたところ件の「重い処理でドリフトが発生する」という症状は出ないように見える。もっとも、ドリフトはしなくても他の全ての処理が止まってしまうので大きすぎたら分割処理するくらいのことは考えなければなるまい。
--
どうやらNPTLはカーネルスレッドを使ってはいてもプリエンプティブではないようだ。
やはりLinuxThread使うしかないのか。
デバイスファイルへのアクセスしてるだけなのになぜか本体側が不安定になるんだよなぁ...。
--
今のところ排他処理してないから異常データ食う可能性があるけど、そのせいなんだろうか。
しかしだとするとコアダンプの原因がIlligalInstructionなのが解せぬ。
--
書き換え中のデータを読まないように排他制御してみたが症状は変わらず。Riftの制御は完全に別プロセスにしてサーバ化する方がいいやも知れぬ。あるいは読み込むテクスチャが大きい場合は処理を分割してスケジュールさせるとかの手も考えられるが、たとえば動画は基本的に全書き換えなので、これを動画再生中にやると困ったことになりそうなんだよな。
--
結局コケる理由は「cloneすると共有ライブラリを読めなくなる」という謎仕様が原因だった。ld-linux.soって共有ライブラリを読めなくてもそのまま進んじゃうのな。cloneする前に共有ライブラリの何かを呼んでライブラリを読ませるとかいう解法があるらしいがぶっ飛ぶモジュールとcloneするモジュールは別なのでそれはやりにくい。最終的にはたとえ単にpipeしてforkするだけであっても別プロセスにする必要がありそう。
[RWM] NPTL More ログイン