【网络编程】之五、异步模型
注:本文部分轉(zhuǎn)載
一:select模型
二:WSAAsyncSelect模型
三:WSAEventSelect模型
四:Overlapped I/O?事件通知模型
五:Overlapped I/O?完成例程模型
六:IOCP模型
老陳有一個(gè)在外地工作的女兒,不能經(jīng)常回來,老陳和她通過信件聯(lián)系。他們的信會(huì)被郵遞員投遞到他們的信箱里。這和Socket模型非常類似。下面我就以老陳接收信件為例講解Socket I/O模型~~~
一:select模型
老陳非常想看到女兒的信。以至于他每隔10分鐘就下樓檢查信箱,看是否有女兒的信?~~~~~
在這種情況下,"下樓檢查信箱"?然后回到樓上耽誤了老陳太多的時(shí)間,以至于老陳無法做其他工作。
select模型和老陳的這種情況非常相似:周而復(fù)始地去檢查......?如果有數(shù)據(jù)......接收/發(fā)送?.......
select模型是winsock中最廣泛使用的模型之一,其核心就是select函數(shù):
[cpp]?view plaincopy
要注意的是,readfds,writefds,exceptfds三個(gè)參數(shù)必須至少有一個(gè)不為空。在任何不為空的集合中,必須包含至少一個(gè)套接字句柄。否則select函數(shù)就沒有任何東西可以等待了。 ? 再來說最后一個(gè)參數(shù),他是指向timeval結(jié)構(gòu)的指針。
[cpp]?view plaincopy
二:WSAAsyncSelect模型
后來,老陳使用了微軟公司的新式信箱。這種信箱非常先進(jìn),一旦信箱里有新的信件,蓋茨就會(huì)給老陳打電話:喂,大爺,你有新的信件了!從此,老陳再也不必頻繁上下樓檢查信箱了,牙也不疼了,你瞅準(zhǔn)了,藍(lán)天......不是,微軟~~~~~~~~
微軟提供的WSAAsyncSelect模型就是這個(gè)意思。
WSAAsyncSelect模型是Windows?下最簡單易用的一種Socket I/O模型。使用這種模型時(shí),Windows會(huì)把網(wǎng)絡(luò)事件以消息的形勢通知應(yīng)用程序。
這個(gè)模型是以消息為基礎(chǔ)的,關(guān)鍵就是WSAAsyncSelect函數(shù)了:
將socket消息發(fā)送到hWnd窗口上面;然后在那里處理相應(yīng)的消息。
他喝WSAEventSelect模型都提供讀寫數(shù)據(jù)能力的異步通知,不提供異步數(shù)據(jù)傳送。(Overlapped IO提供) 他們在系統(tǒng)開銷不大的時(shí)候可以同時(shí)處理多個(gè)連接。 相比之下select模型還需要建立fd_set結(jié)構(gòu)。 ?但是這里你必須要使用一個(gè)窗口來接收消息,如果套接字多了該怎么辦;
三:WSAEventSelect模型
后來,微軟的信箱非常暢銷,購買微軟信箱的人以百萬計(jì)數(shù)......以至于蓋茨每天?24小時(shí)給客戶打電話,累得腰酸背痛,喝蟻力神都不好使~~~~~~
微軟改進(jìn)了他們的信箱:在客戶的家中添加一個(gè)附加裝置,這個(gè)裝置會(huì)監(jiān)視客戶的信箱,每當(dāng)新的信件來臨,此裝置會(huì)發(fā)出"新信件到達(dá)"聲,提醒老陳去收信。蓋茨終于可以睡覺了。
此模型也是以時(shí)間為基礎(chǔ)的網(wǎng)絡(luò)事件通知。
四:Overlapped I/O?事件通知模型
后來,微軟通過調(diào)查發(fā)現(xiàn),老陳不喜歡上下樓收發(fā)信件,因?yàn)樯舷聵瞧鋵?shí)很浪費(fèi)時(shí)間。于是微軟再次改進(jìn)他們的信箱。新式的信箱采用了更為先進(jìn)的技術(shù),只要用戶告訴微軟自己的家在幾樓幾號,新式信箱會(huì)把信件直接傳送到用戶的家中,然后告訴用戶,你的信件已經(jīng)放到你的家中了!老陳很高興,因?yàn)樗槐卦儆H自收發(fā)信件了!
Overlapped I/O?事件通知模型和WSAEventSelect模型在實(shí)現(xiàn)上非常相似,主要區(qū)別在"Overlapped",Overlapped?模型是讓應(yīng)用程序使用重疊數(shù)據(jù)結(jié)構(gòu)(WSAOVERLAPPED),一次投遞一個(gè)或多個(gè)Winsock I/O請求。這些提交的請求完成后,應(yīng)用程序會(huì)收到通知。什么意思呢?就是說,如果你想從?socket上接收數(shù)據(jù),只需要告訴系統(tǒng),由系統(tǒng)為你接收數(shù)據(jù),而你需要做的只是為系統(tǒng)提供一個(gè)緩沖區(qū)?~~~~~
五:Overlapped I/O?完成例程模型
老陳接收到新的信件后,一般的程序是:打開信封----掏出信紙?----閱讀信件----回復(fù)信件......為了進(jìn)一步減輕用戶負(fù)擔(dān),微軟又開發(fā)了一種新的技術(shù):用戶只要告訴微軟對信件的操作步驟,微軟信箱將按照這些步驟去處理信件,不再需要用戶親自拆信?/閱讀/回復(fù)了!老陳終于過上了小資生活!
上面兩個(gè)模型我們稱為重疊模型,這個(gè)模型可以使程序達(dá)到更佳的性能。設(shè)計(jì)原理是:讓應(yīng)用程序使用重疊的數(shù)據(jù)結(jié)構(gòu),一次投遞一個(gè)或多個(gè)IO請求,針對這些提交的請求,在他們完成之后,應(yīng)用程序可以為他們提供服務(wù)。在上面兩種模型分別是:在事件中使用,在完成例程中使用。
六:IOCP模型
微軟信箱似乎很完美,老陳也很滿意。但是在一些大公司情況卻完全不同!這些大公司有數(shù)以萬計(jì)的信箱,每秒鐘都有數(shù)以百計(jì)的信件需要處理,以至于微軟信箱經(jīng)常因超負(fù)荷運(yùn)轉(zhuǎn)而崩潰!需要重新啟動(dòng)!微軟不得不使出殺手锏?......
微軟給每個(gè)大公司派了一名名叫"Completion Port"的超級機(jī)器人,讓這個(gè)機(jī)器人去處理那些信件!
"Windows NT小組注意到這些應(yīng)用程序的性能沒有預(yù)料的那么高。特別的,處理很多同時(shí)的客戶請求意味著很多線程并發(fā)地運(yùn)行在系統(tǒng)中。因?yàn)樗羞@些線程都是可運(yùn)行的?[沒有被掛起和等待發(fā)生什么事],Microsoft意識(shí)到NT內(nèi)核花費(fèi)了太多的時(shí)間來轉(zhuǎn)換運(yùn)行線程的上下文?[Context],線程就沒有得到很多CPU時(shí)間來做它們的工作。大家可能也都感覺到并行模型的瓶頸在于它為每一個(gè)客戶請求都創(chuàng)建了一個(gè)新線程。創(chuàng)建線程比起創(chuàng)建進(jìn)程開銷要小,但也遠(yuǎn)不是沒有開銷的。我們不妨設(shè)想一下:如果事先開好?N個(gè)線程,讓它們在那hold[堵塞?],然后可以將所有用戶的請求都投遞到一個(gè)消息隊(duì)列中去。然后那N?個(gè)線程逐一從消息隊(duì)列中去取出消息并加以處理。就可以避免針對每一個(gè)用戶請求都開線程。不僅減少了線程的資源,也提高了線程的利用率。理論上很不錯(cuò),你想我等泛泛之輩都能想出來的問題,?Microsoft又怎會(huì)沒有考慮到呢?"-----?摘自nonocast的《理解I/O Completion Port》
ok,最后是我們的完成端口,他提供了很好的伸縮性,往往可以使系統(tǒng)達(dá)到最好的性能,是處理成千上萬的套接字的首選; ?完成端口要求創(chuàng)建一個(gè)windows完成端口對象,這個(gè)對象通過制定數(shù)量的線程,對重疊IO請求進(jìn)行管理,以便為已經(jīng)完成的重疊IO提供服務(wù);
這里簡要介紹幾種網(wǎng)絡(luò)編程的異步模型,下面開始詳細(xì)給出解釋和實(shí)例!
2012/8/22
jofranks 于南昌
總結(jié)
以上是生活随笔為你收集整理的【网络编程】之五、异步模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【网络编程】之四、socket网络编程例
- 下一篇: 【网络编程】之六、选择select