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