天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

.NET異步編程:IO完成端口與BeginRead

  寫這個系列原本的想法是討論一下.NET中異步編程風格的變化,特別是F#中的異步工作流以及未來的.NET 5.0中的基于任務的異步編程模型。但經過前幾篇文章(為什么需要異步,傳統的異步編程,使用CPS及yield實現異步)的發表后,很多人對IO異步背后實現的原理以及為什么這樣能提高性能很感興趣。其實我本不想花更多的文字在這些底層實現的細節上,一來我并不擅長這些方面,二來我們使用.NET的異步IO就不需要關心這些底層東西,因為已經為你封裝完備了。不過為了避免大家一再在這上面商討,我還是在這個系列中間插入了一篇來解釋一下。

  本文我將從內核對象IO完成端口開始介紹,然后來瞧瞧.NET BCL中的FileStream.BeginRead是如何利用IO完成端口來實現的。

  IO完成端口(IO Completion Port)

  大多數人應該或多或少地聽說過IO完成端口這么個東西,而且也知道它是實現高性能IO,高伸縮性應用的尚方寶劍。IO完成端口是一個非常復雜的內核對象,其實現的也非常巧妙,細細琢磨還是非常有意思的。

  創建高伸縮性的應用的一個基本原則就是:創建更少的線程。線程數更少首先消耗的資源就少,每個線程的創建除了要浪費CPU時間外,還要創建一系列的數據結構用來保存線程相關的一些信息:用戶棧,線程上下文,內核棧等。這個總共加起來大概1.5M左右,那么你算算你的32位機器總共能使用多少內存?那么對應地能創建多少線程?可能有人講那對于64位的就無所謂了。嗯,在資源占用這方面64位確實不用擔心。但是系統中可運行的線程數越多,你的CPU數又是有限的(8個?80個?)。Windows的任務調度機制是每個線程會運行一個時間片,然后Windows搶占式的調度另一個線程運行。那么線程數越多,Windows勢必要進行更頻繁的線程上下文切換。線程上下文切換對系統性能的影響在這里我就不多說了,你可以搜搜資料。

  那么如何做到創建更少的線程,而又干更多的事兒呢?答案就是“不等待”。相對CPU來說,IO設備的速度簡直低的要命。就好像飛機和拖拉機的差別一樣,我們可不能讓拖拉機拖了飛機的后退兒。而IO完成端口就是為了這個而生的:創建更少的線程,干更多的事兒。

  IO完成端口首先不是一個我們看得見摸得著的什么插口,也和我們常說的80這樣的端口不同。你可以將其理解為一個數據結構或一個對象(下面我會用C#的代碼來輔助講解IO完成端口,僅僅是講解,這些代碼并不是真實的實現):

  Windows提供了一個CreateIoCompletionPort API來創建IO完成端口,實際上這個API有兩個作用:創建IO完成端口和將一個IO設備與該端口綁定。創建IO完成端口時有一個很重要的參數:指定同時最多能有多少個線程并行運行,這就是為了保證更少的線程,如果你將這個數值指定為0,那么默認值就會是你機器的CPU數。IO端口里還有一個IO設備句柄列表,你可以將很多設備句柄與這個端口綁定(文件、Socket等):

//函數原型
HANDLE CreateIoCompletionPort(
//設備句柄
HANDLE hFile,
//已有的IO完成端口句柄,如果這里已經指定,則是將前面指定的設備與該端口綁定
HANDLE hExistingCompletionPort,
//因為一個IO完成端口可以綁定很多設備,可以用這個來區分
ULONG_PTR CompletionKey,
//允許同時運行的線程數
DWORD dwNumberOfConcurrentThreads
);
//創建一個IO完成端口
HANDLE hIoPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,2);
//創建文件,如果要異步訪問文件則需要指定FILE_FLAG_OVERLAPPED
HANDLE hFile = CreateFile(..);
//將上面創建的文件句柄與剛才創建的IO完成端口綁定,不僅僅是文件可以
CreateIoCompletionPort(hFile,hIoPort,1,2);

NET技術.NET異步編程:IO完成端口與BeginRead,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 日本一区二区三区在线观看网站 | 午夜福利试看120秒体验区 | 最近的中文字幕2019国语 | 在线观看亚洲专区5555 | 丰满大屁俄罗斯肥女 | 在线视频免费观看 | 精品国产乱码久久久人妻 | 国产成人免费网站在线观看 | 偷偷鲁手机在线播放AV | 美女坐脸vk | 亚洲欧美综合乱码精品成人网 | 饥渴的40岁熟妇完整版在线 | 中文字幕在线久热精品 | 91次元黄色观看 | 国产GV天堂亚洲国产GV刚刚碰 | 男女性杂交内射妇女BBWXZ | 国产色婷亚洲99精品AV | 女人麻豆国产香蕉久久精品 | 最近在线视频观看2018免费 | 日本免费无码A专区在线观看 | 国产品无码一区二区三区在线 | 免费国产成人高清在线观看视频 | 免费网站在线观看国产v片 免费完整版观看 | 偷拍 自怕 亚洲 在线 | 欧美白人极品性喷潮 | 国产精品九九久久 | 亚洲haose在线观看 | 久久91精品国产91久久户 | 龙泽罗拉av| 外女思春台湾三级 | 国产AV一区二区三区传媒 | 国产露脸无码A区久久蘑菇 国产露脸无码A区久久 | 思思99热久久精品在线6 | 国产高潮久久精品AV无码 | 国产亚洲精品久久久久5区 国产亚洲精品久久久久 | 亚洲免费在线观看视频 | 国产精品亚洲精品日韩电影 | 亚洲国产在线观看免费视频 | 超碰98人人插 | 成人国产精品玖玖热色欲 | 天堂tv免费tv在线tv香蕉 |