轉 fopen不將檔案內容載入進記憶體,而是建立描述資訊
阿新 • • 發佈:2021-01-19
fopen()函式主要做是:
1. 建立一個FILE物件。
2. 根據路徑在外存中找到描述檔案的物件,並根據所找到的物件的資訊初始化FILE物件。
3. 返回FILE物件的指標。
從上可知,呼叫fopen()函式時,並未將檔案的內容讀到記憶體中,而是在檔案系統中找到描述該檔案的物件,並建立描述該檔案的FILE物件。
fopen只是開啟檔案,還得用fread或其他讀檔案命令才能讀入檔案內容,操作順序應該是開啟檔案--讀入檔案--關閉檔案。
現在大多數的系統採用分頁機制,在開啟檔案成功後,檔案並沒有載入進入記憶體,而是核心生成了一個檔案描述符,
檔案描述符含有一個指向檔案inode結構的指標,在這個結構中存有檔案真正的節點資訊和位置。當讀取的時候,
cpu首先判定需要讀取的位置是否在記憶體上,如果再則直接讀取(沒有所謂的按行讀取一說,按行讀取不過是找檔案中的換行標而已,當讀到換行符的時候返回結果),
如果不在記憶體上,則通過記憶體管理器進行載入,實際上,無論你是讀取一個字元還是一行,載入的大小是固定的,
比如系統機制是載入1M,當你檔案大於1M時也只加載1M,當不夠時全部載入。對不不同系統方式不同。(當然系統如果對讀檔案有特殊的優化也不同),
當你讀取之後,檔案是繼續留在記憶體還是釋放,這裡有另一套極其複雜的機制在管理。因為在你讀第一行和第二行的時間裡,還有許多事情在併發的執行。