POSIXスレッド

Similar documents
スレッド

スレッド

Insert your Title here

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

POSIXプログラミング Pthreads編

ただし 無作為にスレッドを複数実行すると 結果不正やデッドロックが起きる可能性がある 複数のスレッド ( マルチスレッド ) を安全に実行する ( スレッドセーフにする ) ためには 同期処理を用いるこ とが必要になる 同期処理は 予約語 synchronized で行うことができる ここでは sy

Microsoft PowerPoint - OS06.pptx

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

Microsoft PowerPoint - OS04.pptx

21 章のお話

Taro-リストⅢ(公開版).jtd

POSIXスレッド

Microsoft PowerPoint - kougi11.ppt

AquesTalk プログラミングガイド

プログラミング入門1

PowerPoint プレゼンテーション

Java の ConcurrentHashMap における同期化 バッドケースとその対処法 2013 年 9 月湊隆行 1. はじめに表 1.1 に示すように Java の Collections Framework には 3 つの世代があります バージョン 1.0 から存在するレガシー API バ

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

プログラミング実習I

Microsoft PowerPoint ppt [互換モード]

TopSE並行システム はじめに

NUMAの構成

Microsoft PowerPoint ppt [互換モード]

ファイナライザを理解する ~ ファイナライザに起因するトラブルを避けるために ~ 2013 年 11 月 25 日 橋口雅史 Java アプリケーションでファイナライザ (finalize() メソッド ) を使用したことがあるプログラマーは多いと思います しかし ファイナライザの仕組みや注意点につ

プログラミング及び演習 第1回 講義概容・実行制御

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

program7app.ppt

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

PowerPoint プレゼンテーション

memo

Microsoft PowerPoint - OpenMP入門.pptx

Taro-リストⅠ(公開版).jtd

kiso2-03.key

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Microsoft PowerPoint - kougi9.ppt

memo

HotSpot のロック A Peek Under the Hood

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

Microsoft PowerPoint - 6.pptx

メモリ管理

演算増幅器

スレッド

Program Design (プログラム設計)

/*Source.cpp*/ #include<stdio.h> //printf はここでインクルードして初めて使えるようになる // ここで関数 average を定義 3 つの整数の平均値を返す double 型の関数です double average(int a,int b,int c){

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

プログラミング入門1

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

4-4- 基スクリプト言語に関する知識 コードの作成や修正が容易とされるスクリプト言語を学習し アプリケーション開発の手法を習得する 本カリキュラムでは まずスクリプト言語に位置づけされる Perl PHP Python JavaScript Ruby といった Ⅰ. 概要プログラミング言語の特徴に

デザインパターン第一章「生成《

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

AquesTalk Win Manual

Microsoft PowerPoint pptx

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

プログラミングI第10回


Microsoft PowerPoint - erlang-parallel100216

オペレーティングシステム 2014

AquesTalk for WinCE プログラミングガイド

Taro-2分探索木Ⅱ(公開版).jtd

NetworkVantage 9

Microsoft PowerPoint - 計算機言語 第7回.ppt

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

file:///D|/C言語の擬似クラス.txt

Javaセキュアコーディングセミナー2013東京第1回 演習の解説


JS2-14 マルチコアCPU時代の Javaプログラミング

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

デジタル表現論・第4回

PowerPoint プレゼンテーション

Microsoft PowerPoint - 講義:コミュニケータ.pptx

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

HashMapからConcurrentHashMapへの移行

レコードとオブジェクト

Microsoft Word - no11.docx

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

1 48


01.eps

Microsoft Word - openmp-txt.doc

Slide 1

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

gengo1-12

memo

SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

Developer Camp

テスト 1/5 ページ プレポスト OSIV/MSP JCL とユーティリティ 受講日程受講番号氏名 1 ジョブ制御文で指定する情報として間違っているものを選びなさい 1. 実行プログラム名 2. 入出力データセット名 3. コンピュータの機種名 4. 実行プログラムの処理順序 解答 2 ジョブ制御

Si 知識情報処理

はじめに 誰? / hatena id:yohhoy 何を? C++11の 次 規格へ提案されている新機能の紹介 ちょっと (?) 未来 のお話です どうして? Google 先生に聞いても情報がほとんど無い... 勉強会駆動教えて君 2

PowerPoint プレゼンテーション

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

102

( ) 3 1 ( ), ( ).. 1

Presentation title (on one or two lines)

プログラミング基礎

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

Transcription:

POSIX スレッド (3) システムプログラミング 2011 年 11 月 7 日 建部修見

同期の戦略 単一大域ロック スレッドセーフ関数 構造的コードロッキング 構造的データロッキング ロックとモジュラリティ デッドロック

単一大域ロック (single global lock) 単一のアプリケーションワイドの mutex スレッドが実行するときに獲得, ブロックする前にリリース どのタイミングでも一つのスレッドが共有データをアクセスする 単一プロセッサではよく利用された 単純であるが, 複数プロセッサのメリットなし 全てのモジュールとライブラリで * 単一 * のロックを利用しなければならない!

スレッドセーフ関数 モジュール, ライブラリをスレッドセーフにする 内部で適切に同期し, 呼び出し側で同期の必要がない 呼び出しが簡単となり, モジュラリティが高くなる モジュラプログラミングのよい例

構造的コードロッキング 関数 コードレベルで行うロック 共有データが特定の関数群でアクセスされることを想定 通常, 一つのモジュールに閉じている 関数レベル コードレベルで並列性が制限される 単一の mutex を用い, 競合セクション (critical section) となる関数 コードでロックする 競合セクションとは, モジュールの共有データをアクセスするコードの部分

構造的コードロッキングの例 (1) /* global mutex for structured code locking */ pthread_mutex_t mq_lock = PTHREAD_MUTEX_INITIALIZER; void mq_put(mq_t mq, msg_t m) { struct mq_elt *new; } new = malloc(sizeof(*new)); new->msg = m; pthread_mutex_lock(&mq_lock); add_tail(mq, new); /* critical section */ pthread_cond_signal(&mq->notempty); pthread_mutex_unlock(&mq_lock);

構造的コードロッキングの例 (2) msg_t mq_get(mq_t mg) { struct mq_elt *old; msg_t m; } pthread_mutex_lock(&mq_lock); while (mq->head == NULL) /* critical section starts */ pthread_cond_wait(&mq->notempty, &mq_lock); old = delete_head(mq); m = old->msg; pthread_mutex_unlock(&mq_lock); free(old); return (m);

モニタ (Monitors) 並行 (concurrent) プログラミング言語におけるモニタの概念 [Hoare 74] は構造化コードロッキングで模擬できる モニタは, モジュールを構成する外部関数群で構成 共有データ ( 共有状態 ) は, モジュールの外部関数群でのみ排他的にアクセスできる 情報隠蔽のよい例 モニタでは, モニタの中の関数に入るとコンパイラが自動的に排他ロックをかける

内部関数 モニタロックを確保した状態で呼ばれる関数 構造化コードロッキングの例の add_tail(), delete_head() は内部関数 モニタ型の外部関数は, ロックを確保したまま他の外部関数を呼べない デッドロック 外部関数の内部関数版を利用

不変式 (invariants) モニタロックが誰にも保持されていないとき, 共有状態で必ず成立する式 ロック獲得直後, ロックリリース直前で成立 デバッグのためによく利用される #include <assert.h> assert(list_check(list)); cc DNDEBUG で assertion チェックは disable される

複数の条件と条件変数 (1) 正しくない例 pthread_mutex_lock(&monitor_lock); while (!cond1) pthread_cond_wait(&cond1_cv, &monitor_lock); while (!cond2) pthread_cond_wait(&cond2_cv, &monitor_lock); /* cond2 may be true, but cond1 may no longer be true */ pthread_mutex_unlock(&monitor_lock);

複数の条件と条件変数 (2) 正しい例 pthread_mutex_lock(&monitor_lock); while (!cond1!cond2) { if (!cond1) pthread_cond_wait(&cond1_cv, &monitor_lock); if (!cond2) pthread_cond_wait(&cond2_cv, &monitor_lock); } pthread_mutex_unlock(&monitor_lock);

構造化データロッキング データロッキングはコードではなく, データ ( オブジェクト ) に対するロック 共有データが特定の関数群でアクセスされることを想定 共有データは独立なオブジェクト ( データ ) に分けられることを想定 オブジェクトモニタと似た概念 独立な list の操作などは, モニタの構造を失わず並列に実行可能 オブジェクト間でデータを共有する場合は難しい

ロックとモジュラリティ モニタのネスト 長いオペレーション モニタへの再入

モニタのネスト モジュール A が (A のモニタロックを保持したまま ) モジュール B を呼び, モジュール B でブロックしてしまうと,A のモニタロックを長時間確保したままとなる モジュール B のブロック条件が, モジュール A で満たされる場合, デッドロックとなる オブジェクトモニタも, 可能性は低くなるが, 同様の問題がある 解決策 : モニタロックを確保したままブロックする可能性のある関数を呼ばない strcmp などは大丈夫だが,getc などはだめ モニタロックを確保する前, リリース後に移動する

長いオペレーション モニタロックを保持したまま, 実行時間の長い操作を行うことは, 他スレッドの実行の妨げとなる I/O 操作や入力待ちなどではロックをリリースする方がよい 例えば,busy フラグを立てて,unlock する 終了したら,busy フラグを落とす ハッシュ表の例

モニタへの再入 モジュール A が ( モニタロック確保したまま ) モジュール A を呼ぶと, デッドロックが生じる 解決策 : モニタロックを保持したまま, 可能性のある関数の呼び出しを避ける ロックをリリースする 可能性のある例 : リストモジュールが, メモリアロケータモジュールを利用し, メモリアロケータモジュールがリストモジュールを利用するなど

デッドロック (1) 永遠にブロックしてしまうこと Self-deadlock と recursive deadlock ロックの順番によるデッドロック スレッド 1: モジュール A モジュール B スレッド 2: モジュール B モジュール A 解決策 : モニターロックを保持したまま可能性のある関数の呼び出しを避ける 解決策 : 保持が避けられない場合, ロックする順番を決める Lock hierarchy リソース不足によるデッドロック 幾つかのリソースを確保 複数のスレッドが部分的に確保し, 誰も解放しない 解決策 : 全てのリソースを確保する 失敗した場合, 全て解放し, はじめからやり直し

デッドロック (2) ロックの順番によるデッドロック デッドロック発生 スレッド 1 がロックを確保 スレッド 1 がロック 1 を確保 スレッド 2 がロック 2 を確保 スレッド 1 が同一ロックを再び確保 スレッド 1 がロック 2 を確保 スレッド 2 がロック 1 確保 ロックの確保順にサイクルができるとデッドロックが発生する デッドロック発生

デッドロック (3) 身近な例 リソースの確保順にサイクルができデッドロックが発生

ロックのガイドライン 構造的ロッキングのスタイルを使う 関数あるいは各データに mutex を利用 不変式の定義と利用 ロックを保持したまま, 再入の可能性のあるモジュール外の関数呼び出しを避ける 性能に影響するため,I/O 操作など長時間に渡るロックの保持は避ける