哈爾濱海月數據恢復,技術亞洲領先 設為首頁加入收藏RSS訂閱
中國區:哈爾濱(總部)鄭州福建深圳沈陽合肥大連包頭淄博上海廣州
    南京杭州嘉興武漢濟南青島新疆太原
亞太區:印度韓國泰國新加坡馬來西亞澳大利亞
Linux
Linux數據傳輸技術Relay的原理及實例 (1)

  Relay 是一種從 Linux 內核到用戶空間的******數據傳輸技術。通過用戶定義的 relay 通道,內核空間的程序能夠高效、可靠、便捷地將數據傳輸到用戶空間。Relay 特別適用于內核空間有大量數據需要傳輸到用戶空間的情形,目前已經廣泛應用在內核調試工具如 SystemTap中。本文介紹了 Relay 的歷史和原理,并且用一個簡單的實例介紹了 Relay 的具體用法。

  Relay 要解決的問題

  對于任何在內核工作的程序而言,如何把大量的調試信息從內核空間傳輸到用戶空間都是一個******煩,對于運行中的內核更是如此。特別是對于哪些用于調試內核性能的工具,更是如此。

  對于這種大量數據需要在內核中緩存并傳輸到用戶空間需求,很多傳統的方法都已到達了極限,例如內核程序員很熟悉的 printk() 調用。此外,如果不同的內核子系統都開發自己的緩存和傳輸代碼,造成很大的代碼冗余,而且也帶來維護上的困難。

  這些,都要求開發一套能夠******可靠地將數據從內核空間轉發到用戶空間的系統,而且這個系統應該獨立于各個調試子系統。這樣就誕生了 RelayFS。

  Relay的發展歷史

  Relay 的前身是 RelayFS,即作為 Linux 的一個新型文件系統。2003年3月,RelayFS的******個版本的代碼被開發出來,在7月14日,******個針對2.6內核的版本也開始提供下載。經過廣泛的試用和改進,直到2005年9月,RelayFS才被加入mainline內核(2.6.14)。同時,RelayFS也被移植到2.4內核中。在 2006年2月,從2.6.17開始,RelayFS不再作為單獨的文件系統存在,而是成為內核的一部分。它的源碼也從fs/目錄下轉移到 kernel/relay.c中,名稱中也從RelayFS改成了Relay。

  RelayFS目前已經被越來越多的內核工具使用,包括內核調試工具SystemTap、LTT,以及一些特殊的文件系統例如DebugFS。

  Relay的基本原理

  總的說來,Relay提供了一種機制,使得內核空間的程序能夠通過用戶定義的relay通道(channel)將大量數據高效的傳輸到用戶空間。

  一個relay通道由一組和CPU一一對應的內核緩沖區組成。這些緩沖區又被稱為relay緩沖區(buffer),其中的每一個在用戶空間都用一個常規文件來表示,這被叫做relay文件(file)。內核空間的用戶可以利用relay提供的API接口來寫入數據,這些數據會被自動的寫入當前的 CPU id對應的那個relay緩沖區;同時,這些緩沖區從用戶空間看來,是一組普通文件,可以直接使用read()進行讀取,也可以使用mmap()進行映射。Relay并不關心數據的格式和內容,這些完全依賴于使用relay的用戶程序。Relay的目的是提供一個足夠簡單的接口,從而使得基本操作盡可能的******。

  Relay將數據的讀和寫分離,使得突發性大量數據寫入的時候,不需要受限于用戶空間相對較慢的讀取速度,從而大大提高了效率。Relay作為寫入和讀取的橋梁,也就是將內核用戶寫入的數據緩存并轉發給用戶空間的程序。這種轉發機制也正是Relay這個名稱的由來。

  這里的relay通道由四個relay緩沖區(kbuf0到kbuf3)組成,分別對應于系統中的cpu0到cpu1。每個CPU上的代碼調用relay_write()的時候將數據寫入自己對應的relay緩沖區內。每個relay緩沖區稱一個relay文件,即/cpu0到 /cpu3。當文件系統被mount到/mnt/以后,這個relay文件就被映射成映射到用戶空間的地址空間。一旦數據可用,用戶程序就可以把它的數據讀出來寫入到硬盤上的文件中,即cpu0.out到cpu3.out。

  Relay的主要API

  前面提到的 relay_write() 就是 relay API 之一。除此以外,Relay 還提供了更多的 API來支持用戶程序完整的使用 relay。這些 API,主要按照面向用戶空間和面向內核空間分為兩大類,下面我們來分別進行介紹。

  面向用戶空間的 API

  這些 Relay 編程接口向用戶空間程序提供了訪問 relay 通道緩沖區數據的基本操作的入口,包括:

  ●open() - 允許用戶打開一個已經存在的通道緩沖區。

  ●mmap() - 使通道緩沖區被映射到位于用戶空間的調用者的地址空間。要特別注意的是,我們不能僅對局部區域進行映射。也就是說,必須映射整個緩沖區文件,其大小是 CPU的個數和單個 CPU 緩沖區大小的乘積。

  ●read() - 讀取通道緩沖區的內容。這些數據一旦被讀出,就意味著他們被用戶空間的程序消費掉了,也就不能被之后的讀操作看到。

  ●sendfile() - 將數據從通道緩沖區傳輸到一個輸出文件描述符。其中可能的填充字符會被自動去掉,不會被用戶看到。

  ●poll() - 支持 POLLIN/POLLRDNORM/POLLERR 信號。每次子緩沖區的邊界被越過時,等待著的用戶空間程序會得到通知。

  ●close() - 將通道緩沖區的引用數減1。當引用數減為0時,表明沒有進程或者內核用戶需要打開它,從而這個通道緩沖區被釋放。

 
客戶服務 +more
上門服務
服務承諾
異地恢復
收費標準
付款方式
疑難解答
服務特色 +more
·免費檢測
·免費提供3天備份
·專業工程師提供服務
·免費清潔送修的介質
·數據恢復前報價,客戶確認后工程師開始數據恢復
·數據恢復不成功不收費
·與客戶簽訂保密協議,對客戶的數
 據嚴格保密,整個恢復過程不會對
 客戶的原盤有任何的寫操作,以確
 保原盤的數據完全

·免費參觀恢復全過程

·工程師在線免費咨詢

·專業工程師提供服務
服務器數據恢復 點擊這里給我發消

息
數據庫修復
點擊這里給我發

消息
硬盤數據恢復
點擊這里給我發消

息
主站蜘蛛池模板: 亚洲日本va午夜中文字幕一区| 国产拳头交一区二区| eeuss鲁片一区二区三区| 一区二区高清在线| 精品一区二区三人妻视频 | 日本一区二区高清不卡| 在线观看国产一区二三区| 亚洲国产一区国产亚洲| 韩日午夜在线资源一区二区 | 国产精品日本一区二区在线播放 | 久久99国产一区二区三区| 成人精品视频一区二区| 九九无码人妻一区二区三区| 交换国产精品视频一区| 亚洲一区二区三区播放在线| 一区二区三区视频在线观看| 麻豆精品久久久一区二区| 国产免费一区二区三区不卡| 国产亚洲3p无码一区二区| 99精品国产一区二区三区2021| 国产午夜精品一区二区三区| 影院成人区精品一区二区婷婷丽春院影视| 日本高清不卡一区| 国产一区二区三区不卡观| 久久4k岛国高清一区二区| 色窝窝无码一区二区三区成人网站| 日本一区二区免费看| 一区二区三区观看免费中文视频在线播放 | 中文无码AV一区二区三区| 日韩人妻无码一区二区三区 | 色婷婷综合久久久久中文一区二区| 精品亚洲一区二区| 99久久人妻精品免费一区 | 曰韩精品无码一区二区三区| 国产一区视频在线| 人妖在线精品一区二区三区| 成人毛片无码一区二区| 久久无码一区二区三区少妇| 亚洲国产美国国产综合一区二区 | 国产精品一区三区| 无码人妻精品一区二区三区东京热|