換個角度看,也就是說,進程便可以在用戶空間運行,又能夠在內核空間中運行。進程在用戶空間運行時,被稱爲進程的用戶態,而陷於內核空間的時候,被稱爲進程的內核態。 linux
從用戶態到內核態的轉變,須要經過系統調用來完成。好比,當咱們查看文件內容時,就須要屢次系統調用來完成:首先調用 open() 打開文件,而後調用 read() 讀取文件內容,並調用 write() 將內容寫到標準輸出,最後再調用 close() 關閉文件。性能優化
那麼,系統調用的過程有沒有發生 CPU 上下文的切換呢?答案天然是確定的。app
CPU 寄存器裏原來用戶態的指令位置,須要先保存起來。接着,爲了執行內核態代碼,CPU 寄存器須要更新爲內核態指令的新位置。最後纔是跳轉到內核態運行內核任務。ide
而系統調用結束後,CPU 寄存器須要恢復原來保存的用戶態,而後再切換到用戶空間,繼續運行進程。因此,一次系統調用的過程,實際上是發生了兩次 CPU 上下文切換。性能
不過,須要注意的是,系統調用過程當中,並不會涉及到虛擬內存等進程用戶態的資源,也不會切換進程。這跟咱們一般所說的進程上下文切換是不同的:優化
進程上下文切換,是指從一個進程切換到另外一個進程運行。進程
而系統調用過程當中一直是同一個進程在運行。內存
因此,系統調用過程一般稱爲特權模式切換,而不是上下文切換。但實際上,系統調用過程當中,CPU 的上下文切換仍是沒法避免的。資源
上面的文章摘自極客時間app linux 性能優化實戰的第3節,上文提到的root讀某個磁盤中的文件,訪問磁盤這些硬件資源,root也是沒有權限的,必須通過系統調用,因此理解「CPU寄存器裏原來用戶態的指令,須要先保存起來。」就應該不難了。it