linux shell建立的每個程序開始時都有三個開啟的檔案:標準輸入(描述符為0)、標準輸出(描述符為1)和標準錯誤(描述符為2)。
改變當前的檔案位置。對於每個開啟的檔案,核心保持著乙個檔案位置k,初始為0。這個檔案位置是從檔案開頭起始的位元組偏移量。
普通檔案(regular file)包含任意資料。應用程式常常要區分文字檔案(text file)和二進位制檔案(binary file),文字檔案是只含有ascii或unicode字元的普通檔案;二進位制檔案是所有其他的檔案。對核心而言,文字檔案和二進位制檔案沒有區別。
linux文字檔案包含了乙個文字行(text line)序列,其中每一行都是乙個字串行,以乙個新行符(「\n」)結束。
目錄(directory)是包含一組鏈結(link)的檔案,其中每個鏈結都將乙個檔名(filename)對映到乙個檔案,這個檔案可能是另乙個目錄。每個目錄至少含有兩個條目:「.」是到該目錄自身的鏈結,以及「..」是到目錄層次結構中父目錄(parent directory)的鏈結。
套接字(socket)是用來與另乙個程序進行跨網路通訊的檔案。
其他檔案型別包含命名通道(named pipe)、符號鏈結(symbolic link),以及字元和塊裝置(character and block device)。
linux核心將所有檔案都組織成乙個目錄層次結構(directory hierarchy),由名為/(斜槓)的根目錄確定。系統中的每個檔案都是根目錄的直接或間接的後代。
作為其上下文的一部分,每個程序都有乙個當前工作目錄(current working directory)來確定其在目錄層次結構中的當前位置。
目錄層次結構中的位置用路徑名(pathname)來指定。路徑名是乙個字串,包括乙個可選斜槓,其後緊跟一系列的檔名,檔名之間用斜槓分隔。路徑名有兩種形式:
絕對路徑名(absolute pathname)以乙個斜槓開始,表示從根節點開始的路徑。
相對路徑名(relative pathname)以檔名開始,表示從當前工作目錄開始的路徑。
乙個i/o包,稱為rio(robust i/o,健壯的i/o)包,它會自動為你處理上下文中所述的不足值。在像網路程式這樣容易出現不足值的應用中,rio包提供了方便、健壯和高效的i/o。rio提供了兩類不同的函式:
無緩衝的輸入輸出函式。這些函式直接在記憶體和檔案之間傳送資料,沒有應用級緩衝。
帶緩衝的輸入函式。這些函式允許你高效的從檔案中讀取文字行和二進位制資料,這些檔案的內容快取在應用級緩衝區內,類似於為printf這樣的標準i/o函式提供的緩衝區。
描述符表(descriptor table)。每個程序都有它獨立的描述符表,它的表項是由程序開啟的檔案描述符來索引的。每個開啟的描述符表項指向檔案表中的乙個表項。
檔案表(file table)。開啟檔案的集合是由一張檔案表來表示的,所有的程序共享這張表。每個檔案表的表項組成包括當前的檔案位置、引用計數(reference count)(即當前指向該表項的描述符表項數),以及乙個指向v-node表中對應表項的指標。關閉乙個描述符會減少相應的檔案表表項中的引用計數。核心不會刪除這個檔案表表項,直到它的引用計數為零。
v-node表(v-node table)。同檔案表一樣,所有的程序共享這張v-node表。每個表項包含stat結構中的大多數資訊,包括st_mode和st_size成員。
《深入理解計算機系統》 系統級I O
關於i o可以先參考這些文章,但是這裡可能還是有所不同。分析系統級別的i o有什麼不一樣的地方。檔案i o 高階i o 標準庫i o 開篇介紹了三個級別的i o的區別之處。所有語言的執行時系統都提供執行i o的較高階別的工具。例如,標準i o庫 在unix系統中,是通過使用由核心提供的系統級i o函...
深入理解計算機系統
關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...
《深入理解計算機系統》
知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...