生活随笔
收集整理的這篇文章主要介紹了
深入解析IOCP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?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?程序流程圖
?
總結
以上是生活随笔為你收集整理的深入解析IOCP的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。