[Operating System Cheat sheat] — Race Condition Solving

Leon .
6 min readSep 22, 2020

--

  1. Shared Variable
  2. Shared Memory
  3. Race Condition Problem
  4. Solving Race Condition

Shared Variable

表示為Process間皆可存取的變數型態,有點像是threads之間對global /static變數之存取那樣,每個Process都有機會搶得CPU 而 Access /Write Shared Variable,通常在Shared Memory的IPC機制下會看到Shared Variable 的使用

Shared Memory

共享記憶體,顧名思義就是允許兩個不相關的Process訪問同一塊Logical Memory,是兩個正在執行的Process之間共享和傳遞資料的一種非常有效率的方式。不同Process之間共享的記憶體通常為同一段Physical Memory。Process可以將同一段Physical Memory連線到他們自己的地址空間中,所有的程序都可以訪問共享記憶體中的地址。如果某個Process向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他Process

使用Page Table可以達到此效果

對於上圖:當兩個Process通過Page Table將虛擬地址對映到實體地址時,在實體地址中有一塊共同的記憶體區,即共享記憶體,這塊記憶體可以被兩個Process同時看到。這樣當一個Process進行Write時,另一個Process 作Read就可以實現程序間通訊。

但是,我們要確保一個Process在寫的時候不能被讀,因此我們對Shared Variable的存取實現同步與互斥,也就是必須解決"Race Condition" 問題

p.s. Shared memory do not require kernel intervention at all

Race Condition Problem

若未對Shared Variable存取提供任何互斥存取控制之同步機制,則會造成共享變數的最終結果值,會因為Process之間的交錯執行有不同的結果值

舉例來說 :

有兩條Concurrent Process Pi 以及Pj 正在執行以下程式碼:

而Compiler會將其轉譯成以下類似基本指令來讓CPU執行 :

而Pi , Pj依照不同的指令執行順序便會有不同之執行結果 (i最終可能為1或2)

更多關於Race Condition Problem 的練習...

Solving race condition method

我們已經知道race condition 對資料的危害,那解決的方法有以下兩種:

  1. Disable Interrupt
  2. Critical Section Design

Disable Interrupt

Process在對共享變數存取之前,先停止CPU的Interrrupt機制,等到完成共享
變數存取後,才Enable Interrupt機制,如此可保護Process存取共享變數期間,CPU不會被Preempt,使得此次存取可以是 Atomically Execution

優點

  • 簡單,相對容易實現
  • 適用於Uniprocessor System(單ㅡCPU)

缺點

  • 不適用於 Multiprocessors System

因為Only disable 一顆CPU的Interrupt機制,是無法防止Race Condition(其他 CPU上執行的Process,仍有存取共享變數的可能),必須Disable「全部」CPUs' Interrupt,才可防止 Race Condition,但此舉會大幅降低cpu utilization(因為無法平行執行)

  • 風險很高

必須信任User process 在 Disable Interrupt 後,在短時間内可以再Enable Interrupt;否則 CPU never come back to kernel ,產生極大風險

Disable Interrupt作法是不會放給User Program的,它通常只存在kernel的 implement中(只有OS Developers 可以用)

If a user-level program is given the ability to disable interrupts,then it can disable timer interrupt and prevent context switching from taking place,thereby allowing it to use the processor without letting other process to execute

Crical Section Design

對共享變數之存取進行管制:當Pi取得共享變數存取權利,在它
尚未完成共享變數存取期間,任何其他Process無法存取共享變數。

我們將程式分成 4 個區塊 :

  • Entry section (C.S的進入點)
  • Critical section (C.S)
  • Exit section (C.S的進入點)
  • Remain section (其餘程式部分,aka:RS)

而Critcal Section Design便是在Entry section以及Exit section做設計
設法對Crical Section的出入口做出控管的機制。

優點

  • 適用於Multiprocessors System

缺點

  • 不適用於Uniprocessor System(單ㅡCPU)
  • 設計相對較為複雜

這些優缺點應該是使用 Spinlock技巧在critical section design的優缺點

--

--

Leon .
Leon .

Written by Leon .

Record my life experience and knowledge , keep enthiusastic attitude to explore the world , that’s what I live for.

No responses yet