2014-05-07 56 views

回答

3

sk_buffs通常表示網絡分組。它們可以作爲特定進程寫入特定套接字的結果而生成,但它們也可以以其他方式存在。

當從網絡裝置接收到的分組,例如,它被放置在一個sk_buff中。當它通過堆棧時,它可能會被各種模塊和層(IP,ARP,UDP/TCP,以及「tap」設備等)處理。其中一些模塊可能需要對不是即時的數據包進行操作(例如:在tap設備上重新傳輸)。當然,來自數據包的數據也可能傳遞給從套接字讀取的進程。

A組分需要用於處理該分組數據當然可以簡單地創建所述分組緩衝器的副本,但如果沒有其他部件將修改它,這將是一種浪費。因此,遞增用戶數允許模塊對數據包進行「保留」,這樣它就不會被釋放 - 因此底層內存不會被重新用於某種其他目的 - 只要模塊仍然需要它。當sk_buff的用戶逐一完成使用時,它們遞減用戶計數,並且當它變爲零時,則釋放內存然後

+0

當其他層如IP/Link層處理數據包時,他們是否也增加了用戶數? 什麼是水龍頭設備?你能給出一個實際的例子,就像一個數據包是由Firefox生成的,並放在套接字寫入隊列中,然後哪個tap設備將獲取數據包? –

+0

通常情況下,如果層需要保留數據包供以後使用(即用於延遲使用),則該層只會增加用戶數。請參閱http://en.wikipedia.org/wiki/TUN/TAP瞭解輕敲驅動程序的定義。這不是常態;大部分時間用戶數可能不會超過1. –

+0

還應該指出,Firefox不會生成「數據包」;它會生成要通過TCP傳輸的數據。內核制定數據包(通常包括應用程序數據)。 sk_buffs不屬於任何進程;它們屬於內核。 –

0

通常,在單核機器的情況下,只可以有一個「用戶」使用網絡緩衝器在任何時間,該「用戶」指的是在linux網絡基礎設施的不同的部分或功能。他們不能同時運行,所以這個「用戶」引用計數沒有用,我猜想沒有使用。

但在SMP機,其中不同的CPU可以運行的內核的不同部分的所有在同一時間,和同時同時讀取網絡緩衝區,該參考計數變得重要。當它仍然在使用中時,你不想修改它,但是系統的另一部分或者釋放它。但對於只讀操作,它可能是併發的,因此這個引用計數用於計算使用網絡緩衝區的「用戶」(或內核區域)數量。