第一部分:總覽
1.1 解釋
大多數(shù)程序以某種方式與外部世界進(jìn)行交互乃秀,無(wú)論是通過(guò)文件,網(wǎng)絡(luò)藤肢,串行電報(bào)還是控制臺(tái)太闺。 有時(shí)候,就像網(wǎng)絡(luò)一樣嘁圈,單個(gè)I / O操作可能需要很長(zhǎng)時(shí)間才能完成省骂。 這對(duì)應(yīng)用程序開(kāi)發(fā)提出了特別的挑戰(zhàn)蟀淮。
Asio提供了管理這些長(zhǎng)時(shí)間運(yùn)行的操作的工具,而無(wú)需程序使用基于線程和顯式鎖定的并發(fā)模型钞澳。
Asio庫(kù)適用于使用C ++進(jìn)行系統(tǒng)編程的程序員怠惶,在這種系統(tǒng)編程中,經(jīng)常需要訪問(wèn)諸如網(wǎng)絡(luò)等操作系統(tǒng)功能轧粟。 特別是策治,Asio致力于實(shí)現(xiàn)以下目標(biāo):
1 可移植性。 該庫(kù)應(yīng)支持一系列常用操作系統(tǒng)兰吟,并在這些操作系統(tǒng)中提供一致的行為览妖。
2 可擴(kuò)展性。 該庫(kù)應(yīng)該能夠促進(jìn)擴(kuò)展到數(shù)千個(gè)并發(fā)連接的網(wǎng)絡(luò)應(yīng)用程序的開(kāi)發(fā)揽祥。 每個(gè)操作系統(tǒng)的庫(kù)實(shí)現(xiàn)應(yīng)該使用 最能實(shí)現(xiàn)這種可伸縮性的機(jī)制讽膏。
3 效率。 該庫(kù)應(yīng)該支持分散/集中式I / O等技術(shù)拄丰,并允許程序盡量減少數(shù)據(jù)復(fù)制府树。
4 模型來(lái)自于已建立的API,如BSD套接字料按。 BSD套接字API被廣泛的實(shí)現(xiàn)和理解奄侠,并且在許多文獻(xiàn)中都有涉及。 其他編程語(yǔ)言通常使用類(lèi)似的網(wǎng)絡(luò)API接口载矿。 只要是合理的垄潮,Asio應(yīng)該利用現(xiàn)有的做法。
5 使用方便闷盔。 庫(kù)應(yīng)該通過(guò)采用工具包而不是框架方法為新用戶提供較低的進(jìn)入壁壘弯洗。也就是說(shuō),它應(yīng)該盡量減少前期投資逢勾,及時(shí)學(xué)習(xí)一些基本規(guī)則和準(zhǔn)則牡整。 之后,用戶只需要了解正在使用的特定功能溺拱。
6 基礎(chǔ)上進(jìn)一步抽象逃贝。 應(yīng)該允許開(kāi)發(fā)提供更高抽象級(jí)別的其他庫(kù)。 例如迫摔,常用協(xié)議(如HTTP)的實(shí)現(xiàn)沐扳。
雖然Asio開(kāi)始主要關(guān)注網(wǎng)絡(luò),但它的異步I / O概念已經(jīng)擴(kuò)展到包括其他操作系統(tǒng)資源句占,如串行端口沪摄,文件描述符等等。
1.2 核心理念和功能
1.2.1 對(duì)saio基本解剖
Asio可能用于對(duì)I / O對(duì)象(如套接字)執(zhí)行同步和異步操作。 在使用Asio之前卓起,先了解一下Asio的各個(gè)部分,程序以及它們?nèi)绾我黄鸸ぷ鞯母拍顖D凹炸。
作為一個(gè)介紹性的例子戏阅,我們來(lái)考慮一下在socket上執(zhí)行連接操作時(shí)會(huì)發(fā)生什么。 我們將從檢查同步操作開(kāi)始啤它。
你的程序至少有一個(gè)io_service對(duì)象奕筐。 io_service表示您的程序與操作系統(tǒng)的鏈接
I / O服務(wù)。
asio::io_service io_service;
要執(zhí)行I / O操作变骡,您的程序?qū)⑿枰粋€(gè)I / O對(duì)象离赫,如TCP套接字:
asio::ip::tcp::socket socket(io_service);
當(dāng)執(zhí)行同步連接操作時(shí),會(huì)發(fā)生以下事件序列:
1 您的程序通過(guò)調(diào)用I / O對(duì)象來(lái)啟動(dòng)連接操作:
socket.connect(server_endpoint);
2 I / O對(duì)象將請(qǐng)求轉(zhuǎn)發(fā)給io_service塌碌。
3 io_service調(diào)用操作系統(tǒng)來(lái)執(zhí)行連接操作
4 操作系統(tǒng)將操作結(jié)果返回給io_service渊胸。
5 io_service將操作產(chǎn)生的任何錯(cuò)誤轉(zhuǎn)換為asio :: error_code類(lèi)型的對(duì)象。 error_code可以與特定值進(jìn)行比較台妆,或者作為布爾值進(jìn)行測(cè)試(其中錯(cuò)誤結(jié)果表示沒(méi)有錯(cuò)誤發(fā)生)翎猛。 結(jié)果然后轉(zhuǎn)發(fā)回I / O對(duì)象。
6 如果操作失敗接剩,I / O對(duì)象將引發(fā)類(lèi)型為asio :: system_error的異常切厘。
如果啟動(dòng)操作的代碼被寫(xiě)為:
asio::error_code ec;
socket.connect(server_endpoint, ec);
那么error_code變量ec將被設(shè)置為操作的結(jié)果,并且不會(huì)拋出異常懊缺。 當(dāng)使用異步操作時(shí)疫稿,會(huì)發(fā)生不同的事件序列。
1.您的程序通過(guò)調(diào)用I / O對(duì)象來(lái)啟動(dòng)連接操作:
socket.async_connect(server_endpoint, your_completion_handler);
其中your_completion_handler是帶簽名的函數(shù)或函數(shù)對(duì)象:
void your_completion_handler(const asio::error_code& ec);
所需的確切簽名取決于正在執(zhí)行的異步操作鹃两。 參考文件指出了每個(gè)操作的適當(dāng)形式遗座。
- I / O對(duì)象將請(qǐng)求轉(zhuǎn)發(fā)給io_service。
-
io_service發(fā)信號(hào)給操作系統(tǒng)俊扳,它應(yīng)該啟動(dòng)一個(gè)異步連接员萍。時(shí)間流逝。 (在同步情況下拣度,這個(gè)等待完全被包含在連接操作的持續(xù)時(shí)間內(nèi)碎绎。)
捕獲3.PNG
4.操作系統(tǒng)通過(guò)將結(jié)果放在隊(duì)列中表明連接操作已完成,并準(zhǔn)備由io_service接收抗果。
5.您的程序必須調(diào)用io_service :: run()(或類(lèi)似的io_service成員函數(shù)之一)才能檢索結(jié)果筋帖。 調(diào)用io_service :: run()時(shí)會(huì)阻塞未完成的異步操作,所以你通常會(huì)在您開(kāi)始第一次異步操作時(shí)立即調(diào)用它冤馏。
6.在對(duì)io_service :: run()的調(diào)用中日麸,io_service將操作結(jié)果出隊(duì),將其轉(zhuǎn)換為error_code,然后將其傳遞給完成處理程序代箭。 這是Asio如何運(yùn)作的簡(jiǎn)單流程圖墩划。 如果您的需求更高級(jí),您將需要深入研究文檔嗡综,例如擴(kuò)展Asio以執(zhí)行其他類(lèi)型的異步操作乙帮。
1.2.2 Proactor設(shè)計(jì)模式:沒(méi)有線程的并發(fā)
Asio庫(kù)為同步和異步操作提供并行支持。 異步支持基于Proactor設(shè)計(jì)模式[POSA2]极景。 下面概述了這種方法的優(yōu)點(diǎn)和缺點(diǎn)察净,與同步或反應(yīng)器方法相比。
Proactor和Asio
讓我們來(lái)看看如何在Asio中實(shí)現(xiàn)Proactor設(shè)計(jì)模式盼樟,而不參考平臺(tái)特定的細(xì)節(jié)氢卡。
Proactor設(shè)計(jì)模式
- 異步操作
-異步操作進(jìn)程 - 完成事件隊(duì)列
- 完成處理程序
- 異步事件解復(fù)用器
- Proactor
- 發(fā)起人
使用反應(yīng)堆
在許多平臺(tái)上,Asio使用反應(yīng)器(如select晨缴,epoll或kqueue)實(shí)現(xiàn)Proactor設(shè)計(jì)模式译秦。 該實(shí)現(xiàn)方法對(duì)應(yīng)于Proactor設(shè)計(jì)模式,如下所示:
- 異步操作處理器
- 完成事件隊(duì)列
- 異步事件解復(fù)用器
使用Windows重疊I / O實(shí)現(xiàn)
在Windows NT击碗,2000和XP上诀浪,Asio利用重疊的I / O來(lái)提供Proactor設(shè)計(jì)模式的高效實(shí)現(xiàn)。 該實(shí)現(xiàn)方法對(duì)應(yīng)于Proactor設(shè)計(jì)模式延都,如下所示:
- 異步操作處理器
- 完成事件隊(duì)列
- 異步事件解復(fù)用器
優(yōu)點(diǎn)
- 便攜性雷猪。
- 從并發(fā)中解耦線程。
- 性能和可擴(kuò)展性晰房。
- 簡(jiǎn)化應(yīng)用程序同步求摇。
- 功能組成。
缺點(diǎn)
- 程序復(fù)雜性殊者。
- 內(nèi)存使用与境。