UNIXプログラムをスレッドとして動作させるProcThread

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