關於內核態和用戶態切換開銷的測試


最近開發用到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的各個文件接口的功能實現來讓它不再反復切換用戶內核態了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM