深入解析IOCP

http://cczjp89.blog.51cto.com/2707533/823158


1. 介紹

1.1 高併發服務器

(1)要求大規模的連接/會話可能同時進行

(2)列子:Web服務器郵件服務器

 

1.2 線程池架構

(1) 每個連接分配一個線程,將導致過多的線程。

(2) 線程消耗內存,比如堆棧等等。

(3) 操作系統創建和關閉線程,都將花費很多的時間在線程之間的切換

 

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 {

union {

DWORD dwOemId;

struct {

WORD wProcessorArchitecture;

WORD wReserved;

};

};

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress;

DWORD_PTR dwActiveProcessorMask;

DWORD dwNumberOfProcessors;

DWORD dwProcessorType;

DWORD dwAllocationGranularity;

WORD wProcessorLevel;

WORD wProcessorRevision;

} 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內部結構

 

Note:

(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 程序流程圖

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章