asio C++ library核心理念和功能(一)

第一部分:總覽

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)始啤它。


捕獲1.PNG

你的程序至少有一個(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ā)生不同的事件序列。


捕獲2.PNG

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)形式遗座。

  1. I / O對(duì)象將請(qǐng)求轉(zhuǎn)發(fā)給io_service。
  2. 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é)氢卡。


捕獲4.PNG

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)存使用与境。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猖吴,隨后出現(xiàn)的幾起案子摔刁,更是在濱河造成了極大的恐慌,老刑警劉巖海蔽,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件共屈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡党窜,警方通過(guò)查閱死者的電腦和手機(jī)拗引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)幌衣,“玉大人矾削,你說(shuō)我怎么就攤上這事。” “怎么了哼凯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵欲间,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我断部,道長(zhǎng)猎贴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任家坎,我火速辦了婚禮,結(jié)果婚禮上吝梅,老公的妹妹穿的比我還像新娘虱疏。我一直安慰自己,他們只是感情好苏携,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布做瞪。 她就那樣靜靜地躺著,像睡著了一般右冻。 火紅的嫁衣襯著肌膚如雪装蓬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天纱扭,我揣著相機(jī)與錄音牍帚,去河邊找鬼。 笑死乳蛾,一個(gè)胖子當(dāng)著我的面吹牛暗赶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肃叶,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蹂随,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了因惭?” 一聲冷哼從身側(cè)響起岳锁,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹦魔,沒(méi)想到半個(gè)月后激率,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡勿决,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年柱搜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剥险。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聪蘸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情健爬,我是刑警寧澤控乾,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站娜遵,受9級(jí)特大地震影響蜕衡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜设拟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一慨仿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纳胧,春花似錦镰吆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至核行,卻和暖如春牢硅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芝雪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工减余, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惩系。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓佳励,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛆挫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赃承,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)悴侵,斷路器瞧剖,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,392評(píng)論 8 265
  • 1 簡(jiǎn)介 Boost.Asio和Libuv都是非常優(yōu)秀的網(wǎng)絡(luò)通訊框架。本文使用兩種技術(shù)可免,在CentOS上各自實(shí)現(xiàn)一...
    Brent姜閱讀 9,214評(píng)論 0 10
  • 我理解的換位思考 跟司機(jī)有空的時(shí)候都會(huì)聊天抓于,有的時(shí)候會(huì)聽(tīng)到司機(jī)的聲音,因?yàn)槊刻斓慕庸匪凸方浇瑁惶於荚谲?chē)上捉撮,真的很辛苦...
    冰咋吃閱讀 170評(píng)論 0 5
  • /1/ 上大學(xué)的時(shí)候巾遭,有人告訴我沒(méi)有聽(tīng)過(guò)圖書(shū)館的閉館音樂(lè)的大學(xué)生活是不完整的肉康。所以,我特意等到圖書(shū)館晚上閉館灼舍,為的...
    大鵬不想飛閱讀 1,754評(píng)論 5 6