パスワードを忘れた? アカウント作成
14625 story

NetBSDにおけるthread機構の方向転換か? 15

ストーリー by mhatta
なかなかおもしろい 部門より

TonboDama 曰く、

NetBSDのthread機構はSA(scheduler activation)というものを実装しM:Nの形にする方針で進んできました(2003.7に行なわれた日本NetBSDユーザーグループBoFでも紹介されています)。
現状では複数のthreadが同時に動く事はできるが、同一プロセスのthreadは同一CPUでしか実行できないという状態(実装)でした。

ここに来て、開発版に新しいthread機構(newlock2)が統合されました。 説明によると、(超ざっくりですが)とりあえず複数のCPUで動く1:1形を入れるよ という事のようです。
-currentにマージした時のメールはこちら

ことの顛末に詳しい方やthreadの実装に興味のある方、NetBSD一般ユーザの方の感想を教えて下さい。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by shojin (28072) on 2007年02月13日 19時32分 (#1109450) 日記
    FreeBSDはKSEでM:Nも1:1も実装されていますね。
    BSD/OSはFreeBSDにカーネルレベルスレッドを実装するときに参考にされたので多分同じでしょう。
    DragonFly BSDはLWKT [dragonflybsd.org]を読む限りだとM:Nモデルのようですね。
    NetBSDではこの記事で1:1がサポートされたらしいのでM:Nと1:1ですね。
    OpenBSDは情報を見つけられなかったのですが、1:Nだと思います。
    • <a href="http://en.wikipedia.org/wiki/DragonFly_BSD#Threading_and_messaging">Wikipediaの記事</a>によると、現状はFreeBSD 4.x以前にあるような素朴なユーザーランドスレッド(1:Nスレッド)しか実装されていないようです。MattさんとしてはM:Nスレッドを実装したいようですが、今後リリースされる2.0では1:1スレッドの実装になるだろうとの事でした。
      ...FreeBSDでM:Nスレッドが使えるようになったのも5.3Rからで、5.0R〜5.2Rはずっと1:1だったのでそういう流れで実装していくんでしょうかね。

      余談ですが、FreeBSDでのスレッド実装であるKSEのマニュアルにはこんなことが書いてあります。
      参考までに。
      | ユーザスレッディング
      | + 軽量
      | + ユーザ制御スケジューリング
      | - システムコールのラッピング必須
      | - マルチ CPU の有効活用不可
      |
      | カーネルスレッディング
      | - 重量
      | - カーネル制御スケジューリング
      | + システムコールのラッピング不要
      | + マルチ CPU の有効活用可能

      親コメント
  • この道はいつか来た道 (スコア:3, すばらしい洞察)

    by Anonymous Coward on 2007年02月13日 18時18分 (#1109400)
    かつてSolarisが辿った道のような気が。

    # SolarisはMT周りには一日の長があると思う。
  • SAの失敗 (スコア:2, 興味深い)

    by Anonymous Coward on 2007年02月13日 20時53分 (#1109501)
    結局複雑すぎて、マンパワーに欠けるNetBSD Projectの手に終えなかったのでしょう。スレッドのスケジューリングをユーザーランドでやるために、コンテキストスイッチやI/O待ちなど、あらゆる状態変化をupcall(system callとは逆にカーネルがユーザーランドを呼び出す)で伝えよう、ということなんですが、たとえばそこで呼び出される先のコードがページアウトされた、という状態変化のときはどうするの? とかいうことを考えただけでもうどうしたらいいのか凡人のおいらにはサッパリです(FreeBSDのKSEではあっさり無視してるみたいですが)。

    SPARCではまともに動いたためしがない、とかも聞いてます。レジスタウィンドウの扱いが難しいんですかね。

    一応擁護しておきますと、i386とかでは(SMP構成でもマルチスレッドな1プロセスに対し1CPUしか与えられないという制限さえ我慢すれば)普通に動いてはいました。

    あと、newlock2は、新しいカーネル内資源排他機構であって、スレッドとは直接関係しません。SAの部分をnewlock2に移行するのがめんどう、とかそんな理由らしい。
    • Re:SAの失敗 (スコア:2, 興味深い)

      by Anonymous Coward on 2007年02月13日 21時50分 (#1109523)
      ページアウトのときはプロセスの状態は変わらないからupcallなしかな。呼ぼうとしたらページアウトされていた→ページインでI/O待ち、すなわち状態変化、というところで、少なくともI/O待ちに入った、I/Oが完了した、という2つのイヴェントが発生するけどどうするべ、とか、そもそもページインのためのI/Oが終わらないとこれらのupcallが呼べないわけですが、I/Oが完了してからI/O待ちに入った、というイヴェント送られてもねえ、とかそんな感じ。最近は追いかけてないので4.0でどうなってるかは誰かに教えてもらおう。
      親コメント
    • by Anonymous Coward
      > 一応擁護しておきますと、i386とかでは(SMP構成でもマルチスレッドな1プロセスに対し1CPUしか与えられないという制限さえ我慢すれば)普通に動いてはいました。

      昔ちょっとテストしたところでは、環境変数PTHREAD_CONCURRENCYにCPU数をセットしておけば、1プロセス内のスレッドに複数CPU割り当てられて動いていたように記憶しています。(i386でですが。)
      PTHREAD_CONCURRENCYをセットしてないと1CPUしか割り当てられないようになってたので、そう思い込んでいた人も多かったのかもしれません。
  • 一方 (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2007年02月13日 19時14分 (#1109434)
    OpenBSDにおけるTheoの実装方式 って読んじゃったよ
  • by mani (26710) on 2007年02月13日 20時07分 (#1109476)
    やっと、そうなってくれましたかぁ。。。 マックテンとかにも、一筋の光が見えたような気がしますな。 まあ、低脳(根本)なハードがマルチ・スレッド化とか騒いでる時代(DECがポシャッタ世代ならわかりますが...)だし、流れ的には良いかと。。。
typodupeerror

犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー

読み込み中...