最近開發(fā)用到fuse文件系統(tǒng),這個文件系統(tǒng)的功能實現(xiàn)是在用戶態(tài)下進行的,然而它的文件系統(tǒng)操作接口必須在內(nèi)核態(tài)注冊,所以需要研究一下內(nèi)核態(tài)到用戶態(tài)的開銷到底如何。下面這個例子是在stackoverflow上看到的,基本能反映開銷的差異了:在linux測試這個測試程序,getuid是一個系統(tǒng)調(diào)用,返回當前用戶的id
1 #include <unistd.h>2 3 #define MAX 1000000004 int main() {5 int ii;6 for (ii=0; ii<MAX; ii++) getuid();7 return 0;8 }
結(jié)果顯示循環(huán)1億次用時8秒多real 0m8.438suser 0m3.952ssys 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 }
運行結(jié)果如下:
real 0m0.305suser 0m0.304ssys 0m0.000s
這時時間消耗明顯減少了很多。
兩個程序時間的消耗的差異主要在于內(nèi)核態(tài)和用戶態(tài)的切換,每一次循環(huán)都涉及一次用戶態(tài)->內(nèi)核態(tài)->用戶態(tài)的切換,所以消耗的時間就多了很多。
同時也說明我必須要修改fuse的各個文件接口的功能實現(xiàn)來讓它不再反復切換用戶內(nèi)核態(tài)了。
新聞熱點
疑難解答