999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

內(nèi)核網(wǎng)絡(luò)堆棧的Go 語(yǔ)言實(shí)現(xiàn)與分析

2021-07-11 08:16:10柴艷娜
電子設(shè)計(jì)工程 2021年13期
關(guān)鍵詞:語(yǔ)言

柴艷娜

(長(zhǎng)安大學(xué)信息與網(wǎng)絡(luò)管理處,陜西西安 710064)

計(jì)算機(jī)是現(xiàn)代日常生活的一種必需品,其高效可靠的運(yùn)行需要依賴于一套穩(wěn)健無(wú)缺陷(Bug-free)的操作系統(tǒng)。現(xiàn)代操作系統(tǒng)都會(huì)使用內(nèi)核(Kernel)來(lái)對(duì)硬件進(jìn)行管理,因此,可以說(shuō)內(nèi)核的安全穩(wěn)定決定了人們與計(jì)算機(jī)相處的體驗(yàn)。內(nèi)核中的缺陷(Bug)將可能使用戶的應(yīng)用程序甚至操作系統(tǒng)本身變得不可靠[1]。

大多數(shù)成熟的操作系統(tǒng)內(nèi)核都是用C 語(yǔ)言實(shí)現(xiàn)的,C 語(yǔ)言因其允許高度自由控制內(nèi)存使用等諸多低級(jí)程序操作特性,從而成為最受歡迎的的內(nèi)核開(kāi)發(fā)語(yǔ)言[2]。這種高度的自由也會(huì)帶來(lái)一些代價(jià),比如內(nèi)存釋放兩遍的錯(cuò)誤、數(shù)組越界的錯(cuò)誤以及死鎖[3]。同時(shí)它也不能防止數(shù)據(jù)類型的錯(cuò)誤解析,保證不了類型的安全性。C 語(yǔ)言也無(wú)法方便高效地使用現(xiàn)代多核處理器的全部性能。

如果用Go 等高級(jí)語(yǔ)言來(lái)開(kāi)發(fā)內(nèi)核,則可能規(guī)避掉很多上述問(wèn)題。為此,該文用Go 語(yǔ)言實(shí)現(xiàn)了內(nèi)核網(wǎng)絡(luò)堆棧子系統(tǒng),進(jìn)行了可行性研究,并設(shè)計(jì)實(shí)驗(yàn)進(jìn)行驗(yàn)證。

1 Linux系統(tǒng)網(wǎng)絡(luò)堆棧

Linux 的網(wǎng)絡(luò)堆棧(Network Stack)是其內(nèi)核的一個(gè)子模塊,如果在源代碼基礎(chǔ)上從零開(kāi)始編譯Linux內(nèi)核,可以通過(guò)menuconfig 對(duì)該模塊進(jìn)行選擇和修改配置。位于Linux/net 目錄的源代碼是Linux 官方自帶的默認(rèn)網(wǎng)絡(luò)堆棧實(shí)現(xiàn)[4]。

Linux 網(wǎng)絡(luò)堆棧模型如圖1 所示。

圖1 Linux網(wǎng)絡(luò)堆棧

網(wǎng)絡(luò)堆棧共分為6 層,每一層都分別執(zhí)行不同的處理任務(wù),對(duì)于流入、流出數(shù)據(jù)都會(huì)進(jìn)行處理。最頂層的應(yīng)用層是操作系統(tǒng)用戶空間(User Space)的一部分,用戶常駐使用的應(yīng)用程序如瀏覽器、IM 軟件等便工作在這一層。

中間4 層是內(nèi)核空間(Kernel Space),以內(nèi)核模塊(Module)形式工作,最底層則是物理層,處理真實(shí)的物理媒介數(shù)據(jù)傳送和接收的真實(shí)物理設(shè)備,如網(wǎng)卡、交換機(jī)及路由器等。

Socket 接口層是創(chuàng)建Socket 以及提供API 接口給應(yīng)用層進(jìn)行調(diào)用的地方,也叫系統(tǒng)調(diào)用接口(System Call Interface)[3]。

協(xié)議層則實(shí)現(xiàn)各種網(wǎng)絡(luò)協(xié)議的解析,是數(shù)據(jù)正確發(fā)送與接收的核心。

網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)接口及驅(qū)動(dòng)層,則是提供了操作實(shí)際物理設(shè)備的手段,同時(shí)也提供了相應(yīng)的監(jiān)控和調(diào)優(yōu)手段,方便調(diào)整實(shí)際物理設(shè)備的工作狀態(tài)和性能。

完整地實(shí)現(xiàn)一個(gè)操作系統(tǒng)內(nèi)核是一項(xiàng)工作量巨大的工程,得益于Linux內(nèi)核的良好分層模型,替換某些模塊便可進(jìn)行研究和對(duì)比,因此,該文代之以實(shí)現(xiàn)一個(gè)內(nèi)核子系統(tǒng),即網(wǎng)絡(luò)堆棧,從而方便下一步的研究工作。

該文用Go 語(yǔ)言實(shí)現(xiàn)一個(gè)Linux 內(nèi)核網(wǎng)絡(luò)堆棧,用于演示用高級(jí)語(yǔ)言開(kāi)發(fā)內(nèi)核的相對(duì)優(yōu)勢(shì)。之所以選擇Go 是因?yàn)檎Z(yǔ)言本身自帶優(yōu)秀的CSP 并發(fā)模型(Concurrent Sequential Processes)[5-6]。CSP 模型將 復(fù)雜任務(wù)解構(gòu)成更小的、更加可管理的子任務(wù)。這些子任務(wù)都能被單個(gè)進(jìn)程所處理,進(jìn)程之間彼此保持通信,共同完成原始的復(fù)雜任務(wù)。

CSP 模型的目標(biāo)是幫助程序員設(shè)計(jì)、實(shí)現(xiàn)和驗(yàn)證復(fù)雜的計(jì)算機(jī)系統(tǒng),十分重要,特別是要設(shè)計(jì)一個(gè)如內(nèi)核般復(fù)雜的軟件。Go 提供了線程安全(Thread-safe)方式的CSP 模型,Go 語(yǔ)言的線程即協(xié)程(Goroutines),同步的通信構(gòu)造即通道(Channel)[7]。Go 語(yǔ)言運(yùn)行時(shí)自動(dòng)根據(jù)計(jì)算機(jī)的物理內(nèi)核數(shù)量來(lái)管理調(diào)度協(xié)程。CSP 模型能讓人很容易地使用計(jì)算機(jī)的所有內(nèi)核,同時(shí)改善代碼的可讀性,進(jìn)行更簡(jiǎn)單的調(diào)試和減少產(chǎn)生缺陷。網(wǎng)絡(luò)堆棧很自然地可以被劃分成多個(gè)子任務(wù)去運(yùn)行,可以充分利用Go 協(xié)程去動(dòng)態(tài)調(diào)度,高效利用所有可用物理內(nèi)核[8]。

CSP 模型只在垃圾回收語(yǔ)言里有可行性,Go 提供了必要的垃圾回收。Go 是一門強(qiáng)類型語(yǔ)言,能減少一大類錯(cuò)誤,包括錯(cuò)誤類型轉(zhuǎn)換,內(nèi)存釋放兩遍,對(duì)象釋放后再使用等。Go的延遲聲明(Defer Statement)允許在函數(shù)結(jié)束時(shí)更方便地清理,減少那些疏于管理的資源導(dǎo)致死鎖的可能性。

2 實(shí) 現(xiàn)

文中實(shí)現(xiàn)的獨(dú)立網(wǎng)絡(luò)堆棧(下文以項(xiàng)目代號(hào)NStack 稱呼之)是建立在Tap 虛擬網(wǎng)卡基礎(chǔ)上,所有基礎(chǔ)網(wǎng)絡(luò)協(xié)議,包括以太網(wǎng)(Ethernet)、ARP、IPv4、ICMP、UDP 和TCP,都能被實(shí)現(xiàn)。為確保性能不受影響,延遲(Latency)和吞吐量(Through-out)會(huì)被測(cè)試,并與C 語(yǔ)言實(shí)現(xiàn)的網(wǎng)絡(luò)堆棧Tapip 進(jìn)行比較。

2.1 Tap接口

Tap 接口即一種虛擬網(wǎng)絡(luò)接口(虛擬網(wǎng)卡),它用軟件來(lái)模仿實(shí)際硬件。NStack 會(huì)將Tap 接口當(dāng)作正常物理接口一樣讀寫[9]。Tap 接口會(huì)關(guān)聯(lián)一橋接接口,就好像一個(gè)路由器作為主機(jī)的一個(gè)子網(wǎng)接入其中,這樣可以允許NStack 能使用它自己的MAC 地址和IP 地址,連接到外部網(wǎng)絡(luò)。

2.2 協(xié)議實(shí)現(xiàn)

NStack 會(huì)實(shí)現(xiàn)數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層的協(xié)議,每一層獨(dú)立運(yùn)行自己的協(xié)議,如圖2 所示。分層模型可以增加并行,在高負(fù)載下提供高效服務(wù)[10]。

圖2 分層協(xié)議棧

每一個(gè)協(xié)議的實(shí)現(xiàn)都使用了類似結(jié)構(gòu)的包處理器(Packet Dealer)。IP 包處理器如圖3 所示。包處理器從低層級(jí)讀取數(shù)據(jù)包,并通過(guò)通道傳輸。通道以箭頭表示在圖2、3中。IP包處理器將數(shù)據(jù)包發(fā)給不同的IP Reader 協(xié)程,如圖3 所示,IP Reader 處理完接收到的數(shù)據(jù)包后,將處理結(jié)果轉(zhuǎn)發(fā)給下一層的包處理器。

圖3 IPv4包處理器

2.3 性能測(cè)試

NStack會(huì)與Tapip進(jìn)行性能比較。Tapip是一個(gè)C語(yǔ)言開(kāi)發(fā)的多線程網(wǎng)絡(luò)堆棧。這個(gè)比較允許評(píng)估用高級(jí)語(yǔ)言開(kāi)發(fā)網(wǎng)絡(luò)堆棧的優(yōu)點(diǎn)和缺點(diǎn)。兩個(gè)網(wǎng)絡(luò)堆棧都實(shí)現(xiàn)了相似的協(xié)議,都在用戶空間(User Space)操作,都使用Tap 虛擬接口。測(cè)試機(jī)器是Ubuntu 14.04/Linux 3.13.0,16 GB 內(nèi)存,Intel Xeon Quad Core Dual Socket 處理器。

2.3.1 延 遲

為測(cè)試延遲,將取50 次ping 響應(yīng)時(shí)間的平均值作比較。測(cè)試環(huán)境的一臺(tái)Linux 虛擬機(jī)將運(yùn)行兩個(gè)網(wǎng)絡(luò)堆棧,ping 請(qǐng)求從該虛擬機(jī)發(fā)出。為判斷堆棧在負(fù)載增加情況下的性能,多個(gè)ping 會(huì)被同時(shí)并發(fā)發(fā)送。從1 個(gè)增加到1 000 個(gè)并發(fā)ping“連接”來(lái)模擬網(wǎng)絡(luò)堆棧可能接受的負(fù)載。為保證對(duì)兩個(gè)網(wǎng)絡(luò)堆棧公平,其他的變量都將保持不變,包括每個(gè)ping“連接”發(fā)送的ping 請(qǐng)求數(shù),ICMP 接受緩沖區(qū)大小以及ping請(qǐng)求數(shù)據(jù)包大小。

2.3.2 吞吐量

第二個(gè)將要評(píng)估的性能指標(biāo)便是吞吐量。一個(gè)堆棧的吞吐量是在給定時(shí)間內(nèi),它能發(fā)送或接收的數(shù)據(jù)量大小[11]。以下步驟將用來(lái)測(cè)量?jī)蓚€(gè)堆棧的吞吐量:

1)初始化一個(gè)TCP 服務(wù)端。

2)初始化一個(gè)TCP 客戶端,連接會(huì)在local 網(wǎng)絡(luò)(localhost)中建立,以排除Tap虛擬網(wǎng)卡導(dǎo)致的開(kāi)銷。

3)客戶端發(fā)送4 kB 數(shù)據(jù)給服務(wù)端。

4)計(jì)算堆棧完成上述過(guò)程的總時(shí)間,該時(shí)間和發(fā)送的數(shù)據(jù)量將用來(lái)計(jì)算吞吐量。

為測(cè)量堆棧的相對(duì)擴(kuò)展能力,將會(huì)逐步增加客戶端數(shù)來(lái)測(cè)量性能[12],最大測(cè)試到100個(gè)并發(fā)客戶端。

有許多預(yù)防措施將用于保證吞吐量的準(zhǔn)確測(cè)量,比如所有可比較的緩沖區(qū)大小都一致[13]。在Tapip 中,每個(gè)客戶端和服務(wù)端連接都運(yùn)行在各自的線程里,NStack 類似,但是用的是Go 的協(xié)程而不是線程。另外,也會(huì)確保所有連接完成且連接的負(fù)載被完整傳輸之后再停止運(yùn)行網(wǎng)絡(luò)堆棧[14-15]。

3 結(jié)果分析

NStack 的代碼與Tapip 比較類似,但是從結(jié)果來(lái)看,性能上包括延遲和吞吐量,相比之下NStack 出色得多。

3.1 準(zhǔn)確性

NStack 和Tapip 都能準(zhǔn)確地運(yùn)行協(xié)議,這可以通過(guò)分別測(cè)試兩個(gè)協(xié)議棧與一臺(tái)Linux 終端的連接來(lái)進(jìn)行判斷[16-18]。測(cè)試中發(fā)現(xiàn)Tapip 有內(nèi)存泄漏的情況。這是因?yàn)門apip 會(huì)開(kāi)辟緩存區(qū)存儲(chǔ)數(shù)據(jù)包,在某些情況下這些緩存區(qū)不會(huì)被釋放或者重復(fù)釋放。當(dāng)緩存區(qū)被重復(fù)釋放時(shí),Tapip 會(huì)奔潰或者導(dǎo)致異常行為。當(dāng)緩存區(qū)不會(huì)被釋放時(shí),Tapip 會(huì)不斷侵占內(nèi)存,直至系統(tǒng)奔潰。Go 則由于有內(nèi)置的垃圾回收,可以很好地避免這種情況的發(fā)生。

3.2 代碼比較

雖然很難量化地評(píng)估編寫Go 語(yǔ)言相比較C 語(yǔ)言的優(yōu)點(diǎn),但是一些代碼片段的比較還是可以看出高級(jí)語(yǔ)言的某些優(yōu)勢(shì)。以下以IP 報(bào)文分片重組的處理代碼舉例說(shuō)明。

當(dāng)添加分片到重組隊(duì)列時(shí),Tapip 的C 語(yǔ)言代碼如下:

Go 可以用協(xié)程處理IP 報(bào)文分片,因此它可以簡(jiǎn)單的將分片轉(zhuǎn)發(fā)給對(duì)應(yīng)的協(xié)程處理,同時(shí)可以緊接著處理后續(xù)數(shù)據(jù)包。

在清理分片時(shí),C 語(yǔ)言的Tapip 需要顯性地釋放每一個(gè)內(nèi)存緩存區(qū),代碼如下:

而Go 語(yǔ)言只需跟蹤通道即可:

delete(ipr.fragBuf,bufID)

Go 語(yǔ)言的簡(jiǎn)潔、友好、可讀,由此可見(jiàn)一斑。

3.3 延遲測(cè)試結(jié)果

延遲測(cè)試結(jié)果如圖4 所示。1 個(gè)ping 請(qǐng)求時(shí),Tapip 的延遲為0.074 ms,優(yōu)于NStack 的0.234 ms,但是隨著并發(fā)請(qǐng)求的增加,當(dāng)1 000 個(gè)ping 請(qǐng)求時(shí),NStack的延遲為0.717 ms,差不多比Tapip的3.279 ms高4 倍。NStack 在連接數(shù)為600 時(shí),開(kāi)始領(lǐng)先于Tapip。NStack 延遲的增加是線性的,而Tapip 是指數(shù)型的。NStack 的延遲趨勢(shì)是優(yōu)于Tapip 的,因?yàn)樵谡?qǐng)求數(shù)很少時(shí),兩者之間延遲的差距很小,但是在大量并發(fā)ping 時(shí),差異就明顯變大。

圖4 延遲測(cè)試結(jié)果

3.4 吞吐量測(cè)試結(jié)果

吞吐量測(cè)試結(jié)果如圖5 所示。1 個(gè)并發(fā)連接時(shí),NStack的吞吐量達(dá)到7.3 Mbit/s,對(duì)比Tapip的4.6 Mbit/s。當(dāng)100 個(gè)并發(fā)連接時(shí),NStack 達(dá)到了284.9 Mbit/s,而Tapip 則只有195 Mbit/s。并且,NStack 的吞吐量增加速度比Tapip 快得多。這表明NStack 可以繼續(xù)在更大量的并發(fā)情況下擴(kuò)展吞吐量,而Tapip 則很可能處理不了這種負(fù)載。

圖5 吞吐量測(cè)試結(jié)果

4 結(jié)束語(yǔ)

由該實(shí)驗(yàn)可以得出,用Go 開(kāi)發(fā)內(nèi)核子系統(tǒng)可以改善代碼的可讀性和可靠性,結(jié)構(gòu)模塊清晰,具有良好的并發(fā)能力和穩(wěn)定性,同時(shí)又對(duì)性能沒(méi)有重大不良影響。結(jié)果表明,對(duì)于內(nèi)核開(kāi)發(fā)來(lái)說(shuō),Go 語(yǔ)言可以是一個(gè)重要的C 語(yǔ)言替代者。

猜你喜歡
語(yǔ)言
詩(shī)之新,以語(yǔ)言創(chuàng)造為基
語(yǔ)言是刀
文苑(2020年4期)2020-05-30 12:35:30
讓語(yǔ)言描寫搖曳多姿
多向度交往對(duì)語(yǔ)言磨蝕的補(bǔ)正之道
累積動(dòng)態(tài)分析下的同聲傳譯語(yǔ)言壓縮
日常語(yǔ)言與播音語(yǔ)言
新聞傳播(2016年10期)2016-09-26 12:15:04
語(yǔ)言技能退化與語(yǔ)言瀕危
我有我語(yǔ)言
論語(yǔ)言的“得體”
Only Words慎用你的語(yǔ)言
主站蜘蛛池模板: 无码国产伊人| 国产自在线拍| 日韩无码一二三区| 国产av剧情无码精品色午夜| 久久国产亚洲偷自| 最新精品久久精品| 亚洲福利视频网址| 成年免费在线观看| 久久国产乱子| 久久免费成人| 欧美日在线观看| 色天堂无毒不卡| 亚洲无码高清免费视频亚洲| 欧美a级完整在线观看| 日本在线视频免费| 国产特级毛片| 国产精品分类视频分类一区| 99热国产这里只有精品无卡顿"| 国产精品久久久免费视频| 在线视频亚洲欧美| 在线免费a视频| 欧美人在线一区二区三区| 91一级片| 亚洲综合片| julia中文字幕久久亚洲| 国产XXXX做受性欧美88| 国产精品久久久久无码网站| 狠狠色香婷婷久久亚洲精品| 成人免费黄色小视频| 久久精品午夜视频| jizz亚洲高清在线观看| 青青久久91| 国产主播福利在线观看| 爽爽影院十八禁在线观看| 色婷婷狠狠干| 无码av免费不卡在线观看| 在线一级毛片| 免费观看国产小粉嫩喷水| 久久九九热视频| 蜜芽一区二区国产精品| 欧美激情视频一区| 亚洲欧美一区二区三区图片| 国产网友愉拍精品视频| 伊人久久大香线蕉综合影视| 久久91精品牛牛| 国产午夜福利亚洲第一| 国产99精品久久| 999福利激情视频| 久久成人免费| 五月婷婷欧美| 欧美成人精品一区二区| 欧美精品影院| 国产成人91精品| 97色伦色在线综合视频| 欧美一级大片在线观看| 午夜视频免费一区二区在线看| 欧美亚洲另类在线观看| 无码国内精品人妻少妇蜜桃视频| 中文字幕久久精品波多野结| 白丝美女办公室高潮喷水视频| 99青青青精品视频在线| 九九九精品成人免费视频7| 国产网友愉拍精品| 久久精品中文字幕免费| 國產尤物AV尤物在線觀看| jizz在线观看| 亚洲免费播放| 免费观看国产小粉嫩喷水| 成人国产免费| 欧美福利在线观看| 中文字幕在线永久在线视频2020| 日日拍夜夜操| 天堂成人av| 久久久久人妻精品一区三寸蜜桃| 国产91成人| 国产三级a| 亚洲天堂日韩av电影| 毛片免费观看视频| 国产日韩久久久久无码精品| 亚洲毛片在线看| 99精品视频在线观看免费播放| 国产人成在线观看|