26
99/08/02 SWoPP'99 1 UNIX ププププププププププププププププププ Proc Thread プププププププププププ ププププ ププププ プププ ププププ ププププププ ププププ ププププ ププ

UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

  • Upload
    lethia

  • View
    62

  • Download
    0

Embed Size (px)

DESCRIPTION

UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現. 安倍広多 松浦敏雄 安本慶一 東野輝夫 大阪市立大学 滋賀大学 大阪大学. 機構. マルチスレッド. 複数のスレッドが同一プロセス中に存在 プロセス間通信、プロセス間コンテクストスイッチを省略できる 実行効率が高い. マルチスレッドの問題点 (1/2). 1. マルチスレッドを考慮したコーディング が必要 スレッドセーフ 排他制御、静的な領域へのポインタの排除、 etc. - PowerPoint PPT Presentation

Citation preview

Page 1: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 1

UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

安倍広多 松浦敏雄 安本慶一 東野輝夫

大阪市立大学 滋賀大学 大阪大学

機構

Page 2: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 2

マルチスレッド 複数のスレッドが同一プロセス中に存

在 プロセス間通信、プロセス間コンテク

ストスイッチを省略できる 実行効率が高い

Page 3: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 3

マルチスレッドの問題点 (1/2)1. マルチスレッドを考慮したコーディングが必要

– スレッドセーフ• 排他制御、静的な領域へのポインタの排除、 etc.

– 既存の単一スレッド用コード (Legacyコード )をマルチスレッドで使うには修正が必要

– 標準のライブラリ関数がスレッドセーフかどうかは OS によって異なる

– 既存の単一スレッドプログラムに新たにスレッドを付け加えることも困難

Page 4: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 4

マルチスレッドの問題点 (2/2)2. 特定のスレッドを別のプログラムで再

利用することが困難– スレッド間の密接な同期、相互排除

3. 共有データに簡単にアクセスできるので、排他制御を徹底させるのが難しい– 再現性が低く、発見が困難なバグ

4. デバッグが困難

Page 5: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 5

本研究の目標 Legacy コードをマルチスレッドで利用できる

– 既存の Legacy コードを含んだライブラリ– 既存の単一スレッドのプログラムそのもの

スレッドの再利用性を高める 共有データへのアクセスを制限

– 排他制御を忘れてしまうバグを防止 デバッグが容易 ⇒ 新しいマルチスレッドプログラムの作成方

式の提案

Page 6: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 6

ProcThread 方式 (1/2) 複数の実行ファイルをプロセスのアド

レス空間にロード それぞれの実行ファイルを1つのス

レッドで実行させる 概念的には、1つの UNIX プロセスの中

に複数の小さなプロセス (μ プロセス ) μ プロセス間には保護は存在しない

– アドレスの区画を分けるだけ– マルチスレッドと同様に実行効率がよい

Page 7: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 7

ProcThread 方式 (2/2) マルチスレッド

実行ファイル

プロセス

プロセス

a.outa.out1

a.out2

a.out3

ProcThread

μ プロセス

スレッド実行ファイル

スレッド

Page 8: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 8

ProcThread 方式の実行イメージ

ProcThread コア

スレッド実行ファイル

μ プロセス

UNIX Kernel

プロセススレッド

実行ファイル

μ プロセス

ProcThreadシステムコール

UNIX システムコール

Page 9: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 9

スレッド実行ファイル (1/2) main() から始まる通常の単一スレッド

プログラム UNIX プログラムと全く同じ構造 (text,

data, bss, 共有ライブラリ ) を持つ ファイル形式

– 動的リンクされた UNIX 実行ファイル形式(a.out) + 再配置情報

再配置情報を追加 ( リンカ (ld) を修正 ) 既存のプログラムをリンクしなおすだ

けで スレッド実行ファイル化

Page 10: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 10

スレッド実行ファイル (2/2) スレッド実行ファイルは、 μ プロセス

としても、単体の UNIX プロセスとしても動作可能

a.out1

a.out2

μ プロセスとして

プロセスとして

単体でデバッグ可能

Page 11: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 11

μ プロセス スレッド実行ファイルをメモリにマップ

(mmap) し、再配置して、 μ プロセスを生成

各 μ プロセスは1スレッドで実行される– 実行コードを複数のスレッドで共有しない– 共有ライブラリも μ プロセス毎にマップ

• Legacy コードを問題なく流用できる μ プロセス毎にファイル記述子

– μ プロセス毎に標準入出力を割り当て可能– 既存のフィルタコマンドのスレッド化が容易

Page 12: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 12

ProcThread コア プロセス内 OS 的な機能

– μ プロセス管理 ( 生成・消滅 )– スレッド管理・スケジューリング– ファイル記述子管理– UNIX システムコールの横取り– μ プロセス間通信

UNIX プロセスとして実装– このプロセスのアドレス空間に、複数の μ

プロセスが配置される

Page 13: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 13

UNIX システムコールの横取り 既存のコードを動作させるために、幾つかの

UNIX システムコールは ProcThread コアが横取り– brk, sbrk– exit– chdir– ファイル記述子を扱うもの

• read, write, etc.

– プロセスの資源を確保・開放するもの• mmap, munmap, open, close• μ プロセスの消滅時に資源を解放

Page 14: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 14

μ プロセス間通信機構 ( 現在のところ ) パイプ機構のみ

– μ プロセス間プロシージャコールを実装中

μ プロセス間をパイプで接続 UNIX のプロセス間パイプより高速 既存の UNIX フィルタコマンドをス

レッド実行ファイル化し、パイプで接続– grep, sort, etc.

Page 15: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

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 コンパイラ

Page 16: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 16

評価 (1/4) IBM-PC 互換機 (Pentium133MHz) μ プロセス生成・消滅時間

–何もしない μ プロセスの生成 + 実行 + 消滅に要した時間

– μ プロセス間通信は高速なので元が取れる–予め μ プロセスをロードしておく方法

ProcThread 50UNIX Fork&Exec 21ProcThread( )再利用 1.2

(msec)

Page 17: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 17

評価 (2/4) コンテクストスイッチ

ProcThread 1.95UNIX process 82

(microsec)

Page 18: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

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

Page 19: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 19

評価 (4/4) 既存の Legacy コードの流用性

– いくつかの NetBSD の標準コマンドを、スレッド実行ファイルとしてリンクしなおし

• grep, cat, sort, uniq, wc

– μ プロセスとして問題なく動作することを確認

Page 20: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 20

まとめ (1/2) 従来のマルチスレッドの問題点を改善

する ProcThread 方式を提案・実装 利点

– Legacy コードを流用できる– 既存のプログラムをリンクしなおすだけで

スレッドとして動作可能– スレッドの再利用性が向上– 他の μ プロセスのデータへのアクセスは、明示的に行う必要があるので、排他制御のバグが入り込みにくい

Page 21: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 21

まとめ (2/2) 欠点

– スレッド間通信機構がパイプしかない• μ プロセス間プロシージャコールを実装中

– マルチスレッドと比べて• 生成・消滅にコストがかかる• メモリ効率は悪い

– マルチスレッドを完全に置き換えるものではない

Page 22: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 22

今後の課題 μ プロセス間プロシージャコールの実

装 1つの μ プロセス中で、複数のスレッ

ドが実行できるようにする– 通常のマルチスレッドを含むようになる

a.out1

a.out2

Page 23: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 23

おしまい

Page 24: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 24

μ プロセス

textdata

textdatabss

スレッド実行ファイル

relocation info.

mmap

stack

shared libraryshared library

Page 25: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 25

μ プロセス生成 API

– procthread_create()• スレッド実行ファイルのファイル名• 引数 (argv)• 環境 (environ)• フラグ

Page 26: UNIX プログラムをスレッドとして動作させる ProcThread ライブラリの設計と実現

99/08/02 SWoPP'99 26

μ プロセス間プロシージャコール μ プロセスは幾つかのエントリ関数を宣言

あるスレッドが、別の μ プロセスのエントリ関数を呼び出せる– procthread_ucall(UPROC, FUNC, ARG);

呼び出している間、1つの μ プロセス中に、複数のスレッドが存在–適切な相互排除が必要

• 基本的にはエントリ関数で相互排除