作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2016/7/21 行程的同步 註:本章學術性較重,但考試常考。

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
项目6 通用堆栈.
四資二甲 第三週作業 物件導向程式設計.
第二章 进程的描述与控制管理.
作業系統 第六章 同步與死結.
Chapter 7: Process Synchronization 进程同步
第二章 进程管理.
PURSUING EXCELLENCE / TOWARD SUCCESS WUCHANG UNIVERSITY OF TECHNOLOGY
第二章 JAVA语言基础.
Chapter 6 同步 (Synchronization)
Ch07 介面與多重繼承 物件導向程式設計(II).
第三章 控制结构.
Operating System Process Management - 4 Monday, August 11, 2008.
操作系统 (并发进程) 徐锋 南京大学计算机科学与技术系 2018年9月18日3时52分.
中国科学技术大学计算机系 陈香兰 2013Fall 第五讲 进程同步 中国科学技术大学计算机系 陈香兰 2013Fall.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
中国科学技术大学计算机系 陈香兰 2013Fall 第五讲 进程同步和通信(part II) 中国科学技术大学计算机系 陈香兰 2013Fall.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
Java语言程序设计 第七部分 多线程.
Java基础 JavaSE异常.
流程控制結構 4-1 流程控制與UML活動圖 4-2 程式區塊與主控台基本輸入 4-3 條件控制敘述 4-4 迴圈控制敘述 4-5 巢狀迴圈
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
经典同步问题.
作業系統 第六章 同步與死結.
Chapter 3 行程觀念 (Process Concept)
程式設計實作.
抽象类 File类 String类 StringBuffer类
程式撰寫流程.
2018/12/3 面向对象与多线程综合实验-网络编程 教师:段鹏飞.
Java语言程序设计 第五部分 Java异常处理.
计算机操作系统 第二章 进程管理 高校教师、高级项目经理 任铄 QQ:
第三章 进程互斥与同步.
Java程序设计 第9章 继承和多态.
第三章 进程互斥与同步 进程通信 Communication.
临界区软件互斥软件实现算法.
进程操作.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
第一次课后作业 1. C/C++/Java 哪些值不是头等程序对象 2. C/C++/Java 哪些机制采用的是动态束定
操作系统原理 Operating System Principles
李元金 计算机与信息工程学院 第 4 讲 进程管理(2) 李元金 计算机与信息工程学院 1/
3.1 数据类型 3.2 标识符与关键字 3.3 常量 3.4 变量 3.5 运算符与表达式 3.6 一个编程实例
异常及处理.
临界区软件互斥软件实现算法 主讲教师:夏莹杰
C/C++/Java 哪些值不是头等程序对象
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
第2章 进程管理 2.1 进程概念 2.2 线程 2.3 进程管理 2.4 进程间通信 2.5 经典进程同步问题 2.6 管程
第2章 进程和线程 内容提要: 2.1 进 程 概 念 2.2 进程的状态和组成 2.3 进 程 管 理 2.4 线 程.
第三章 进程互斥与同步.
Multithread 多執行緒 以GUI為例了解物件以及Event
辅导课程八.
Week 2: 程式設計概念與 演算法的效能評估
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章 Java基本语法 讲师:复凡.
第7章 進階的同步 觀念與實務.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
第二章 Java基本语法 讲师:复凡.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
Race Conditions and Semaphore
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
Presentation transcript:

作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2016/7/21 行程的同步 註:本章學術性較重,但考試常考。

2 陳鍾誠 /7/21 為何要同步 ? 避免競爭情況 (Race Condition) 方法:鎖定臨界區間 (Critical Section) 低階的同步方法 交替演算法 (Turn Algorithm) 旗標演算法 (Flag Algorithm) 綜合演算法 (Combination Algorithm) 麵包店演算法 (Bakery Algorithm) 硬體支援 (Hardware Support)  禁止中斷 ( 在臨界區間內 )  硬體的 Test and set 指令  硬體的 swap 指令 高階的同步方法 號誌 (Semaphore) 計數號誌 (Counting Semaphore) 二元號誌 (Binary Semaphore) -- Java 臨界區域 (Critical Region) 監督程式 (Monitor) – C#

3 陳鍾誠 /7/21 競爭情況 (Race Condition) while (true) { while (counter == BUFFER_SIZE) ; buffer[in] = nextProduced; in = (in+1) % BUFFER_SIZE; counter = counter + 1; } while (true) { while (counter == 0) ; nextConsumed = buffer[out]; out = (out+1) % BUFFER_SIZE; counter = counter - 1; } Producer Consumer

4 陳鍾誠 /7/21 競爭情況 (Race Condition) LOAD register, counter; ADD register, 1 STORE counter, register LOAD register, counter; SUB register, 1 STORE counter, register Producer : counter++Consumer : counter-- P:LOAD register, counter; P:ADD register, 1 C:LOADregister, counter C:SUBregister, 1 P:STORE counter, register C:STOREcounter, register register = 5 ; register = 6 register = 5 register = 4 counter = 5 counter = 4 If counter = 5 then counter may be After execution

5 陳鍾誠 /7/21 避免競爭 1 : 臨界區間 上述的會產生競爭情況的段落,不能讓多個程式同時執行 為了確保執行順序不會出問題,我們可以採用臨界區間的方式 do { entry section critical section exit section exit section remainder section } while (1)

6 陳鍾誠 /7/21 競爭情況的解決方法 方法一:用硬體解決 單一 CPU : 在一個關鍵段落還沒完成之前,禁止中斷的發生 (Intel 80x86,ARM … ) 利用 test and set 等硬體指令 多個 CPU : ( 雙核心以上 ) 必須加上旋轉鎖機制 (Linux, Windows) (busy waiting) 方法二:用軟體解決 交替演算法 (Turn Algorithm) 旗標演算法 (Flag Algorithm) 綜合演算法 (Combination Algorithm) 麵包店演算法 (Bakery Algorithm)

7 陳鍾誠 /7/21 競爭情況的解決方法必需滿足 下列條件 互斥 (Mutual Exclusion) 進行 (Progress) 有限等待 (Bounded Waiting)

8 陳鍾誠 /7/21 交替演算法 兩個行程 P i 及 P j 之間的臨界區演算法。 共用一個變數 turn ,指出目前允許進入臨界區的是 哪一個行程。 只記錄系統目前的狀態,但是並不記錄行程個別的 狀態。 如果 turn = i ,代表行程 P i 可以進入臨界區之中。 滿除臨界區互斥的條件,但是不能滿足進行的條件。

9 陳鍾誠 /7/21 交替演算法 ( 續 ) 行程 P i 的程式結構如下: do { while (turn != i) ; critical section turn = j; remainder section } while (1);

10 陳鍾誠 /7/21 旗標演算法 兩個行程 P i 及 P j 之間的臨界區演算法。 將交替演算法中共有的變數 turn 改為共有的陣列 flag ,記錄系統中個別行程的狀態。 如果 P i 要進入臨界區,則將 flag[i] 設為 TRUE 。 當 P i 離開臨界區後,再將 flag[i] 設為 FALSE 。 滿足臨界區互斥的條件,但是仍然無法滿足進行的 條件。

11 陳鍾誠 /7/21 旗標演算法 ( 續 ) 行程 P i 的程式結構如下: do { flag[i] = TRUE; while (flag[j]) ; critical section flag[i] = false; remainder section } while (1);

12 陳鍾誠 /7/21 綜合演算法 兩個行程 P i 及 P j 之間的正確臨界區演算法。 綜合交替演算法與旗標演算法。 以 flag 陣列記錄個別行程是否想要進入臨界區;而 turn 變數指出目前系統允許哪個行程進入臨界區。 同時滿足互斥、有限等待與進行三個條件。

13 陳鍾誠 /7/21 綜合演算法 ( 續 ) 行程 P i 的程式結構如下: do { flag[i] = TRUE; turn = j; while (flag[j] && turn == j) ; critical section flag[i] = false; remainder section } while (1);

14 陳鍾誠 /7/21 麵包店演算法 多個行程間的臨界區演算法。 以行程取到的號碼牌,由小而大地讓行程進入臨界 區中。 若有行程取到相同號碼,則以行程的 ID 大小決定 先後順序, ID 較小的優先。 同時滿足互斥、有限等待與進行三個條件。

15 陳鍾誠 /7/21 麵包店演算法 ( 續 ) 行程 P i 的程式結構如下: do { choosing[i] = TRUE; number[i] = max(number[0], number[1], …, number[n – 1]) + 1; choosing[i] = FALSE; for (j = 0; j < n; j++) { while (choosing[j]) ; while ((number[j] != 0) && ((number[j], j) < (number[i], i))) ; } critical section number[i] = 0; remainder section } while (1);

作者 : 陳鍾誠 單位 : 金門技術學院資管系 URL : 日期 : 2016/7/21 硬體支援

17 陳鍾誠 /7/21 硬體支援 1 : 禁止中斷 單 CPU 的系統 讓行程在修改共用的變數時停止接受中斷而解決同 步的問題。 多 CPU 的系統 加上旋轉鎖等忙碌等待機制 (busy waiting)

18 陳鍾誠 /7/21 硬體支援 2 : Test-and-Set 指令 在執行完整個指令之前都不會被中斷。 Test-and-Set 指令會傳回參數 target 目前的值, 並同時將 target 的值設為 TRUE 。 可以利用 Test-and-Set 指令實作多行程的臨界 區演算法。 boolean Test-and-Set (Boolean &target) { Boolean rv = target; target = true; return rv; }

19 陳鍾誠 /7/21 硬體支援 3 : Swap 硬體指令 在執行完整個指令之前都不會被中斷。 Swap 指令會交換參數 a 與 b 兩個字元組的內 容。 Void Swap (Boolean &a, Boolean &b) { Boolean temp = a; a = b; b = temp; }

20 陳鍾誠 /7/21 避免競爭 2 : 號誌 Semaphore 號誌是十分常用的同步工具,可以簡單地解決較為複 雜的同步問題。 大部分的作業系統都已經實作了號誌,作為行程間同步的工 具。 號誌包含一個數值,該值在初始化之後就只能經由 signal() 與 wait() 兩個不可被中斷的函式去存取。 當一個行程在存取號誌的值時,其他行程無法存取同一個號 誌的值。

21 陳鍾誠 /7/21 計數號誌的使用 (1) 解決臨界區間的問題 do { wait(mutex); critical section signal(mutex); remainder section }

22 陳鍾誠 /7/21 計數號誌的使用 (2) 解決同步的問題 wait(mutex) S1; S2 signal(mutex) P1 P2

23 陳鍾誠 /7/21 計數號誌 – 忙碌等待版 計數號誌 Counting Semaphore void wait(s) { while (s<=0) ; s--; } void signal(s) { s++; }

24 陳鍾誠 /7/21 計數號誌 – 非忙碌版 void wait(s) { S.value - -; if (S.value < 0) block() ; } void signal(S) { S.value++; if (S.value <=0) wakeup(p); }

25 陳鍾誠 /7/21 二元號誌 利用硬體實作對二元號誌的支援,簡單又快。 利用二元號誌再實作計數號誌。

26 陳鍾誠 /7/21 利用二元號誌實作計數號誌 void wait(S) { wait(S1) C--; if (C < 0) { signal(S1); wait(S2); } signal(S1); } void signal(s) { wait(S1); C++; if (C<=0) signal(S2); else signal(S1); }

27 陳鍾誠 /7/21 以號誌實作生產者 - 消費者問題 empty 初始化為 nfull 初始化為 0 do { … 產生一個新的項目放在 nextp … wait(empty); wait(mutex); … 將 nextp 加入到緩衝區中 … signal(mutex); signal(full); } while(1); do { wait(full); wait(mutex); … 將一個項目由緩衝區中 移到 nextc … signal(mutex); signal(empty); … 消耗放在 nextc 中的項目 … } while(1); 生 產 者生 產 者消 耗 者消 耗 者

28 陳鍾誠 /7/21 臨界區域 (Critical Region) 一種高階的同步方法 語法 region V when B do S; V : shared T; 注意 : 必須小心 B 的條件設定,條件相同者不能保證 其執行的先後順序 例如: R1 : region V when true do S1 R2 : region V when true do S2 則 R1, R2 不一定誰會先被執行。

29 陳鍾誠 /7/21 以臨界區域實作 : 生產者 - 消費者 region buffer when (count < n) { pool[in] = nextp; in = (in + 1) % n; count ++; } region buffer when (count > 0) { nextc = pool[out]; out = (out + 1) % n; count --; } Producer Consumer

30 陳鍾誠 /7/21 監督程式 (Monitor) 監督程式是另外一種高階的同步工具。 對較複雜的同步問題提供了更一般性的實作工具。 由一些變數宣告及函式所組成,變數的值定義了監 督程式的狀態。 保證只有一個行程在監督程式中執行所定義的函式。 在監督程式中,程式設計師不需要撰寫有關同步的 程式碼,但是可以利用條件變數來定義自己的同步 機制。 哲學家晚餐問題可以利用監督程式來實作。

31 陳鍾誠 /7/21 結語 行程不同步可能會產生競爭情況 為了避免競爭情況必需保護臨界區間 臨界區間的保護可用行程同步的方式 Mutex Semaphore

32 陳鍾誠 /7/21 比較 - 臨界區域 v.s. 臨界區間 請注意,臨界區域 (Critical Region) 與 臨界區 間 (Critical Section) 不同 臨界區間 (Critical Section) 指的是不可同時執行的該區間

33 陳鍾誠 /7/21 競爭狀況的範例 - RaceCondition.java import java.util.Random; class RaceCondition { public static void main(String[] args) throws Exception { StepThread.test(); } class StepThread extends Thread { public static void test() throws Exception { StepThread a = new StepThread("A", 1); StepThread b = new StepThread("B", -1); a.start(); b.start(); a.join(); b.join(); System.out.println("counter="+StepThread.counter); System.out.println("lines=\n"+StepThread.lines); }

34 陳鍾誠 /7/21 競爭狀況的範例 - RaceCondition.java static StringBuffer lines = new StringBuffer(); static int counter=0; int step; String name; StepThread(String pName, int pStep) { step = pStep; name = pName; } int register; public void run() { for (int i=0; i<10; i++) { String line = name+" i="+i+" step="+step+"\t before:counter="+counter; // counter = counter + step; register = counter; register = register + step; counter = register; line += " after:counter="+counter; // Y[ synchronized hBLX counter | Race Condition lines.append(line+"\n"); // System.out.println(line); // } }

35 陳鍾誠 /7/21 競爭狀況的範例 - RaceCondition.java