在linux下程式設計,我們可以有很多種方式操作檔案?
1、system call
open、write、sync、close,這部分就是vfs的system call會陷入核心態。
其中write, 只保證資料從應用位址空間拷貝到核心位址空間,即page cache。只有fsync才保證資料和元資料都實實在在地落盤了。
2、library
這部分是c library的io流式讀寫,對底層系統呼叫進行了封裝
3、mmap
mmap將外存的檔案塊對映到記憶體中,可以利用os的頁面管理(虛擬空間對映,頁面快取與自動刷出,頁面對齊等)
mmap會有tlb miss的代價。
4、zero-copy零拷貝
上述的檔案讀寫方式,適合對單個檔案的多次頻繁io。當我們需要將乙個大檔案傳輸到另乙個大檔案時,如果採用read+write的方式,需要頻繁的在使用者態和核心態之間拷貝資料。這時候可以考慮用sendfile。 senfile不需要核心態和使用者態之間的資料拷貝。但是dma需要在核心中需要維護乙個連續的buffer用來傳輸資料。
注意:dma: dma負責將資料從乙個位址空間複製到另外乙個位址空間。當cpu 初始化這個傳輸動作,傳輸動作本身是由 dma 控制器來實行和完成。它的作用就是解放了cpu的工作。通過dma的機制寫盤,不占用系統cpu資源。
擴充套件問題:將普通應用中的資料寫入到磁碟檔案中,要經歷什麼?
要經歷幾層快取。
io就是記憶體和外存之間的資料傳輸。
在記憶體中,就是使用者態和核心態;個人應用位於使用者態,在進行讀寫的時候,通過system call,將資料拷貝到核心態;另外,也有可能是上面我提到的另外幾種寫檔案的方式。
在核心態中,這裡只考慮兩層結構:vfs和blockio層。當我們呼叫write將資料寫出時,首先會寫入到page cache中。最後,作業系統會週期性的清理page cache就是將kernel buffer中的資料寫到磁碟中,或者我們對檔案呼叫fsync,那麼才最終落盤。
參考:
Linux操作檔案
語法 mkdir options dirname p 遞迴建立資料夾 mmode 新建資料夾,並設定資料夾的檔案訪問模式為mode 使用 p選項遞迴的建立wenjian test資料夾。linux下新建檔案的方式有非常多,比如 使用vi新建檔案 使用cp命令拷貝乙個檔案 可是最經常使用的還是使用to...
Linux操作檔案命令
1.編輯檔案 vi 檔名 再按i,進入編輯 按esc,按 輸入q 回車。放棄更改退出。按esc,按 輸入wq,回車。儲存更改退出。按esc鍵 跳到命令模式,然後 w 儲存檔案但不退出vi w file 將修改另外儲存到file中,不退出vi w 強制儲存,不推出vi wq 儲存檔案並退出vi wq ...
Linux 操作檔案目錄
命令 說明語法 引數引數說明 ls顯示檔案和目錄列表 ls alrtafr name.l列出檔案的詳細資訊 a列出當前目錄所有檔案,包含隱藏檔案 mkdir 建立目錄 mkdir p dirname p父目錄不存在情況下先生成父目錄 cd切換目錄 cd dirname touch 生成乙個空檔案 e...