linux檔案系統系統呼叫實測的乙個方法

2021-09-20 12:09:21 字數 1687 閱讀 1156

通過幾個c**來檢測一下檔案系統相關系統呼叫時間,以及和標準i/o庫函式的效能差異。主要以read和fread函式為例。

我們來模擬一下read系統呼叫的開銷情況,

**如下:

#include

#include

#include

#include

int main()

建立輸入檔案file.in如下:

dd if=/dev/zero of=file.in bs=1 count=1024000

執行測試如下:

# time ./a.out

real    0m1.080s

user    0m0.064s

sys   0m1.012s

發現主要時間是花在了sys上的,即核心態,當然我們知道是系統呼叫了,因為就是我們寫的嘛。

可以使用strace來跟蹤程式,就會不斷顯示系統呼叫write和read了。

通過測試時間,其實我們計算得到一次write+read的時間的。就是1.012s/1024000=0.98us。

修改程式如下:

#include

#include

#include

#include

int main()

程式中,去掉了write只留下了read系統呼叫,執行後時間如下:

# time ./a.out

real    0m0.222s

user    0m0.012s

sys   0m0.208s

可以計算得到每次read的大概時間為0.208/1024000=0.2us.在不同的機器上執行會有不同的結果,大家可以自行測試,祝玩的愉快。

後續會將該程式進行優化。

將**進行優化如下:

#include

#include

#include

#include

intmain ()

一次read的位元組數量修改為1024個位元組。

執行後如下,

# time ./a.out

real    0m0.002s

user    0m0.000s

sys 0m0.000s

發現執行時間大幅降低了,效能得到了優化,理論上應該快了千倍被,畢竟系統呼叫次數減少了千次。

標準i/o庫是由stdio及標頭檔案stdio.h為底層i/o系統呼叫提供的乙個通用介面,例如fopen,fread,fclose等。現在是ansi標準c的一部分。

使用標準i/o庫的函式來進行測試,**如下,

#include

#include

intmain ()

編譯執行,

# time ./a.out

real    0m0.036s

user    0m0.032s

sys   0m0.000s

發現sys時間幾乎為0,說明主要是在使用者態的操作,相比read系統呼叫所化時間(如下)快了很多。

real    0m1.080s

user    0m0.064s

sys   0m1.012s

這個主要是因為在

stdio

庫在file

結構裡使用了乙個內部緩衝區。只有在緩衝區滿時候才進行底層系統呼叫再刷資料,當然比直接系統呼叫快很多了。

linux檔案系統系統呼叫 fallocate

int fallocate int fd,int mode,off t offset,off t len 為檔案預分配物理空間。include 成功返回0,失敗返回 1。fd檔案描述符 mode 目前兩種mode 1.falloc fl keep size 從offset開始分配大小為len的空間,...

Linux 檔案系統呼叫(習題)

1 設計乙個程式,要求開啟檔案 pass 如何沒有這個檔案,新建此檔案,許可權設定為只有所有者有唯讀許可權。程式 include include include int main 2 設計乙個程式,要求新建乙個檔案 hello 利用write函式將 linux下c軟體設計 字串寫入該檔案 程式 in...

linux系統呼叫之檔案系統操作

access 確定檔案的可訪問性 chdir 改變當前工作目錄 fchdir 參見chdir chmod 改變檔案方式 fchmod 參見chmod chown 改變檔案的屬主或使用者組 fchown 參見chown lchown 參見chown chroot 改變根目錄 stat 取檔案狀態資訊 ...