2018-2019-1 20165228 《資訊安全系統設計基礎》第八週學習總結
2018-2019-1 20165228 《資訊安全系統設計基礎》第八週學習總結
教材學習內容總結
併發程式設計
- 併發:邏輯控制流在時間上重疊
- 併發程式:使用應用級併發的應用程式稱為併發程式。
三種基本的構造併發程式的方法: - 程序,用核心來呼叫和維護,有獨立的虛擬地址空間,顯式的程序間通訊機制。
- I/O多路複用,應用程式在一個程序的上下文中顯式的排程控制流。邏輯流被模型化為狀態機。
執行緒,執行在一個單一程序上下文中的邏輯流。由核心進行排程,共享同一個虛擬地址空間。 基於程序的併發程式設計
構造併發程式最簡單的方法就是用程序。一個構造併發伺服器的自然方法就是,在父程序中接受客戶端連線請求,然後建立一個新的子程序來為每個新客戶端提供服務。
基於程序的併發伺服器通常伺服器會執行很長的時間,所以我們必須要包括一個 SIGCHLD 處理程式,來回收僵死 (zombie) 子程序的資源。當 SIGCHLD 處理程式執行時, SIGCHLD 訊號是阻塞的,而 Unix 訊號是不排隊的。
父子程序必須關閉它們各自的 connfd 拷貝。父程序必須關閉它的已連線描述符,以避免儲存器洩漏。直到父子程序的 connfd 都關閉了,到客戶端的連線才會終止。
程序的優劣
- 優點:一個程序不可能不小心覆蓋另一個程序的虛擬儲存器,這就消除了許多令人迷惑的錯誤。
- 缺點:獨立的地址空間使得程序共享狀態資訊變得更加困難。為了共享資訊,它們必須使用顯式的IPC(程序間通訊)機制。基於程序的設計的另一個缺點是,它們往往比較慢,因為程序控制和 IPC 的開銷很高。
基於 I/O 多路複用的併發程式設計
- I/O多路複用技術的基本思路:使用select函式,要求核心掛起程序,只有在一個或多個I/O事件發生後,才將控制返回給應用程式
- 狀態機就是一組狀態、輸入事件和轉移,轉移就是將狀態和輸入時間對映到狀態,自迴圈是同一輸入和輸出狀態之間的轉移。
I/O 多路複用技術的優劣 - 優點:
它比基於程序的設計給了程式設計師更多的對程式行為的控制。
一個基於 I/O 多路複用的事件驅動伺服器是執行在單一程序上下文中的,因 此每個邏輯流都能訪問該程序的全部地址空間。 - 缺點:編碼複雜且不能充分利用多核處理器。
基於執行緒的併發程式設計 - 執行緒:執行在程序上下文中的邏輯流。
執行緒有自己的執行緒上下文,包括一個唯一的整數執行緒ID、棧、棧指標、程式計數器、通用目的暫存器和條件碼。所有執行在一個程序裡的執行緒共享該程序的整個虛擬地址空間
主執行緒:每個程序開始生命週期時都是單一執行緒。
對等執行緒:某一時刻,主執行緒建立的對等執行緒。
進度圖
進度圖是將n個併發執行緒的執行模型化為一條n維笛卡爾空間中的軌跡線,原點對應於沒有任何執行緒完成一條指令的初始狀態。- 轉換規則:
合法的轉換是向右或者向上,即某一個執行緒中的一條指令完成
兩條指令不能在同一時刻完成,即不允許出現對角線
程式不能反向執行,即不能出現向下或向左
訊號量定義:
type semaphore=record
count: integer;
queue: list of process
end;
var s:semaphore;
讀者—寫者問題:
(1)讀者優先,要求不讓讀者等待,除非已經把使用物件的許可權賦予了一個寫者。
(2)寫者優先,要求一旦一個寫者準備好可以寫,它就會盡可能地完成它的寫操作。
(3)飢餓就是一個執行緒無限期地阻塞,無法進展。
其他併發問題
執行緒安全
當且僅當被多個併發執行緒反覆地呼叫時,它會一直產生正確的結果。可重入性
顯式可重入的:所有函式引數都是傳值傳遞,沒有指標,並且所有的資料引用都是本地的自動棧變數,沒有引用靜態或全劇變數。
隱式可重入的:呼叫執行緒小心的傳遞指向非共享資料的指標。
競爭
- 發生的原因:一個程式的正確性依賴於一個執行緒要在另一個執行緒到達y點之前到達它的控制流中的x點。也就是說,程式設計師假定執行緒會按照某種特殊的軌跡穿過執行狀態空間,忘了一條準則規定:執行緒化的程式必須對任何可行的軌跡線都正確工作。
- 消除方法:動態的為每個整數ID分配一個獨立的塊,並且傳遞給執行緒例程一個指向這個塊的指標
死鎖 - 死鎖:一組執行緒被阻塞了,等待一個永遠也不會為真的條件。