chapter 3. 併發設計空間
一、迴圈、併發及反應式伺服器
迴圈伺服器在處理後續請求之前,會完整地處理每乙個客戶請求。因此,在處理乙個請求時,迴圈伺服器要麼將其他請求排成佇列,要麼忽略它們。
迴圈伺服器適合以下兩種服務:
l短期服務
l不經常執行的服務
在內部,迴圈伺服器常常在「單程序」位址空間中執行服務請求。
併發伺服器同時處理多個客戶請求。根據os和硬體平台不同,並髮式伺服器在執行它的服務時,要麼使用多執行緒,要麼使用多程序。
併發伺服器非常適合「i/o操作頻繁」的服務和「執行時間會變化」的長週期服務。
反應式伺服器幾乎是同時處理多個請求——儘管所有處理實際上在乙個執行緒中完成的。多執行緒尚未在os平台上廣泛普及之前,併發處理通常是通過「同步事件多路分離」策略來實現的:多個服務請求由乙個「單執行緒程序」依次迴圈處理。
二、多程序與多執行緒
程序是一種os實體,用以提供「執行程式指令」的環境。
每乙個程序都管理某些資源,如虛擬記憶體,i/o控制代碼,訊號處理等,並借助記憶體管理單元(mmu)硬體,防止自身遭受其他os程序破壞。
建立程序:unix
fork()
win32 createprocess()
執行緒是一組單獨的指令序列,執行在程序的保護範圍之內。
建立執行緒:unix
pthread_create()
win32 createthread()
在並髮式網路應用程式的實現中,如果多個操作在各自的「執行緒」中執行,而不是在各自的「程序」中執行,以下「開發」開銷就得以降低。
l執行緒建立與環境切換
和程序相比,執行緒維護的狀態資訊要少。例如,在乙個程序中切換執行緒時,程序範圍內的資源(如虛擬位址對映和快取)不需要改變。
l同步在排程、執行乙個應用程式執行緒時,核心模式和使用者模式之間的切換可能不必要。而且,「程序內」同步不需要os核心干預。「程序間」同步則更昂貴。
l資料複製
執行緒可以通過「程序區域性記憶體」共享資訊,這具有以下優點:
(1)較之通過「共享記憶體」或「本地ipc」機制進行程序間通訊,通過「程序區域性記憶體」通訊往往更有效率;因為資料不需要通過核心來複製。
(2)在「程序區域性記憶體」中,使用c++物件將更為容易,因為類的虛函式表不會存在「記憶體區域性」問題。
但是,使用「多執行緒」實現「並髮式」應用程式,也存在以下侷限性:
l效能損失
l健壯性降低
l缺乏高精度的訪問控制
三、程序/執行緒建立策略
急式建立策略:在伺服器建立期間,會有乙個或多個os程序/執行緒預先建立。
這些「熱啟動」的執行資源形成了乙個池(pool),它改善了響應時間,但也增加了「請求被處理之前啟動服務」的開銷。
隨需建立策略:在「客戶連線」或「資料請求」到來時建立新程序或執行緒。
優點:資源消耗降低。
缺點:由於建立程序/執行緒和啟動服務時會帶來開銷,因而,這些策略會降低「重負載」伺服器的效能和實時系統的確定性。
四、使用者、核心及混合執行緒模型
排程是os提供的主要機制,用來確保應用程式正確使用主機的cpu資源。
在「多執行緒」程序中,執行緒是「排程」和「執行」的單元。
執行緒所處的競爭範圍有2種:
l程序競爭範圍:各個執行緒在同一程序中競爭「被排程的cpu時間」。
l系統競爭範圍:執行緒直接和「系統範圍」內的其他執行緒競爭。
當今常見的作業系統中,一共實現了三種執行緒排程模型:
ln:1使用者執行緒模型
l1:1核心執行緒模型
ln:m混合執行緒模型
五、分時及實時排程級別
除了以上講的「競爭範圍」和「執行緒模型」之外,os平台一般還會定義一些策略和優先順序,用以進一步影響「排程」行為。
分時排程級別:通用型的os排程器著眼於傳統的分時、互動式環境。
該排程器往往具有以下特徵:
l基於優先順序 —— 具有最高優先順序的可執行執行緒是下乙個將被排程執行的線
程。l公平 —— 在分時排程器中,根據執行緒使用cpu的情況,執行緒的優先順序會發生變化。
l搶占 —— 如果乙個低優先順序執行緒正在執行,此時,乙個較高優先順序的執行緒轉為可執行狀態,那麼,排程器會搶占低優先順序執行緒,讓高優先順序執行緒執行。
l時間片 —— 用於迴圈執行「具有相同優先順序」的執行緒。
實時排程級別:在分時排程器級別中,執行緒的執行通常沒有固定次序。提供「實時排程級別」,以限制「最壞情況」下排程「使用者執行緒」或「核心執行緒」所需的時間。
該排程器支援以下兩種策略或其一:
l輪流 —— 根據乙個時間量,指定乙個執行緒被另乙個「具有相同優先順序」的實時執行緒搶占之前,能夠執行的最長時間。
l先進先出 —— 高優先順序執行緒能根據需要長時間執行,直到它自願放棄控制,或被另乙個具有更高優先順序的實時執行緒搶占。
如果乙個os同時支援「分時」和「實時」排程級別,則「實時」執行緒總是比任何「分時」執行緒都具有更高的執行優先順序。
六、「基於任務」與「基於訊息」的體系
併發體系是聯絡以下要素的紐帶:
1. cpu —— 為應用程式**提供執行環境;
2. 「資料」和「控制」訊息 —— 在乙個或多個應用程式或網路裝置之間傳送和接收;
3. 執行任務的服務 —— 當訊息到達、離開時,基於訊息執行服務。
在乙個網路應用程式中,併發體系是影響「環境切換」、「同步」、「排程」和「資料移動」的成本,從而影響程式效能的幾大要素之一。
併發體系的規範型別有兩種:
l基於任務的併發體系:根據應用程式中的「服務功能單元」來組織多個cpu。在這一體系中,任務是主動的,任務中處理的訊息是被動的。
例如:「生產者/消費者模式」
l基於訊息的併發體系:「從應用程式和網路裝置接收到的訊息」來組織cpu。在這一體系中,訊息是主動的,任務是被動的。
例如:「乙個請求乙個執行緒」;「乙個連線乙個執行緒」;「執行緒池」
c 網路程式設計學習筆記 1
前序 在多個os平台上開發和移植網路應用程式時,將面臨錯綜複雜的挑戰。這些複雜性的表現形式各異 網路協議不相容,在不同軟 硬體平台上具有不同的api和語義的元件庫,os本身的程序間通訊 ipc 機制和併發機制的侷限性造成的 偶發複雜性 直接針對os api程式設計會導致以下兩個問題 1 容易出錯。因...
C程式語言學習筆記(4)
還記得基礎 一 中提到了一點 的簡化嗎?將多個連續的空格用乙個空格代替的程式第二個版本。flag c 由於本人的c語言水平有限,還談不上能分析 的優化功能,目前就以簡化來分析自己 c語言心得。這篇只是簡單的介紹一下可以用簡潔的語言來實現功能,鍛鍊我們的c語言思維能力。先看乙個病毒程式,哈哈哈!也算是...
C (泛型程式設計)學習筆記 4
1.函式const char c str c str 函式返回乙個指向正規c字串的指標,內容與本string串相同.這是為了與c語言相容,在c語言中沒有string型別,故必須通過string類物件的成員函式c str 把string 物件轉換成c中的字串樣式。2.sscanf 與scanf 類似,...