深入理解網路技術內幕 閱讀筆記(一)

2021-07-06 05:35:59 字數 1255 閱讀 6268

第一章 簡介

記憶體快取:核心分別使用kmalloc和kfree函式分配和釋放乙個記憶體塊。當分配和**經常發生時,相關的核心組建初始化函式通常會分配一塊特殊的記憶體快取,以作分配之用。當乙個記憶體塊被釋放時,實際上是返回到當初被分配的同乙個緩衝區中。核心維護的其專屬記憶體快取的一些網路資料結構的例子包括,

套接字緩衝區描述符:用於分配sk_buff緩衝區描述符。sk_buff結構可能是網路子系統中分配和**註冊次數最高的。

鄰居對映協議:每乙個鄰居對映協議都使用乙個快取區,以分配儲存l3層到l2層位址對映的資料結構(struct neighbour)。

路由表:路由**使用兩個快取,用於定義路徑的三個資料結構(struct fib_node, struct fib_alias, struct rtable)。

kmem_cache_create 

kmem_cache_destroy

建立和銷毀乙個快取。

kmem_cache_alloc

kmem_cache_free

為快取分配及**乙個緩衝。

互斥:每種互斥機制都是特定環境下的最佳選擇。

迴旋鎖(spin lock):這是一種在某乙個時刻只能由乙個執行的執行緒所持有的鎖。若試圖獲得由另乙個執行執行緒所持有的鎖,則要進入迴圈等待,直到該鎖被釋放為止。由於進入迴圈將造成浪費,迴旋鎖只用於多處理器系統中,並且通常只用在開發人員預期該鎖只會被短期持有的時候。此外,由於會引起其他執行執行緒的浪費,執行執行緒在持有迴旋鎖時不能休眠。

讀-寫迴轉鎖:當給定鎖的使用可以明確分為唯讀和讀-寫時,應該先使用讀-寫迴轉鎖。同一時刻該鎖的持有者只能有乙個可以寫入,同時,當該鎖被乙個寫入者持有時,讀者都不能取得該鎖。由於讀取者的優先順序高於寫入者,因此當讀取者的數目遠遠超過寫入者的數目時,這種型別的鎖能很好的工作。例如fib_hash_lock,dev_base_lock,proto_list_lock。

rcu:linux新機制,下列特定條件下工作的很好:

rcu在網路**中的使用例項就是路由子系統。在快取中查詢比更新更要頻繁,因此實現路由快取查詢的函式不會在搜尋期間被阻塞。rt_hash_table,ptype_all,ptype_base,inet_protos。

深入理解網路技術內幕 閱讀筆記(二)

核心通過不同的介面把內部資訊輸出到使用者空間。除了程式設計師用於請求特定資訊的系統呼叫 system call 外,還有三個特殊介面,而其中兩個是虛擬檔案系統 procfs proc檔案系統 這是乙個虛擬檔案系統,通常是掛在 proc允許核心以檔案的形式向使用者空間輸出內部資訊。這些檔案沒有實際存在...

《深入理解Linux網路技術內幕》閱讀筆記(五)

通過中斷,nic能夠告知其驅動程式幾種不同的事情,包括 1.接收一幀。2.傳輸失敗。3.dma傳輸已成功完成。給定乙個幀傳輸,當幀上載至nic的記憶體準備在此媒介上傳輸時,驅動程式就會將持有該幀的緩衝區釋放掉。使用同步傳輸時 無dma 當該幀已上傳至nic,驅動程式就會立刻知道。但使用dma時,也就...

《深入理解Linux網路技術內幕》閱讀筆記(六)

pci的優點之一是,其支援尋找irq和每個裝置所需的其他資源的探測方式相當優雅。模組可以在載入期間接收一些輸入引數,以告知該如何配置其所負責的所有裝置。但是,有些時候,特別是pci這類匯流排,讓驅動程式自行檢查系統上的裝置,然後為其負責的那些裝置做配置會比較簡單一點。必要時,可以退回到手動配置。探測...