UNIXプログラムをスレッドとして動作さ せるProcThreadライブラリの設計と実現 機構 安倍広多 松浦敏雄 安本慶一 東野輝夫 99/08/02 大阪市立大学 滋賀大学 大阪大学 SWoPP'99 1 マルチスレッド 複数のスレッドが同一プロセス中に存在 プロセス間通信、プロセス間コンテクストス イッチを省略できる 実行効率が高い 99/08/02 SWoPP'99 2 マルチスレッドの問題点(1/2) 1. マルチスレッドを考慮したコーディングが必要 – スレッドセーフ • 排他制御、静的な領域へのポインタの排除、etc. – 既存の単一スレッド用コード(Legacyコード)を マルチスレッドで使うには修正が必要 – 標準のライブラリ関数がスレッドセーフかどう かはOSによって異なる – 既存の単一スレッドプログラムに新たにスレッ ドを付け加えることも困難 99/08/02 SWoPP'99 3 マルチスレッドの問題点(2/2) 2. 特定のスレッドを別のプログラムで再利用 することが困難 – スレッド間の密接な同期、相互排除 3. 共有データに簡単にアクセスできるので、 排他制御を徹底させるのが難しい – 再現性が低く、発見が困難なバグ 4. デバッグが困難 99/08/02 SWoPP'99 4 本研究の目標 Legacyコードをマルチスレッドで利用できる – 既存のLegacyコードを含んだライブラリ – 既存の単一スレッドのプログラムそのもの スレッドの再利用性を高める 共有データへのアクセスを制限 – 排他制御を忘れてしまうバグを防止 デバッグが容易 ⇒新しいマルチスレッドプログラムの作成方式の 提案 99/08/02 SWoPP'99 5 ProcThread方式(1/2) 複数の実行ファイルをプロセスのアドレス 空間にロード それぞれの実行ファイルを1つのスレッド で実行させる 概念的には、1つのUNIXプロセスの中に 複数の小さなプロセス(μプロセス) μプロセス間には保護は存在しない – アドレスの区画を分けるだけ – マルチスレッドと同様に実行効率がよい 99/08/02 SWoPP'99 6 ProcThread方式(2/2) マルチスレッド プロセス 実行ファイル ProcThread スレッド実行 ファイル プロセス a.out1 a.out a.out2 スレッド 99/08/02 a.out3 SWoPP'99 μプロセス 7 ProcThread方式の実行イメージ プロセス スレッド 実行ファイル スレッド 実行ファイル μプロセス μプロセス ProcThread システムコール ProcThreadコア UNIXシステムコール UNIX Kernel 99/08/02 SWoPP'99 8 スレッド実行ファイル(1/2) main()から始まる通常の単一スレッドプロ グラム UNIXプログラムと全く同じ構造(text, data, bss, 共有ライブラリ)を持つ ファイル形式 – 動的リンクされたUNIX実行ファイル形式 (a.out) + 再配置情報 再配置情報を追加(リンカ(ld)を修正) 既存のプログラムをリンクしなおすだけで スレッド実行ファイル化 99/08/02 SWoPP'99 9 スレッド実行ファイル(2/2) スレッド実行ファイルは、μプロセスとしても、 単体のUNIXプロセスとしても動作可能 μプロセスとして プロセスとして a.out1 a.out2 単体でデバッグ可能 99/08/02 SWoPP'99 10 μプロセス スレッド実行ファイルをメモリにマップ (mmap)し、再配置して、μプロセスを生成 各μプロセスは1スレッドで実行される – 実行コードを複数のスレッドで共有しない – 共有ライブラリもμプロセス毎にマップ • Legacyコードを問題なく流用できる μプロセス毎にファイル記述子 – μプロセス毎に標準入出力を割り当て可能 – 既存のフィルタコマンドのスレッド化が容易 99/08/02 SWoPP'99 11 ProcThreadコア プロセス内OS的な機能 – μプロセス管理(生成・消滅) – スレッド管理・スケジューリング – ファイル記述子管理 – UNIXシステムコールの横取り – μプロセス間通信 UNIXプロセスとして実装 – このプロセスのアドレス空間に、複数のμプロ セスが配置される 99/08/02 SWoPP'99 12 UNIXシステムコールの横取り 既存のコードを動作させるために、幾つかの UNIXシステムコールはProcThreadコアが横取 り – brk, sbrk – exit – chdir – ファイル記述子を扱うもの • read, write, etc. – プロセスの資源を確保・開放するもの • mmap, munmap, open, close • μプロセスの消滅時に資源を解放 99/08/02 SWoPP'99 13 μプロセス間通信機構 (現在のところ)パイプ機構のみ – μプロセス間プロシージャコールを実装中 μプロセス間をパイプで接続 UNIXのプロセス間パイプより高速 既存のUNIXフィルタコマンドをスレッド実 行ファイル化し、パイプで接続 – grep, sort, etc. 99/08/02 SWoPP'99 14 実装 NetBSD-1.4/i386, ユーザレベルでの実装 ProcThreadコア – POSIX Thread ライブラリ(PTL)ベース – 128KB程度 – 実行時リンカ(ld.so)機能を内蔵 スタートアップルーチン(crt0.o) – 実行環境(自身がμプロセスか、UNIXプロセスか)に よって動作を変える リンカ(ld) – 実行ファイルに再配置情報を追加 上記のcrt0.o, ldを使う専用Cコンパイラ 99/08/02 SWoPP'99 15 評価(1/4) IBM-PC互換機(Pentium133MHz) μプロセス生成・消滅時間 – 何もしないμプロセスの生成+実行+消滅に要 した時間 ProcThread UNIX Fork&Exec ProcThread(再利用) 50 21 1.2 (msec) – μプロセス間通信は高速なので元が取れる – 予めμプロセスをロードしておく方法 99/08/02 SWoPP'99 16 評価(2/4) コンテクストスイッチ ProcThread UNIX process 99/08/02 1.95 82 (microsec) SWoPP'99 17 評価(3/4) μプロセス間パイプ機構 – ProcThreadの2つのμプロセス間でパイプラ インを構成 • 4KBのデータの5000回転送に要した時間 • cat 2.4MBファイル | grep regexp – UNIXのプロセス間パイプと比較 cat grep 99/08/02 ProcThread 4KB × 5000 980 cat | grep 380 SWoPP'99 UNIX 2700 720 (msec) 18 評価(4/4) 既存のLegacyコードの流用性 – いくつかのNetBSDの標準コマンドを、スレッド 実行ファイルとしてリンクしなおし • grep, cat, sort, uniq, wc – μプロセスとして問題なく動作することを確認 99/08/02 SWoPP'99 19 まとめ(1/2) 従来のマルチスレッドの問題点を改善する ProcThread方式を提案・実装 利点 – Legacyコードを流用できる – 既存のプログラムをリンクしなおすだけでス レッドとして動作可能 – スレッドの再利用性が向上 – 他のμプロセスのデータへのアクセスは、明示 的に行う必要があるので、排他制御のバグが 入り込みにくい 99/08/02 SWoPP'99 20 まとめ(2/2) 欠点 – スレッド間通信機構がパイプしかない • μプロセス間プロシージャコールを実装中 – マルチスレッドと比べて • 生成・消滅にコストがかかる • メモリ効率は悪い – マルチスレッドを完全に置き換えるものではない 99/08/02 SWoPP'99 21 今後の課題 μプロセス間プロシージャコールの実装 1つのμプロセス中で、複数のスレッドが実 行できるようにする – 通常のマルチスレッドを含むようになる a.out1 a.out2 99/08/02 SWoPP'99 22 おしまい 99/08/02 SWoPP'99 23 μプロセス stack shared library shared library relocation info. data text mmap bss data text スレッド実行ファイル 99/08/02 SWoPP'99 24 μプロセス生成 API – procthread_create() • • • • 99/08/02 スレッド実行ファイルのファイル名 引数(argv) 環境(environ) フラグ SWoPP'99 25 μプロセス間プロシージャコール μプロセスは幾つかのエントリ関数を宣言 あるスレッドが、別のμプロセスのエントリ 関数を呼び出せる – procthread_ucall(UPROC, FUNC, ARG); 呼び出している間、1つのμプロセス中に、 複数のスレッドが存在 – 適切な相互排除が必要 • 基本的にはエントリ関数で相互排除 99/08/02 SWoPP'99 26
© Copyright 2024 ExpyDoc