Microsoft PowerPoint - OS06.pptx

Similar documents
Microsoft PowerPoint - OS04.pptx

Microsoft PowerPoint - OS07.pptx

Microsoft PowerPoint - OS11.pptx

Microsoft PowerPoint - OS12.pptx

POSIXスレッド

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

Microsoft PowerPoint - OS09.pptx

Microsoft PowerPoint - OS08.pptx

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

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

PowerPoint プレゼンテーション

メソッドのまとめ

Microsoft PowerPoint - prog03.ppt

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

PowerPoint プレゼンテーション

プログラミング入門1

グラフの探索 JAVA での実装

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

Java知識テスト問題

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

できるプログラマーを本気で育てる Java 超 Webプログラマーへの第 歩 第 2 回オブジェクト指向 テクノロジックアート 瀬 嘉秀

プログラミング入門1

Microsoft PowerPoint pptx

コンピュータ中級B ~Javaプログラミング~ 第3回 コンピュータと情報をやりとりするには?

Microsoft PowerPoint - prog04.ppt

CPUスケジューリング

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

Insert your Title here

Microsoft PowerPoint - chap10_OOP.ppt

プログラミングA

JavaプログラミングⅠ

Microsoft Word 基_シラバス.doc

9.3 同期 共有データへの読み書きの同期 複数のスレッドから共有データを読み書きするときに発生する問題について 一つのフィールドに対して複数のスレッドが同時にアクセスする可能性がある場合 その順番によっては整合性が保てなくなる可能性があるので スレッドの制御フローが独立していては困ることがある 次

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

TopSE並行システム はじめに

プログラミングA

プログラミング入門1

PowerPoint プレゼンテーション

問題1 以下に示すプログラムは、次の処理をするプログラムである

プログラミング基礎I(再)

Microsoft PowerPoint - OpenMP入門.pptx


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

GEC-Java

PowerPoint プレゼンテーション

PowerPoint Presentation

Prog2_12th

メディプロ1 Javaプログラミング補足資料.ppt

Javaの作成の前に

Microsoft PowerPoint - 04_01_text_UML_03-Sequence-Com.ppt

第2回講義

JavaプログラミングⅠ

Microsoft PowerPoint ppt

HotSpot のロック A Peek Under the Hood

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

GEC-Java

プログラミング入門1

Developer Camp

メソッドのまとめ

01-introduction.ppt

第2回

JavaプログラミングⅠ

JavaプログラミングⅠ

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

データベース 【1:データベースシステムとは】

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

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

JavaプログラミングⅠ

Prog2_9th

PowerPoint プレゼンテーション

(Microsoft PowerPoint - Java\221\3462\225\224\211\357\224\255\225\\\216\221\227\ ppt)

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

スレッド

文字列操作と正規表現

2004/11/23 オブジェクト指向プログラミング - モデル図とシーケンス図の表現方法 - オブジェクト指向プログラミング (OOP:ObjectOrientedPrograming) オブジェクト指向プログラミング言語 (OOPL) Java,C++,Delphi(Pascal),Visual

Java言語 第1回

Javaプログラムの実行手順

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

program7app.ppt

障害管理テンプレート仕様書

PowerPoint プレゼンテーション

メモリ管理

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

kantan_C_1_iro3.indd

Prog2_10th

平成 29 年度卒業研究 初心者のためのゲームプログラミング用 教材の開発 函館工業高等専門学校生産システム工学科情報コース 5 年 25 番細見政央指導教員東海林智也

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

Si 知識情報処理

MasterDetailFlow SettingsActivity 2. Android Lint Checks 以前のバージョンよりコンパイルのチェックが厳しくなりました このような厳しいチェックを Android Lint Checks と言います Abdroid プログラミング Bible で

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

04-process_thread_2.ppt

オブジェクト指向プログラミング・同演習 5月21日演習課題

Microsoft Word - 商業-3

とても使いやすい Boost の serialization

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

JavaプログラミングⅠ

POSIXプログラミング Pthreads編

Microsoft PowerPoint - HITobject.ppt

Transcription:

この資料は 情報工学レクチャーシリーズ松尾啓志著 ( 森北出版株式会社 ) を用いて授業を行うために 名古屋工業大学松尾啓志 津邑公暁が作成しました 並行プロセス モニタ パワーポイント 2007 で最終版として保存しているため 変更はできませんが 授業でお使いなる場合は松尾 (matsuo@nitech.ac.jp) まで連絡いただければ 編集可能なバージョンをお渡しする事も可能です 排他制御の枠組み 復習 セマフォ 復習 プロセス協調問題 Producer-Consumer プロセス間通信, 計算機間通信 P 命令 リソース獲得要求, 失敗時には待ち状態に移行 V 命令 リソース解放, 待ちプロセスを実行可能状態に リソースを獲得できなかったプロセスは待ち状態に ビジーウェイトが発生しない Reader-Writer データベースアクセス制御 Dining Philosophers 複数リソースを要求する場合 デッドロックの考慮が重要

セマフォの問題点 6.1 セマフォの問題点 ユーザ依存 P 命令 発行せずにクリティカルセクションにアクセス可能 他のプロセスからリソースの状況が判断不可能に V 命令 P 命令でリソースへのアクセス権を獲得し, アクセス終了後に V 命令を実行しないことも可能 他のプロセスは永遠にリソースへのアクセス不可能 全てユーザ ( プログラマ ) の良識 責任に任せられている モニタ モニタ モニタ セマフォより洗練された排他制御の仕組み オブジェクト指向の枠組み モニタの詳細... の前に 最近では Java の同期機構として採用されている

オブジェクト指向 6.2 オブジェクト指向プログラミングとは? オブジェクト指向 ( プログラミング ) オブジェクト ( 物体 ) 同士の相互作用としてシステムの振る舞いをとらえる考え方 プログラムの構造を, オブジェクト群の相互作用およびその雛形であるクラスの関係として捉える オブジェクト指向言語 C++ Java Smalltalk Objective-C Python(?) Ruby(?) オブジェクト指向の概念 クラス クラス (class) メソッド (method) インスタンス (instance) クラス あるオブジェクトの特徴や機能を定義する たとえば自動車 さまざまな内部状態の集まりで表現できる class 自動車 { 投入燃料量 ; 制動力 ; タイヤ角度 ; ブレーキランプ ;

メソッド 減速させたいとき 投入燃料量 = 0; 制動力 += n; ブレーキランプ = on; if ( スリップ ){... ; 物体に対する深い知識が必要 手順が面倒 システムとして異常な動作も許してしまう 例 ) 減速中でないのにブレーキランプ = on; class 自動車 { 投入燃料量 ; 制動力 ; タイヤ角度 ; ブレーキランプ ; メソッド オブジェクトに対する操作をメソッドとして外に提供 操作を系統的に カプセル化 外からタッチ可能な範囲を限定 メソッドを通じてのみオブジェクトの内部状態を変更可能に 誤操作が減る class 自動車 { public 減速 (n){ 投入燃料量 = 0; 制動力 += n; ブレーキランプ = on; if( スリップ ){... private 投入燃料量 ; 制動力 ; タイヤ角度 ; ブレーキランプ ; インスタンス クラス あくまでオブジェクトの定義 インスタンス あるクラスの実例であるオブジェクト メソッド呼びは, インスタンス ( 実体 ) に対して行う class 自動車 { public 減速 ( n ){ private 自動車 A 氏の自動車 ; main(){ A 氏の自動車. 減速 (10); 6.3 モニタ

セマフォとモニタ モニタ セマフォ モニタ カプセル化 提唱者 Dijkstra (1965) Hoare (1978) wait / signal / queue 形態 手続き ( サブルーチン ) 構造化 ( オブジェクト指向 ) 可読性 保守性低高 以下, 実例を通じて... 提供形態ライブラリ等言語仕様の一部 モニタにおけるカプセル化 共有変数へのアクセス 共有リソース 直接アクセス禁止 メソッドを通じてのみアクセス可能 不正な直接アクセスはコンパイル時に検出 メソッド 排他的 他のプロセスがメソッド呼び出し中は, 待ち状態へ monitor{ public use_resource1(n){ リソース 1 += n; use_resource2(){ private リソース 1; リソース 2; プロセスAとプロセスBがテープにアクセス プロセスBが確保中 プロセスAによる確保とプロセスBによる解放が発生 テープの空き数 共有変数 A B 空きテープ

共有変数へのアクセス 復習 リーダライタ問題 Shared_I num; ライタによる書き込み中は読み出し不可 同時には 1 ライタのみ書き込み可 monitor Shared_I { private int I; public increment( amount ){ I += amount; decrement( amount ){ I -= amount; num.decrement(1); テープ利用 ; num.increment(1); num.decrement(1); テープ利用 ; num.increment(1); 共有変数へのアクセスはメソッドを通じてのみ プログラマは排他制御のための記述の必要なし 同時に複数リーダが読み出し可 Writer Writer Writer Reader Reader Database Reader リーダライタ問題 ( その1) 条件変数 monitor Reader_Writer_1{ private int Readers = 0; int Writers = 0; boolean busy = FALSE; public start_read(){ while(writers!=0){; Readers += 1; finish_read(){ Readers -= 1; start_write(){ Writers += 1; while( busy Readers!=0 ){; busy = TRUE; finish_write(){ Writers -= 1; busy = FALSE; Reader_Writer_1 lock; lock.start_write(); lock.start_read(); DBに書く ; DBから読む ; lock.finish_write(); lock.finish_read(); 無限ループによる待機中, 他プロセスはモニタにアクセスできない 条件変数 ある条件が成立するまでプロセス スレッドを待機させる仕組み 条件変数操作のためのメソッド wait 待ち状態に移行 signal 待ち状態にあるプロセスのうち 1 つを実行可能に queue 待ち状態のプロセスの有無を返す

条件変数のイメージ wait 待ち状態に移行 signal 待ち状態にあるプロセスのうち 1 つを実行可能に queue 待ち状態のプロセスの有無を返す class condition{ private 待ち行列 ; public wait(){ プロセスを待ち行列に追加 ; signal(){ 待ち行列からプロセスを選択し, 実行可能に ; queue(){ if( 待ち行列の長さ > 0 ) return TRUE; else return FALSE; monitor Reader_Writer_2{ private int Readers = 0; int Writers = 0; condition OK_read, OK_write; public start_read(){ if( busy OK_write.queue() ) OK_read.wait(); Readers += 1; while( OK_read.queue() ) OK_read.signal(); finish_read(){ Readers -= 1; if( Readers == 0 ) OK_write.signal(); start_write(){ if( Readers!= 0 busy ) OK_write.wait(); busy = TRUE; finish_write(){ busy = FALSE; if( OK_read.queue() ) OK_read.signal(); else OK_write.signal(); class condition{ public wait(){... signal(){... queue(){... モニタとセマフォ リソース空き確認と待ち セマフォ モニタ セマフォ モニタ P 命令 共有リソースの取得トライ 失敗時, 待ち行列へ V 命令 共有リソース返却 待ちプロセスを 1 つ実行可能状態へ wait 待ち行列へ signal 待ちプロセスを 1 つ実行可能状態へ queue 待ちプロセスの有無 P 命令を実行しないとセマフォの状態が分からない リソースを取ろうとしないと, 空いてるかどうか不明 取れなかったら, いきなり待ち行列に待たされる メソッドにより, 共有リソースの状態を排他的に調べられる リソースの空きの確認とリソース待ちが分離 条件変数への wait により, 自由度の高い 待ち が可能

モニタの利点 ( 対セマフォ ) 復習 プロデューサコンシューマ リソース確認と 待ち の分離 リングバッファ リソースに空きがない場合, 待ち に入るかどうか自由に選べる 排他制御すべきリソースの明示 msg msg モニタ内に記述されるため明示的 他の一般的な変数と判別しやすい A msg msg B 排他的メソッドを通じた処理により, 保護 msg プログラマに安全で扱いやすい枠組みを提供 プロデューサコンシューマ Dining Philosophers monitor Producer_Consumer{ private Messages Buffer[N]; int S, M; condition Full, Empty; int Count; public producer( word ){ if( Count == N ) Full.wait(); Buffer[S] = word; S = (S + 1) mod N; Count += 1; Empty.signal(); consumer( word ){ if( Count == 0 ) Empty.wait(); word = Buffer[M]; M = (M + 1) mod N; Count = Count 1; Full.signal(); A メッセージでいっぱい状態変数 Full で wait 空いたら書いて, ポインタを進める Empty で読み出し待ちしているかもしれないので B enum{ EATING, HUNGRY, THINKING ; monitor Dining_Philosophers{ private state[n]; condition self[n]; test( i ){ if( (state[(i-1) mod N]!= EATING) && (state[i] == HUNGRY) && (state[(i+1) mod N]!= EATING) ){ state[i] = EATING; self[i].signal(); public up( i ){ state[i] = HUNGRY; test( i ); if( state[i]!= EATING ) self[i].wait(); down( i ){ state[i] = THINKING; test( (i-1) mod N ); test( (i+1) mod N ); 食べようとして, 成功すると EATING に 食事トライ失敗すると wait で待ち 食事終了両隣の人が HUNGRY なら EATING にして signal で起こす

モニタの利点と欠点 利点 カプセル化による, 排他制御の簡単化 可読性 保守性の高さ 非公開リソースへのアクセス,signal()/wait() のセット使用など, コンパイル時にある程度の不具合検出が可能 欠点 コンパイル時チェックは完全ではない デッドロックの可能性を完全に排除しているわけではない サポートしている言語が少ない Java による採用で, 再び脚光? まとめ ( モニタ ) モニタ オブジェクト指向プログラミングを排他制御に適用 リソース操作を, オブジェクトのメソッドとして提供 メソッドは排他的にのみ実行可能であり, プログラマはリソース排他制御に注意を払う必要がない デッドロックの可能性を, コンパイル時にある程度排除可能 まとめ 並行プロセス (1/5) 並行プロセス 機器上では一般に複数プログラムが並行動作 プロセス並列, さらに細かいスレッド並列など これに対し, システムのリソースは OS により仮想化 ( 無限 ) されているが実際は有限 有限リソースの使用権を, プロセス / スレッド間で調停する必要アリ つまりリソース使用が競合しうる場所で何らかの対処が必要 まとめ 並行プロセス (2/5) クリティカルセクション プログラム中で, リソース競合が発生する可能性のある部分 排他制御 (MUTEX) クリティカルセクションに, 複数プロセスが同時に入らないようにするための制御 さまざまなアプローチ Dekker のアルゴリズム セマフォ モニタ

まとめ 並行プロセス (3/5) まとめ 並行プロセス (4/5) Dekker のアルゴリズム Interest 変数により, 各プロセスがクリティカルセクションに興味があるか否かを表現 Priority 変数により, 複数プロセスが同時にクリティカルセクションに興味を持った場合にどちらを優先するかを決定 ソフトウェアのみで実現可能 ビジーウェイト さっき私だったのでどうぞ 競合者あり Interest 状態 セマフォ P 命令 リソース獲得要求, 失敗時には待ち状態に移行 V 命令 リソース解放, 待ちプロセスを実行可能状態に リソース獲得が失敗すると, 待ち行列へ V 命令が起こしてくれるまで待てばよい ビジーウェイト不要 プログラマ依存 デッドロックの可能性 (Dining Philosopher) V! 待ち P! リソース まとめ 並行プロセス (5/5) モニタ オブジェクト指向プログラミング カプセル化によるリソースの保護 メソッド排他実行による排他制御の簡潔化 デッドロック可能性のコンパイル時検出 ( 部分的 ) class 自動車 { public 減速 (n){ 投入燃料量 = 0; 制動力 += n; ブレーキランプ = on; if( スリップ ){... private 投入燃料量 ; 制動力 ; タイヤ角度 ; ブレーキランプ ; 並行プロセスの話は今日で終わり 次回からは主記憶 ( メモリ ) 管理の話題