日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Linux的高效的數(shù)據(jù)傳輸技術(shù)-Relay

Relay 是一種從 Linux 內(nèi)核到用戶空間的高效數(shù)據(jù)傳輸技術(shù) 。通過用戶定義的 relay 通道,內(nèi)核空間的程序能夠高效、可靠、便捷地將數(shù)據(jù)傳輸?shù)接脩艨臻g 。Relay 特別適用于內(nèi)核空間有大量數(shù)據(jù)需要傳輸?shù)接脩艨臻g的情形,目前已經(jīng)廣泛應(yīng)用在內(nèi)核調(diào)試工具如 SystemTap中 。本文介紹了 Relay 的歷史和原理,并且用一個簡單的實例介紹了 Relay 的具體用法 。
Relay 要解決的問題
對于任何在內(nèi)核工作的程序而言,如何把大量的調(diào)試信息從內(nèi)核空間傳輸?shù)接脩艨臻g都是一個大麻煩,對于運行中的內(nèi)核更是如此 。特別是對于哪些用于調(diào)試內(nèi)核性能的工具,更是如此 。
對于這種大量數(shù)據(jù)需要在內(nèi)核中緩存并傳輸?shù)接脩艨臻g需求,很多傳統(tǒng)的方法都已到達了極限,例如內(nèi)核程序員很熟悉的 printk() 調(diào)用 。此外,如果不同的內(nèi)核子系統(tǒng)都開發(fā)自己的緩存和傳輸代碼,造成很大的代碼冗余,而且也帶來維護上的困難 。
這些,都要求開發(fā)一套能夠高效可靠地將數(shù)據(jù)從內(nèi)核空間轉(zhuǎn)發(fā)到用戶空間的系統(tǒng),而且這個系統(tǒng)應(yīng)該獨立于各個調(diào)試子系統(tǒng) 。這樣就誕生了 RelayFS 。
Relay的發(fā)展歷史
Relay 的前身是 RelayFS,即作為 Linux 的一個新型文件系統(tǒng) 。2003年3月,RelayFS的第一個版本的代碼被開發(fā)出來,在7月14日,第一個針對2.6內(nèi)核的版本也開始提供下載 。經(jīng)過廣泛的試用和改進,直到2005年9月,RelayFS才被加入mainline內(nèi)核(2.6.14) 。同時,RelayFS也被移植到2.4內(nèi)核中 。在 2006年2月,從2.6.17開始,RelayFS不再作為單獨的文件系統(tǒng)存在,而是成為內(nèi)核的一部分 。它的源碼也從fs/目錄下轉(zhuǎn)移到 kernel/relay.c中,名稱中也從RelayFS改成了Relay 。
RelayFS目前已經(jīng)被越來越多的內(nèi)核工具使用,包括內(nèi)核調(diào)試工具SystemTap、LTT,以及一些特殊的文件系統(tǒng)例如DebugFS 。
Relay的基本原理
【Linux的高效的數(shù)據(jù)傳輸技術(shù)-Relay】總的說來,Relay提供了一種機制,使得內(nèi)核空間的程序能夠通過用戶定義的relay通道(channel)將大量數(shù)據(jù)高效的傳輸?shù)接脩艨臻g 。
一個relay通道由一組和CPU一一對應(yīng)的內(nèi)核緩沖區(qū)組成 。這些緩沖區(qū)又被稱為relay緩沖區(qū)(buffer),其中的每一個在用戶空間都用一個常規(guī)文件來表示,這被叫做relay文件(file) 。內(nèi)核空間的用戶可以利用relay提供的API接口來寫入數(shù)據(jù),這些數(shù)據(jù)會被自動的寫入當(dāng)前的 CPU id對應(yīng)的那個relay緩沖區(qū);同時,這些緩沖區(qū)從用戶空間看來,是一組普通文件,可以直接使用read()進行讀取,也可以使用mmap()進行映射 。Relay并不關(guān)心數(shù)據(jù)的格式和內(nèi)容,這些完全依賴于使用relay的用戶程序 。Relay的目的是提供一個足夠簡單的接口,從而使得基本操作盡可能的高效 。
Relay將數(shù)據(jù)的讀和寫分離,使得突發(fā)性大量數(shù)據(jù)寫入的時候,不需要受限于用戶空間相對較慢的讀取速度,從而大大提高了效率 。Relay作為寫入和讀取的橋梁,也就是將內(nèi)核用戶寫入的數(shù)據(jù)緩存并轉(zhuǎn)發(fā)給用戶空間的程序 。這種轉(zhuǎn)發(fā)機制也正是Relay這個名稱的由來 。
這里的relay通道由四個relay緩沖區(qū)(kbuf0到kbuf3)組成,分別對應(yīng)于系統(tǒng)中的cpu0到cpu1 。每個CPU上的代碼調(diào)用relay_write()的時候?qū)?shù)據(jù)寫入自己對應(yīng)的relay緩沖區(qū)內(nèi) 。每個relay緩沖區(qū)稱一個relay文件,即/cpu0到 /cpu3 。當(dāng)文件系統(tǒng)被mount到/mnt/以后,這個relay文件就被映射成映射到用戶空間的地址空間 。一旦數(shù)據(jù)可用,用戶程序就可以把它的數(shù)據(jù)讀出來寫入到硬盤上的文件中,即cpu0.out到cpu3.out 。
Relay的主要API
前面提到的 relay_write() 就是 relay API 之一 。除此以外,Relay 還提供了更多的 API來支持用戶程序完整的使用 relay 。這些 API,主要按照面向用戶空間和面向內(nèi)核空間分為兩大類,下面我們來分別進行介紹 。

推薦閱讀