マルチコアのミニックスが遅い。
前回の記事でマルチコア化してみた、、と書いたミニックスなんだけど、…すごい、遅くて。
どうして遅いのか考えてたんですが、多分こう言うことなんじゃないかと。。(未検証)
- Linuxはモノリシックカーネルだから、システムコールはカーネル内で完結する。
カーネルはCPUに依存せずに処理できるからCPU間の移動は発生しない。 - Minixはマイクロカーネルだからシステムコールは一度サーバープロセスを経由する。
ただしシングルコアであればカーネルのコンテキストスイッチ程度のペナルティ。 - マルチコアであってもMinixはシステムコールはサーバープロセスを経由しなければならない。が、その肝心のサーバープロセスは別のCPUに配置される。したがってシステムコールを実行する際にいちいちCPU間通信が発生する。(しかもサーバーが処理している間ユーザープロセスは何もしてない!!…余計な処理が増えただけ!)
今の設計だと、マルチコアを活かせないどころか無駄にCPU間通信が発生する分遅いわけだ。。。
解決しようと思うとサーバーがユーザープロセスと同じCPU…現実的には全てのCPUにいてくれるのがベストで、それを実現するにはマルチスレッドが有効なはず。
でもMinixはマルチスレッドに対応していないので。。。。。。。。
QNXのリソースマネージャーがスレッドプールを利用している理由もこれでよくわかる。そう言う設計であれば各CPUにスレッドを配置できるもの。
勉強になりました。。
これなんかもう設計が古すぎるんやね。。マルチコアを生かそうと思ったらマルチスレッドが必須だなぁ。32bitだしもう再設計したいなって気になってきました(苦笑)