圖說 Linux 高性能網(wǎng)絡(luò)架構(gòu)的那些事


1. 落寞的小黑

小黑: 你今天下班挺早呀!
大白: 就咱這覺悟,心里有工作,哪里都是辦公桌,不要拘泥于形式嘛。
大白: 下午去面的哪家?啥崗位?咋樣?
小黑: 是一家做自動駕駛的創(chuàng)業(yè)公司,網(wǎng)站是看團(tuán)隊介紹還不錯,就去看看了,這次沒咋準(zhǔn)備,很多問題其實都熟悉,但是回答的不到位。
大白: 哦,明白了,那就是當(dāng)時理解的不到位,稀里糊涂過去了,現(xiàn)在忽然問起來,想不起重點。
小黑: 差不多吧,問我都做過哪些高性能的網(wǎng)絡(luò)框架模型,也就是IO和事件驅(qū)動那一套。

大白:黑哥,你說這個問題確實不好回答,全是術(shù)語和略帶歧義的東西,我覺得我們抓住本質(zhì)去闡述就好。
小黑:來,請開始你的表演,我學(xué)習(xí)學(xué)習(xí)。

IO事件和IO復(fù)用 線程模型和事件驅(qū)動模型的架構(gòu) 基于事件驅(qū)動的Reactor模式詳解 同步IO和異步IO簡介
2. IO事件和IO復(fù)用
2.1 什么是IO事件
IO的本質(zhì)是數(shù)據(jù)的流動,數(shù)據(jù)可以從網(wǎng)卡到程序內(nèi)存,也可以從程序內(nèi)存寫到網(wǎng)卡,磁盤操作也是如此。
網(wǎng)絡(luò)IO:內(nèi)存和網(wǎng)卡的數(shù)據(jù)交互 文件IO:內(nèi)存和磁盤的數(shù)據(jù)交互

可讀事件 可寫事件 異常事件

2.2 什么是IO復(fù)用


3. 網(wǎng)絡(luò)框架設(shè)計要素

遠(yuǎn)端的機(jī)器A發(fā)送了一個HTTP請求到服務(wù)器B,此時服務(wù)器B網(wǎng)卡接收到數(shù)據(jù)并產(chǎn)生一個IO可讀事件; 我們以同步IO為例,此時內(nèi)核將該可讀事件通知到應(yīng)用程序的Listen線程; Listen線程將任務(wù)甩給Handler線程,由Handler將數(shù)據(jù)從內(nèi)核讀緩沖區(qū)拷貝到用戶空間讀緩沖區(qū); 請求數(shù)據(jù)包在應(yīng)用程序內(nèi)部進(jìn)行計算和處理并封裝響應(yīng)包; Handler線程等待可寫事件的到來; 當(dāng)這個連接可寫時將數(shù)據(jù)從用戶態(tài)寫緩沖區(qū)拷貝到內(nèi)核緩沖區(qū),并通過網(wǎng)卡發(fā)送出去;
備注:上述例子是以同步IO為例,并且將線程中的角色分為Listen線程、Handler線程、Worker線程,分別完成不同的工作,后續(xù)會詳細(xì)展開。
IO事件監(jiān)聽 數(shù)據(jù)拷貝 數(shù)據(jù)處理和計算

4. 高性能網(wǎng)絡(luò)框架實踐
4.1 基于線程模型

4.2 基于事件驅(qū)動模型

事件驅(qū)動編程是一種編程范式,程序的執(zhí)行流由外部事件來決定,它的特點是包含一個事件循環(huán),當(dāng)外部事件發(fā)生時使用回調(diào)機(jī)制來觸發(fā)相應(yīng)的處理。

4.3 Reactor反應(yīng)堆模式
核反應(yīng)堆是核電站的心臟 ,它的工作原理是這樣的:原子由原子核與核外電子組成,原子核由質(zhì)子與中子組成。
當(dāng)鈾235的原子核受到外來中子轟擊時,一個原子核會吸收一個中子分裂成兩個質(zhì)量較小的原子核,同時放出2-3個中子。
這裂變產(chǎn)生的中子又去轟擊另外的鈾235原子核,引起新的裂變,如此持續(xù)進(jìn)行就是裂變的鏈?zhǔn)椒磻?yīng)。

5.反應(yīng)堆模式詳解
5.1 反應(yīng)堆模式的本質(zhì)是什么
IO操作:數(shù)據(jù)包的讀取和寫入 CPU操作:數(shù)據(jù)請求的處理和封裝

單Reactor線程 單Reactor線程和線程池 多Reactor線程和線程池

5.2 單Reactor線程模式

5.3 單Reactor線程和線程池模式



5.4 多Reactor線程和線程池模式


5.5 拓展:同步IO和異步IO

6. 小結(jié)
推薦閱讀:
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹莓派,等等。在公眾號內(nèi)回復(fù)「1024」,即可免費獲?。?!
評論
圖片
表情
