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

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

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

  本文我將從內(nèi)核對(duì)象IO完成端口開始介紹,然后來瞧瞧.NET BCL中的FileStream.BeginRead是如何利用IO完成端口來實(shí)現(xiàn)的。

  IO完成端口(IO Completion Port)

  大多數(shù)人應(yīng)該或多或少地聽說過IO完成端口這么個(gè)東西,而且也知道它是實(shí)現(xiàn)高性能IO,高伸縮性應(yīng)用的尚方寶劍。IO完成端口是一個(gè)非常復(fù)雜的內(nèi)核對(duì)象,其實(shí)現(xiàn)的也非常巧妙,細(xì)細(xì)琢磨還是非常有意思的。

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

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

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

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

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

NET技術(shù).NET異步編程:IO完成端口與BeginRead,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 青草在线观看视频 | 99久久亚洲 | 国产精品外围在线观看 | 快乐激情网 | 美女岔开腿露出粉嫩花苞 | 人妖干美女 | 国产亚洲精品AV麻豆狂野 | 欧美成人一区二免费视频 | 在线观看国产精美视频 | 成人性视频全过程 | 99热在线精品免费全部my | 小护士大pp | 我半夜摸妺妺的奶C了她软件 | 涩涩伊人久久无码欧美 | 国产色精品VR一区二区 | 久久99综合国产精品亚洲首页 | 色婷婷五月综合久久中文字幕 | 双腿被绑成M型调教PLAY照片 | 欧美三级在线完整版免费 | 欧美 国产 日产 韩国 在线 | 老司机亚洲精品影院 | 久久亚洲AV成人无码国产漫画 | 两个人的视频hd全免费 | 亚洲 欧美 国产 伦 综合 | 国产精品乱人无码伦AV在线A | 好男人WWW免费高清视频在线 | 狠狠色狠狠色综合日日32 | 一区一区三区产品 | 日韩欧美亚洲精品综合在线 | 黄色三级网站在线观看 | 朋友的娇妻好爽好烫嗯 | 强姧伦久久久久久久久 | 久久这里只有精品2 | 乌克兰成人性色生活片 | 国产精华av午夜在线观看 | 国产免费麻传媒精品国产AV | 床伴在线观看免费高清完整泰剧第四集 | 日夜啪啪一区二区三区 | 嫩草欧美曰韩国产大片 | 嗯好大好猛皇上好深用力 | 成人免费看片45分钟 |