1、乙個
unix
檔案就是乙個
m位元組的序列(b0
b1b2
...b
m-1)。所有的
io裝置,如網路,磁碟,終端,都被模型化為檔案,而所有的輸入和輸出都被當作對相應檔案的讀和寫來執行。
2、所有的輸入和輸出都被當作統一的方式來處理:
1)開啟檔案。乙個應用程式通過要求核心開啟相應的檔案,來宣告它想要訪問乙個
io裝置。核心返回乙個小的非負整數,叫做描述符,它在後續對此檔案的所有操作中標識這個檔案。核心記錄這個開啟檔案的所有資訊,而應用程式只需記住這個描述符。
unix建立的每個程序開始都有三個開啟的檔案:標準輸入(描述符為
0),標準輸出(描述符
1),標準錯誤(描述符為
2)。標頭檔案
unistd.h
中定義了相關常量。
2)改變當前的位置。核心保持乙個檔案位置
k,對於每個開啟檔案,初始為
0。這個檔案位置是從檔案開頭起始的位元組偏移量。
3)核心釋放檔案開啟時建立的資料結構,並恢復描述符到可獲得描述符池中。
3、相關函式
open,close,read,write。具體定義可以參見
man手冊,或相關網頁,或本書
11.3
。 1)某些情況下,原始的
read,write
傳送的位元組比應用程式要求的要少,這些不足值(
short count
)不一定是錯誤(意為,比如
read
函式引數要讀
5個位元組,結果唯讀了
3個位元組,即小於
5),下面的情況下將可能發生不足值:
(1)讀時遇到
eof。
(2)從終端讀文字行。
(3)讀和寫網路套接字。
為了避免不足值問題(健壯程式的需求,如
web伺服器這樣的網路應用),就需要處理不足值。本書作者
11.4
節開發了
rio包滿足這個情況。
4、函式是執行緒安全的:它在同乙個描述符上可以被交替地呼叫。
5、元資料:關於檔案的資訊,如建立時間,修改時間,
metadata
。可以呼叫
stat
,fstat
函式。 6、對於核心而言,檔案檔案和二進位制檔案毫無區別。
7、共享檔案
核心用三種相關的資料結構來表示開啟的檔案。
1)描述符表:它的表項由程序開啟的檔案描述符來索引的。
2)檔案表:開啟檔案的集合是一張檔案表來表示的,所有的程序共享這張表。
3)v-node
表:同檔案表一樣,所有的程序共享這張
v-node
表。每個表項包含
stat
結構中的大部分資訊,如檔案大小等。
多個描述符也可以通過不同的檔案表項來引用同乙個檔案。
下圖展示乙個
fork
建立子程序的情況:子程序有乙個父程序描述符的副本;父子程序共享相同的開啟檔案表集合,因此共享相同的檔案位置。注意點:在核心刪除相應檔案表表項前,父子程序必須都關閉了它們的描述符。
8、io重定向
unix > ls > foo.txt
實際是dup2
函式(one case
)。dup2
函式對檔案描述符表項進行重定位。
9、標準
io 標準函式如
fopen,fclose,fread,fwrite,fgets,fputs,scanf,printf
。 標準
io庫將乙個開啟的檔案模型化為乙個流,對於程式設計師來說,乙個流就是乙個指向型別為
file
結構的乙個指標。每個
ansi c
程式開始都有三個開啟的流
stdin,stdout,stderr
,分別對應於標準輸入、輸出、錯誤。
型別為file
的流是對檔案描述符和流緩衝區的抽象。
10、示例圖
11、標準
io流,從某種意義上而言是全雙工的,因為程式能夠在同乙個流上執行輸入和輸出。但是有一些限定:
1)限定
1:輸入函式跟有輸出函式之後。如果中間沒有
fflush,fseek,fsetpos
或rewind
的呼叫,乙個輸入函式不能跟隨在乙個輸出函式之後。
fflush
清空與流相關的緩衝區,後三個函式使用
unix io lseek
函式來重置當前檔案的位置。
2)限定
2:輸出函式跟有輸入函式之後。情況類同上。
這些限定給網路應用帶來乙個問題:因為對套接字使用
lseek
是非法的。用
rio包可以解決這個問題。用
sprintf
把輸出格式化乙個字串,通過
rio_writen
輸出,傅
rio_readlineb
來讀一行,用
scanf
來從文字中提取不同的字段。
26 深入理解計算機系統筆記,系統級I O
1 乙個 unix 檔案就是乙個 m位元組的序列 b0b1b2.bm 1 所有的 io裝置,如網路,磁碟,終端,都被模型化為檔案,而所有的輸入和輸出都被當作對相應檔案的讀和寫來執行。2 所有的輸入和輸出都被當作統一的方式來處理 1 開啟檔案。乙個應用程式通過要求核心開啟相應的檔案,來宣告它想要訪問乙...
深入理解計算機系統 筆記
cu control unit cpu暫存器,晶元的快取記憶體sram 晶元外的快取記憶體sram 主存dram 本地硬碟 網路分布式檔案系統。拷貝次數越少,越好,netty,零拷貝 dma控制器與cpu分時使用記憶體的三種方式 程序 作業系統對執行程式的一種抽象,乙個系統上,多個程序都好像獨佔硬體...
深入理解計算機系統
關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...