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