首頁  >  問答  >  主體

linux - 为什么系统调用比普通的函数调用更耗时?用户态和内核态切换的代价在哪?

为什么系统调用比普通函数调用耗时?如果是因为需要用户态和内核态的切换,那么这个切换具体做了什么,哪些步骤代价大呢?

巴扎黑巴扎黑2743 天前842

全部回覆(2)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:45:55

    當程式中有系統呼叫語句,程式執行到系統呼叫時,首先使用類似int 80H的軟中斷指令,保存現場,去的系統呼叫號,在內核態執行,然後恢復現場,每個進程都會有兩個棧,一個核心態棧和一個使用者態棧。當執行int中斷執行時就會由使用者態,堆疊轉向核心堆疊。系統呼叫時需要進行棧的切換。而且內核程式碼對使用者不信任,需要進行額外的檢查。系統呼叫的返回過程有很多額外工作,例如檢查是否需要調度等。

    回覆
    0
  • 阿神

    阿神2017-04-17 11:45:55

    系統呼叫一般都需要保存用戶程式得上下文(context), 在進入核心得時候需要保存用戶態得寄存器,在內核態返回用戶態得時候會恢復這些寄存器得內容。這是一個開銷的地方。 如果需要在不同使用者程式間切換的話,那麼也要更新cr3暫存器,這樣會更換每個程式的虛擬記憶體到實體記憶體映射表的位址,也是比較高負擔的操作。

    回覆
    0
  • 取消回覆