2015年12月9日 星期三

Operating System - CH6 Process Synchronization

Race condition
一組Processes 在Shared Memory溝通方式下,若未對共享變數提供互斥存取等同歩機制,
則會造成 “共享變數之最終結果値,會因 Processes之間執行順序不同而有所不同 ”,導致不可預期之錯誤發生。

Consider this execution interleaving with “count = 5” initially:
S0: producer execute register1 = counter{register1 = 5}
S1: producer execute register1 = register1 + 1 {register1 = 6}
S2: consumer execute register2 = counter {register2 = 5}
S3: consumer execute register2 = register2 -1 {register2 = 4}
S4: producer execute counter = register1{count = 6 }
S5: consumer execute counter = register2 {count = 4}

解決方式:
  1. disable interrupt
  2. Critical Section design


Each process must ask permission to enter critical section in entry section, ...












Solution to critical-section problem
  1. Mutual Exclusion
    Def:
    最多只允許一個process在其Critical Section內活動,若其它processes也想進入它們本身的Critical Section,則必須等待值到該process離開Critical Section才能再擇一進入(即不允許多個processes在各自Critical Section內同時活動)
  2. Progress
    Def:
    1. 不想進入Critical Section的process(即在Remainder Section內活動),不能妨礙(阻止)其它process進入Critical Section
      (不能參與進入Critical Section的決策過程)
    2. 決定哪個process可以進入Critical Section的時間是有限的(不能無窮止境)⇒No DeadLock
    3. 設計 entry section(入口) exit section (出口)
  3. Bounded Waiting
    Def:
    自process提出欲進入Critical Section的請求到其獲准進入Critical Section的等待時間是有限的(⇒No starvation)
    若有n個processes欲進入Critical Section,則任一process至多等待(n-1)以後必可進入Critical Section


Peterson's algorithm (software-based)
turn: 指出輪到誰進入CS了
flag[i]: 指出i 是否想進入CS

需滿足
  1. Mutual exclusion
  2. progress
  3. bounded waiting


Hardware
Uniprocessor- can disable interrupt
現代系統直接提供 Atomic特性的指令,讓程式碼可以在單一時間點完成,且不會被中途插斷

  • Test-and-Set
    • 符合 mutual exclusion
    • 不符合 progress
    • 不符合 bounded waiting
    • -Pi已進入 C.S.,而 Pj卡在 while loop 中等待進入 C.S.,此時若 Pi離開 C.S. 後又馬上企圖進入 C.S.,則 Pi很有可能再度先於 Pj執行 Test_and_Set 指令,而又再度進入 C.S.。∴ Pj可能 Starvation 。
  • SWAP
    • 符合 mutual exclusion
    • 不符合 progress
    • 不符合 bounded waiting


Semaphore
用來解決critical section 及 同步問題
有一個整數變數Semaphore S,通常初始為1,
有兩個atomic指令,wait ()和signal()。也是個mutex lock.
必須要保證沒有兩個process可以同時執行wait ()和signal(),也就是說要把wait ()和signal()也放入critical section。
could have busy waiting in CS implementation
Semaphore with no busy waiting
  • two operations
    • block: place process 在適合的waiting queue,這個process 會invoke operation
    • wakeup: 將process 從 waiting queue 放到 ready queue

problems with Semaphore
  1. starvation
  2. deadlock

Deadlock
two or more processes 在等 event, 這個event是只能被其中一個waiting processes 所cause的
Starvation
process 長期無法取得資源而形成 indefinite blocking
(有deadlock 一定有starvation, 有starvation不一定有deadlock )
Priority Inversion
lower priority process hold a lock needed by high priority process.
[Ex]
p1 > p2 > p3
p1 請求p3資源,要是p2 搶佔了p3的資源,造成p1無法執行 

priority-inheritance : p3 繼承p1的優先權,使得p2無法搶奪



哲學家用餐問題
  1. 最多允許四個人用餐,但會造成starvation
  2. 只有兩邊的筷子 都可以拿,才拿。  打破 hold and wait
  3. 基數號 拿左 再拿右。 偶數號 拿右再拿左。 打破 circular wait




沒有留言:

張貼留言