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