26 深入理解計算機系統筆記,系統級I O

2022-02-12 10:03:07 字數 2961 閱讀 2990

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分時使用記憶體的三種方式 程序 作業系統對執行程式的一種抽象,乙個系統上,多個程序都好像獨佔硬體...

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...