l Race Condition l l Critical Section l

  • Slides: 35
Download presentation

為何要同步? l 避免競爭情況 (Race Condition) l l 方法:鎖定臨界區間 (Critical Section) 低階的同步方法 l l l

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

競爭情況 (Race Condition) Consumer Producer while (true) { while (counter == BUFFER_SIZE) ; buffer[in]

競爭情況 (Race Condition) Consumer Producer while (true) { while (counter == BUFFER_SIZE) ; buffer[in] = next. Produced; in = (in+1) % BUFFER_SIZE; counter = counter + 1; } while (true) { while (counter == 0) ; next. Consumed = buffer[out]; out = (out+1) % BUFFER_SIZE; counter = counter - 1; } 3 陳鍾誠 -

競爭情況 (Race Condition) Producer : counter++ Consumer : counter-- LOAD register, counter; ADD register,

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

交替演算法 (續) l 行程 Pi 的程式結構如下: do { while (turn != i) ; critical

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

旗標演算法 (續) l 行程 Pi 的程式結構如下: do { flag[i] = TRUE; while (flag[j]) ;

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

綜合演算法 (續) l 行程 Pi 的程式結構如下: do { flag[i] = TRUE; turn = j;

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

麵包店演算法 (續) l 行程 Pi 的程式結構如下: do { choosing[i] = TRUE; number[i] = max(number[0],

麵包店演算法 (續) l 行程 Pi 的程式結構如下: 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); 15 陳鍾誠 -

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

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

計數號誌 – 忙碌等待版 l 計數號誌 Counting Semaphore void wait(s) { while (s<=0) ; s--;

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

計數號誌 – 非忙碌版 void wait(s) { S. value - -; if (S. value <

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

利用二元號誌實作計數號誌 void wait(S) { wait(S 1) C--; if (C < 0) { signal(S 1);

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

以臨界區域實作 : 生產者-消費者 Consumer Producer region buffer when (count < n) { pool[in] =

以臨界區域實作 : 生產者-消費者 Consumer Producer 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 --; } 29 陳鍾誠 -

競爭狀況的範例 - Race. Condition. java import java. util. Random; class Race. Condition { public

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

競爭狀況的範例 - Race. Condition. java static String. Buffer lines = new String. Buffer(); static

競爭狀況的範例 - Race. Condition. java static String. Buffer lines = new String. Buffer(); static int counter=0; int step; String name; Step. Thread(String p. Name, int p. Step) { step = p. Step; name = p. Name; } 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 h. BLX counter | Race Condition lines. append(line+"n"); // System. out. println(line); 34 陳鍾誠 // } }