• ベストアンサー

Linuxのマルチコアへのタスク割り当て

Linuxカーネルの、SMP環境でのスケジューリングについて調べています。 ユーザがあるプロセスを起動したとして、そのプロセスはどのようなアルゴリズムで、特定のCPUに割り当てられるのでしょうか??? おそらく、各CPUの負荷を観測して、一番暇なCPUに割り当てる、というものかと思うのですが・・・ もしそのカーネルソースの該当部分などご存知でしたら、その場所も示して頂けると有り難いです。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

OSのスケジューラーはschedという文字列を持つファイルで、kernを含むディレクトリーの中にあったりするので、あて感で見て見ました。 プロセスの起動はfork & execという流れで行われるのはご存知のとおりですが、forkにバランスするような賢いことはしていないようです。 http://lxr.linux.no/#linux+v3.2.1/kernel/sched.c#L2972 その後のexecでは暇なところを選んでいるみたいですね。 http://lxr.linux.no/#linux+v3.2.1/kernel/sched.c#L3778 選び方はこんな感じですね。 基本的なチェックをやって、 http://lxr.linux.no/#linux+v3.2.1/kernel/sched_fair.c#L2389 暇なCPUを探すと。 http://lxr.linux.no/#linux+v3.2.1/kernel/sched_fair.c#L2244 何かの参考になれば。

Mob2011
質問者

お礼

有難うございます!まさにこのような箇所が知りたいところでした。 手元のデュアルコアAndroid端末が、どうも効率よく各CPUにスレッドを割り振っていないように見えたので、原因を調べていました。 これからご指摘のソース周辺を読んで、深堀りしたいと思います。

関連するQ&A

  • linuxマルチコアCPU環境においてコアの使われ方について

    linuxマルチコアCPU環境においてコアの使われ方について マルチコアCPUがLinxu環境において(その他Linuxでないプラットフォームにおいても)、 実際に搭載されているCPUのコア数が正常にOSに認識されているというだけではなく、 各プロセスの処理に対して複数のコアが適宜効果的に利用されているのかどうか?? ということが知りたく、添付画像に私の疑問点をまとめてみました。 ■ポイント ++++++++++++++++++++++++++++++++++++++++++++++++ 投稿した画像の色がついている4つの矢印は1つ1つそれぞれがDB接続クライアントがmysqlに投げているSQL文(クエリ)をイメージしています。 Mysqlを起動させているlinux kernelは、このクエリを受け取り自身が管理しているCPUがマルチコアであった場合、どのようなロジックで複数のコアの中から4つのクエリを処理させるCPUコアを選択しているのでしょうか? 例)kernelが未使用のCPUコアを都度選んで1クエリの処理を担当するよう制御している ⇒コアによって処理する数は異なる 例)kernelが4つのクエリに対して4つのCPUコアをラウンドロビン分散させて処理させている。 ⇒コアが処理する数は均等になる ++++++++++++++++++++++++++++++++++++++++++++++++ どなたか、私の疑問についてご存知でしたらご教授いただけますでしょうか。 よろしくお願します。

  • cpu の制限 redhat linux7.0

    特定のユーザーグループに対して、CPUの利用制限を設定したいのですが、どのような方法があるでしょうか。 具体的には、 一つのプロセスのCPUの負荷が50%を超えると、そのプロセスを強制終了させる、ようにしたいのです。 何かよい方法はないでしょうか。

  • linux kernelの勉強法

    linuxユーザ(Fedoraが中心)になって5年程経つのですが、仕事のためにもLinux kernelを勉強してみようと思っています。そこで、仕事または趣味でLinux kernelを究めた方、または今勉強している方にお聞きしたいのですが、どのようにして勉強しましたか?私はkernelとdevice driverの本を読んでいるのですが、本を読んでいるだけだとなかなか進展がありません。実際にコードを書くプロジェクトみたいなのがあればいいのですが、何から手を付けてよいのか迷っている状況です。 C/C++プログラミング、OS一般、そしてlinuxの基本的な概念(仮想メモリ、ファイルシステム、スケジューリング等)は一応理解しているつもりですが、ソースコードを読んで理解するの苦労しています。 何か経験談とかアドバイスを聞かせて頂ければありがたいです。

  • Debian Linux lenny のカーネルソースはどこにあるので

    Debian Linux lenny のカーネルソースはどこにあるのでしょうか? 以下のようなコマンドを叩いてみたのですが、/usr/src 以下にカーネルソースが展開されないのですが、よかったら、相談に乗ってください。 # uname -a Linux hogehoge 2.6.26-2-686 #1 SMP Wed Nov 4 20:45:37 UTC 2009 i686 GNU/Linux # apt-get build-dep linux-source-2.6.26-2-686 パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 E: linux-source-2.6.26-2-686 のソースパッケージが見つかりません

  • linuxカーネルとlinuxのコマンドについて

    現在、linuxの勉強をしています。 linux上でのある程度の基本的な操作(あくまでも操作でしかないのですが・・・)は理解したと思い、ちょっと前からカーネルのソースでも見てみようか、と思いはじめてみました。 そこでふと疑問に思ったのですが、カーネルにはリソース管理などがメインですよね? コマンドや、シェルなどの環境はどのようにカーネルと関係してくるのかがさっぱりわかりませんでした。 カーネルのソースにそれらのことや、コマンドなどが書いてあるのかな?と思ってgrepしては見たのですが、よくわかりませんでした。 相当初心者な質問でしょうが、ご存知の方教えてください。

  • Debian Linux squeeze

    kernel のコンパイルで、USBプリンタはデフォルトでモジュールが組み込まれているのでしょうか? 僕の環境だと、いくら試しても、USBプリンタに印字できません。 カーネル再構築しか、手段はないかと思われるのですが、僕の勘違いでなければ、USBプリンタをカーネル内でサポートしているのでしょうか? ちなみに、 $ uname -a Linux marine 2.6.32-5-686 #1 SMP Wed Jan 12 04:01:41 UTC 2011 i686 GNU/Linux です。 よろしくお願いします。追加モジュールが、カーネルの再構築なしに、できれば、有難いのですが、どうぞ、よろしくお願いします。

  • Linuxでの10msスリープ

    Linux初心者です。よろしくお願いします。 Cで記述された旧式のRTOSでのプログラム をLinux環境に移植しようとしていて、 Timesys Linuxを購入予定ですがまだ入手で きてないので、Vine Linux 2.6で試運転させて います。 10ms毎の周期起床するタスクを旧記述では カーネルコールのsleep()で起床待ちさせて 起床タイミングはカーネルのスケジューラに 任せていたため、同じように動かそうとタスク をPosixThreadにしてその上でusleep(), nanosleep()等を実行してみたのですが、 待機時間が2ms以下か、20m以上になってしま って上手くスリープしてくれません。 (スケジューリング周期は10msです。) 標準のLinuxで10ms(毎のスケジューリング タイミングまで)待たせる場合はどういう 方法をとるとよいでしょうか?

  • Linuxについて教えてください

    LinuxユーザーのDragonです。 最近、愛用のPearOSを使ってて思った、Linuxについての疑問を教えてください。 その一 Linuxのカーネルのビルド方法を教えてください。 (できたら、カーネルのビルド後、デスクトップ環境 X Window System を導入する方法も 教えてください。) その二 OSのことや、パソコンのことを深く知ることができるサイトや本ってありますか? (おもにOSの分野はLinuxについて沢山知りたいです。) その三 Linuxのことから外れますが、インターネットセキュリティのことが学べる書籍やサイト ってありますか? 中学三年生のアホな僕に知識を恵んでください。 御回答のほど、宜しくお願いします。

  • 非Intel系Linuxドライバ(ppc)の考え方を教えて下さい

    私は古いマッキントッシュの再生を考えてppc版Linuxを検討中です。 そこで壁に当ったのがドライバなのですが、 各種デバイスドライバのダウンロード用ホームページに「for linux」という 選択肢も結構多くのメーカーで用意してくれて大変助かりますが、これらはインテルcpuでしか動かないもの、と考えないといけないんですよね!? なかにはソースコードも持ち帰りサービスしてくれている所があって嬉しいのですが、ppc版ユーザーのみなさんは、こういう場合、各自でソースコードをppc用に手直ししてカーネルの再構築をしてますでしょうか? 自分にはとてもそんな能力ないので、linux挑戦したいけれども、ちょっと考え込んでしまいました。 一般にマックを愛用している方々のことも考えると、あまり面倒な事はせずに利用しているはずにちがいない、と想像してるのですが、マック系ppclinuxユーザーのみなさんの実情ってどんなものでしょうか?

  • LinuxのDMA転送でのメモリ操作について

    Linux初心者です。 ユーザモードで動作しているプロセスからデバイスドライバに対してDMA転送要求を行った場合、ドライバでDMAバッファ用のメモリを確保すると思います。 ドライバはDMA転送用バッファとして、GFP_DMA指定でkmallocし、確保されるメモリ領域はZONE_DMAだと思います。 (PCIデバイスドライバの場合は、上記指定は必須ではないみたいですが。) ここで疑問なのですが、カーネルモードでしかアクセスできないZONE_DMA領域を、ユーザモードのプロセスがどのように扱うのでしょうか? ある本で「ユーザモードで動作中でもシステムコールに関してはCPU内でカーネルモードで動作する」というのを見たことがあるのですが、これによってZONE_DMA領域にアクセスできるようになるということでしょうか? ご存知の方がいたら、よろしくお願いします。 また、そもそも質問内容(前提)の間違えなどありましたらご指摘いただきたいです。