深入解析IOCP

2021-06-13 04:05:11 字數 2614 閱讀 4207

1. 介紹

1.1 高併發伺服器

(1)要求大規模的連線

/會話可能同時進行

(2)列子

:web

伺服器, 

郵件伺服器

1.2 執行緒池架構

(1) 每個連線分配乙個執行緒,將導致過多的執行緒。

(2) 執行緒消耗記憶體,

比如堆疊等等。

2. 執行緒模型

2.1 基於會話模型

(1) 每個執行緒服務於乙個客戶端,

比如http

會話。

(2) 執行緒被用於狀態跟蹤和cpu

排程。

(3) 活躍執行緒的數量等於併發客戶端會話的數量

2.2 基於i/o模型

(1) 將狀態跟蹤從cpu

排程中分離出來。

(2) 執行緒是所有同質,僅為i/o

呼叫保持狀態。

(3) 乙個執行緒可以服務於不同的會話,在不同的時刻。

(4) 乙個會話可以被服務,通過不同的執行緒,在不同的時刻。

(5) 因此,從乙個執行緒不是專門對於乙個會話,僅僅專門對於乙個i/o

請求處理。

3. 基於i/o

的執行緒排程

3.1 併發限制

(1) 執行緒是和cpu繫結

最大活躍執行緒的個數 == cpu個數

(2) 執行緒是和i/o繫結

最大的工作執行緒個數 >= i/o

並行個數

(3) 根據實驗/

基準設定

3.2 執行緒池大小

(1) 執行緒是和cpu繫結

等於併發限制數

(2) 執行緒是和i/o繫結

最大的工作執行緒個數 >= i/o

並行個數

(3) 根據實驗/

基準設定

3.3 查詢系統資訊

typedef struct _system_info  system_info;

4. win32 完成埠

4.1 什麼是iocp

是乙個win32 

機制,方便於帶有控制併發的伺服器的併發執行。

4.2 iocp做什麼

(1) 乙個win32 

核心物件。

(2) 有用於windows nt 

和 後面的執行。

(3) 幫助維持重複使用的記憶體池。

刪除執行緒建立/

終結負擔

(4) 分配執行緒,控制併發

最小化的執行緒上下文切換

(5) 優化執行緒排程

提高cpu

和記憶體緩衝的命中率

4.3 基本步驟

4.4 建立iocp

埠和關聯裝置

4.5 iocp內部結構

(1) 等待執行緒採用lifo

排程,減少了執行緒上下文的切換。只要

i/o請求完成的夠慢,使乙個執行緒能夠處理他們,系統就始終喚醒同乙個執行緒。

(2) 當乙個裝置的非同步i/o

請求完成時,系統檢查是否有關聯了完成埠。如果是,那麼系統就想該裝置的完成埠

i/o完成佇列加入完成的

i/o請求。

(3) iocp是乙個核心物件,它的值和

i/o完成佇列的位址指標是相同的。

4.6 i/o完成佇列

(1) 當有乙個非同步i/o

完成時,核心將檢查是否該裝置已經關聯了某個

iocp

。如果是,則乙個完成資料報將被新增到完成佇列中。

(2) 獲取完成i/o請求

(3) 人工投遞i/o

請求包

5. 執行緒管理

5.1 執行緒狀態型別

5.2 執行緒狀態轉換

6. 基於i/o

的並行伺服器

6.1 程式流程圖

Activity Intent深入解析

學習android sdk有段時間了,對activity intent的學習與使用都比較了解。第一次完整的學習activity intent後,我就感覺這似乎與windows com技術有些似曾相識的感覺,寫了一篇將activity 與 com 做了比較,但是一直感覺意猶未盡,前幾天在程式設計師雜誌...

HTTP 深入解析

1.cookie 儲存在客戶端 cookie 的類別 cookie 的屬性 了解 cookie 的應用場景 同源http請求 攜帶cookie 原生ajax請求方式 xhr.withcredentials true 支援跨域傳送cookies xhr.send jquery的ajax的post方法請...

volatitle深入解析

今天來介紹一下volatitle volatitle是乙個確保共享變數能夠被準確和一致地更新的關鍵字 保證可見性 只能對變數使用 在對有volatile修飾符修飾的共享變數進行寫操作時,彙編 回多一條lock字首的指令。該指令有如下兩個作用 將當前快取行的資料回寫到記憶體中 使其他cpu裡快取了該記...