最近開發用到fuse文件系統,這個文件系統的功能實現是在用戶態下進行的,然而它的文件系統操作接口必須在內核態注冊,所以需要研究一下內核態到用戶態的開銷到底如何。
下面這個例子是在stackoverflow上看到的,基本能反映開銷的差異了:
在linux測試這個測試程序,getuid是一個系統調用,返回當前用戶的id
1 #include <unistd.h> 2 3 #define MAX 100000000 4 int main() { 5 int ii; 6 for (ii=0; ii<MAX; ii++) getuid(); 7 return 0; 8 }
結果顯示循環1億次用時8秒多
real 0m8.438s
user 0m3.952s
sys 0m4.485s
當使用如下程序測試時,
1 #include <unistd.h> 2 #define MAX 100000000 3 4 int _getid() 5 { 6 return 1; 7 } 8 9 int main() { 10 int ii; 11 for (ii=0; ii<MAX; ii++) _getid(); 12 return 0; 13 }
運行結果如下:
real 0m0.305s
user 0m0.304s
sys 0m0.000s
這時時間消耗明顯減少了很多。
兩個程序時間的消耗的差異主要在於內核態和用戶態的切換,每一次循環都涉及一次用戶態->內核態->用戶態的切換,所以消耗的時間就多了很多。
同時也說明我必須要修改fuse的各個文件接口的功能實現來讓它不再反復切換用戶內核態了。