在linux下程式設計時很多函式都會返回乙個描述符,比如檔案描述符,套接字描述符。那麼描述符到底是什麼呢?說到底描述符不過是乙個陣列下標,這個陣列是由指向檔案物件的指標組成的。檔案物件是在檔案被開啟時建立的(這裡的檔案不僅僅是磁碟上的檔案,也可以是套接字等),具體的關於檔案物件的細節會在《linux核心解析——檔案系統》相關博文中說明。
現在只要知道:每個程序的程序描述符中都包含乙個開啟檔案表,在linux下是struct files_struct結構,unix下是struct filedesc結構,每個開啟檔案表中右包含檔案物件指標陣列,即陣列中每個元素指向struct file結構物件。每個檔案物件中又包含操作檔案的函式指標集,以及指向目錄項節點(linux下的,在《linux核心解析——檔案系統》博文中詳述)的指標,或是指向乙個socket物件。其結構圖如下:
mbuf是一種快取結構,用於在整個網路**中儲存各種資訊,比如呼叫sendto傳送的資料會從使用者空間拷貝至mbuf中,mbuf的大小是固定的,每個mbuf總長為128位元組,前20個位元組為首部,mbuf分組的第一塊mbuf還會用8個位元組儲存m_pkthdr.len(整個分組中資料的長度)和m_pkthdr.rcvif,,因此2個mbuf最多儲存208個位元組,當需要3個或3個以上的mbuf時會使用一種名為"簇"的大塊快取。
1)首先呼叫sendto函式傳送資料,該函式將資料從使用者空間拷貝到mbuf,假設資料為150位元組,則此時mbuf鏈如下:
2)接著到協議層需要在資料之前新增乙個ip首部和乙個tcp首部,為了·不移動資料部分,在鍊錶之前又新增了乙個mbuf用於儲存協議首部,且為了便於低層寫一新增自己的首部,如介面層新增乙太網位址,而將udp,ip首部放在新增mbuf的最下面。如圖所示:
3)接著到達介面層,將乙太網位址新增到ip首部之前。
當mbuf中要儲存的資料大於208位元組時,即所需的mbuf數量達到3個及3個以上時,啟用簇,此時會改變m_flag標誌位,先對m_flag進行說明:1.m_flag為0,mbuf只包含資料;2.m_flag為m_pkthdr,表明它是乙個分組首部。(以上兩種以在前面展示過了);3.m_flag為m_ext,說明使用外部簇;4.m_flag為m_pkthdr | m_ext,說明使用外部簇且為分組首部
所謂簇是乙個大小為2048位元組的記憶體塊,當啟用簇時m_data指向實際資料起始處,m_ext.ext_buf指向簇的首部,如下圖所示:
多個mbuf之間可以共享乙個簇,這在tcp傳送資料時十分有用,可避免為保留未確認資料而拷貝乙個備份。由於tcp是乙個可靠協議,因此必需維護乙個已傳送資料的副本,直到資料被對方確認。tcp/ip協議是這樣做的:當傳送資料時並不直接改變插口快取中mbuf的m_data指標,而是複製mbuf的乙個副本,改變副本中的m_data,並根據要傳送的大小來新增首部分組,再將資料複製給網路裝置(網絡卡)。當使用簇使,便不用複製資料,而只是複製了mbuf鏈,當收到資料確認後再改變插口快取中mbuf的m_data指標。示意圖如下:
Ubuntu系統及軟體安裝之一系統安裝
慘痛經歷,ubuntu12.04在安裝好後,自己隨便搞kubuntu和其他桌面,導致系統及其難看和難用。我只是乙個linux菜鳥,沒能力手動恢復到原來的狀態,不得已,只得重灌系統。由於之前裝完後,各種軟體安裝及配置都沒有做好記錄,只能靠印象安裝需要的軟體。本次將ubuntu的安裝及軟體配置作為記錄,...
Liferay表結構介紹(一) 系統平台相關表
參考 liferay的結構基本上可以按這個邏輯進行劃分,乙個環境包括多個例項,乙個例項包含多個站點,乙個站點包含多個頁面,乙個頁面裡面包含多個portlet。建立例項的功能在控制面板 伺服器管理 建立例項。例項在系統中的反映就是company。建立company的時候會主要在如下表中生成資料 com...
Linux系統結構及檔案操作
linux是乙個倒樹結構 linux中的所有的東西都是檔案 這些檔案都在系統頂級目錄 就是根目錄 二級目錄 二級目錄的作用 bin 二進位制可執行檔案即系統命令 sbin 系統管理命令的存放位置 boot 啟動分割槽,負責系統啟動 dev 裝置管理檔案 etc 大多數系統管理檔案 home 普通使用...