CSAPP讀書日記 第十二章 併發程式設計

2021-09-11 01:38:34 字數 1223 閱讀 1975

構造併發程式的方法:

構造併發程式最簡單的方法就是用程序,使用像fork、exec和waitpid之類的函式。

特點:父子程序之間共享檔案表,但是不共享使用者位址空間。

優點:乙個程序不會覆蓋另乙個程序的虛擬記憶體。

缺點:程序共享狀態資訊變得困難,必須使用顯式的ipc(程序間通訊)機制。

結果就是這種設計方式比較慢,因為程序控制和ipc的開銷很高。

i/o多路復用(i/o multiplexing)技術基本的思想就是使用select函式,要求核心掛起程序,只有在乙個或者多個i/o事件發生後,才將控制返回給應用程式。

i/o多路復用可以用作併發事件驅動(event-driven)程式的基礎。

在事件驅動程式中,某些事件會導致流向前推進。

一般的思路是將邏輯流模型化為狀態機(state machine):

通常把狀態機畫成有向圖:

這種設計的優點有:

這種設計的缺點有:

現代高效能伺服器(比如node.js,nginx和tornado)使用的都是基於i/o多路復用的事件驅動的程式設計方式,主要是因為相比於程序和執行緒的方式,它有明顯的效能優勢。

執行緒(thread)就是執行在程序上下文中的邏輯流:

基於執行緒的邏輯流結合了基於程序和基於i/o多路復用的流的特性。

每個程序開始生命週期時都是單一執行緒,這個執行緒成為主線程(main thread)。

在某乙個時刻,主線程建立乙個對等執行緒(peer thread),從這個時間點開始,兩個執行緒就併發地執行。

最後,因為主線程執行乙個慢速系統呼叫,或者被系統的間隔計時器中斷,控制就會通過上下文切換傳遞到對等執行緒。

對等執行緒執行一段時間,然後控制傳遞歸主線程。

執行緒不同於程序在於:

第十二章 併發程式設計

1 併發 邏輯控制流在時間上重疊 2 併發程式 使用應用級併發的應用程式稱為併發程式。3 三種基本的構造併發程式的方法 1 需要乙個sigchld處理程式,來 僵死子程序的資源。2 父子程序必須關閉各自的connfd拷貝。對父程序尤為重要,以避免儲存器洩露。3 套接字的檔案表表項中的引用計數,直到父...

第十二章 併發程式設計

構建併發伺服器的方法 在父程序中接收客戶端連線請求,然後建立乙個新的子程序來為每個新客戶端提供服務。假設現在有兩個客戶端和乙個伺服器,伺服器正在監聽乙個監聽描述符上的連線請求。併發過程如下 1 伺服器接受客戶端1的連線請求 2 伺服器派生乙個子程序為這個客戶端1服務 3 伺服器接受另乙個客戶端2的連...

第十二章 檔案

文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...