被面試問如何減少“上下文切換”,既然不知道?

什麼是上下文切換?

上下文換指的是操作系統的核心,在CPU上對進程或者線程進行切換的意思。上下文切換過程中的信息被保存在進程控制塊中的。

理解上下文切換

首先,大家不管在單核或多核處理器都支持多線程執行代碼,然後CPU通過給每個線程分配CPU時間片來實現這個過程的。什麼是時間片,時間片是CPU分配給各個線程的時間,時間片非常短。所以我們是平還是感覺不到,CPU不停切換線程執行,時間片一般就是幾十毫秒,就那麼一瞬間。

如何減少上下文切換

減少“上下文切換”常用有這種方法:無鎖併發編程、CAS算法、使用最少線程和使用協程。

無鎖併發編程:就是多線程競爭鎖時,會引起上下文切換,多線程處理數據時,可以用一 些辦法來避免使用鎖,如將數據的ID按照Hash算法取模分段,不同的線程處理不同段的數據。CAS算法:Java的Atomic包使用CAS算法來更新數據,就是它在沒有鎖的狀態下,可以保證多個線程對一個值的更新。使用最少線程:避免創建不需要的線程。協程:在單線程裏實現多任務的調度,並在單線程裏維持多個任務間的切換。

上下文切換的消耗

上下文切換,它是需要相當可觀的處理器時間的。當在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間,所以時間是非常短,很多時候,我們是觀察不到 變化的。因此,對於上下文切換,會給系統帶來的是消耗大量的CPU時間。

上下文切換帶來的問題

除了進程需要上下文切換,其實還有一種上下文切換,那就是操作系統檢測到中斷、異常、系統調用時發生的,以及包括IO設備引起的中斷,應用程序主動發起系統調用(如文件讀寫)等等。如果操作系統檢測到中斷異常系統調用的信號後,會通過中斷向量表找到對應的處理程序,然後切換成處理程序進程,處理完成後再切換回來。

其實在系統調用時候,可能還會有用戶態到內核態的切換,這個過程更加爲複雜。在普通上下文,它會的開銷比普通上下文切換代價更大了。

 

 

 

 

 

 

 

 

https://www.wabks.com/post/550.html

 

性能優化CPU篇(二)之CPU上下文切換(上)

  • A+
所屬分類:系統性能優化實戰

理解CPU上下文

 
  1. 進程在競爭CPU的時候並沒有真正運行,爲什麼還會導致系統的負載升高呢?看到今天的主題,你應該已經猜到了,CPU上下文切換就是罪魁禍首。
  2. 我們都知道,Linux是一個多任務操作系統,它支持遠大於CPU數量的任務同時運行。
  3. 當然,這些任務實際上並不是真的在同時運行,而是因爲系統在很短的時間內,將CPU輪流分配給它們,造成多任務同時運行的錯覺。
  4. 而在每個任務運行前,CPU都需要知道任務從哪裏加載、又從哪裏開始運行,也就是說,需要系統事先幫它設置好CPU寄存器和程序計數器(Program CounterPC)。
  5.  
  6. CPU寄存器,是CPU內置的容量小、但速度極快的內存,也就是cpu用戶存儲指令的寄存器。
  7. 而程序計數器,則是用來存儲CPU正在執行的指令位置、或者即將執行的下一條指令位置,執行指令的寄存器。
  8.  
  9.  
  10. 當切換任務的時候,需要記錄任務當前的狀態和獲取下一任務的信息和地址(指針),這就是上下文的內容。
  11. 因此,上下文是指某一時間點CPU寄存器(CPU register)和程序計數器(PC)的內容, 廣義上還包括內存中進程的虛擬地址映射信息.
  12.  
  13. 知道了什麼是CPU上下文,我想你也很容易理解CPU上下文切換。
  14. 1 保存當前任務的上下文(即寄存器和程序計數器等所有狀態)
  15. 2 找到新任務的上下文並加載
  16. 3 切換到新任務的程序計數器位置,運行新任務
  17. 4 保存下來的上下文存儲在系統內核,當任務再次調度執行再次加載運行
  18. 這樣就能保證任務原來的狀態不受影響,讓任務看起來還是連續運行。
  19. 根據任務的不同,CPU的上下文切換可以分爲幾個不同的場景,也就是,線程上下文以及中斷上下文
  20. 進程上下文: 是指從一個進程切換到另一個進程。

一 進程上下文切換

 
  1. A linux按照特權等級,把進程的運行空間分爲內核空間和用戶空間
  2. 內核空間(Ring 0)具有最高權限,可以直接訪問所有資源
  3. 用戶空間(Ring 3)只能訪問受限資源,不能直接訪問內存等硬件設備,必須通過系統調用陷入到內核中,才能訪問到這些特權資源
  4.  
  5. B 進程運行態爲內核運行態和進程運行態。內核空間態資源包括內核的堆棧、寄存器等;用戶空間態資源包括虛擬內存、棧、變量、正文、數據等
  6.  
  7. C 系統調用(軟中斷)在內核態完成的,需要進行2CPU上下文切換(用戶空間-->內核空間-->用戶空間不涉及用戶態資源,也不會切換進程,一直是同一個進程在運行。
  8. 系統調用過程通常稱爲特權模式切換,而不是上下文切換。但實際上,系統調用過程中,CPU的上下文切換還是無法避免的。
  9.  
  10. D 進程是由內核來管理和調度的,進程的切換隻能發生在內核態。所以,進程的上下文不僅包括了用戶空間的資源,也包括內核空間資源。
  11.  
  12. E 進程上下文切換過程:
  13. (a)接收到切換信號,掛起進程,記錄當前進程的虛擬內存、棧等資源存儲;
  14. (b)將這個進程在 CPU 中的上下文狀態存儲於起來;
  15. (c)然後在內存中檢索下一個進程的上下文;
  16. (d)並將其加載到 CPU的寄存器中恢復;
  17. (e)還需要刷新進程的虛擬內存和用戶棧;
  18. (f)最後跳轉到程序計數器所指向的位置(即跳轉到進程被中斷時的代碼行),以恢復該進程。
  19.  
  20. F 下列將會觸發進程上下文切換的場景:
  21. (a)、根據調度策略,將CPU時間劃片爲對應的時間片,當時間片耗盡,當前進程必須掛起。
  22. (b)、資源不足的,在獲取到足夠資源之前進程掛起。
  23. (c)、進程sleep掛起進程。
  24. (d)、高優先級進程導致當前進度掛起
  25. (e)、硬件中斷,導致當前進程掛起
  26.  

二 線程上下文切換

 
  1. A 線程與進程最大的區別在於
  2. 線程是調度的基本單位,而進程則是資源擁有的基本單位。說白了,
  3. 所謂內核中的任務調度,實際上的調度對象是線程;而進程只是給線程提供了虛擬內存、全局變量
  4. 等資源。
  5.  
  6. B 線程和進程,我們可以這麼理解:
  7. ·當進程只有一個線程時,可以認爲進程就等於線程。
  8. ·當進程擁有多個線程時,這些線程會共享相同的虛擬內存和全局變量等資源。這些資源在上下文
  9. 切換時是不需要修改的。
  10. ·另外,線程也有自己的私有數據,比如棧和寄存器等,這些在上下文切換時也是需要保存的。
  11.  
  12. C 線程的上下文切換其實就可以分爲兩種情況:
  13. 第一種,前後兩個線程屬於不同進程。此時,因爲資源不共享,所以切換過程就跟進程上下文切換
  14. 是一樣。
  15. 第二種,前後兩個線程屬於同一個進程。此時,因爲虛擬內存是共享的,所以在切換時,虛擬內存
  16. 這些資源就保持不動,只需要切換線程的私有數據、寄存器等不共享的數據。
  17.  
  18. D 到這裏你應該也發現了,雖然同爲上下文切換,但同進程內的線程切換,要比多進程間的切換消耗
  19. 更少的資源,而這,也正是多線程代替多進程的一個優勢。
  20.  

三 中斷上下文切換

 
  1. A 爲了快速響應硬件的事件,中斷處理會打斷進程的正常調度和執行,轉而調用中斷處理程序,響應
  2. 設備事件。而在打斷其他進程時,就需要將進程當前的狀態保存下來,這樣在中斷結束後,進程仍
  3. 然可以從原來的狀態恢復運行。
  4.  
  5. B 跟進程上下文不同,中斷上下文切換並不涉及到進程的用戶態。所以,即便中斷過程打斷了一個正
  6. 處在用戶態的進程,也不需要保存和恢復這個進程的虛擬內存、全局變量等用戶態資源。中斷上下
  7. 文,其實只包括內核態中斷服務程序執行所必需的狀態,包括CPU存器、內核堆棧、硬件中斷
  8. 參數等。
  9.  
  10. C 對同一個CPU來說,中斷處理比進程擁有更高的優先級,所以中斷上下文切換並不會與進程上下
  11. 文切換同時發生。同樣道理,由於中斷會打斷正常進程的調度和執行,所以大部分中斷處理程序都
  12. 短小精悍,以便儘可能快的執行結束。
  13.  
  14. D 另外,跟進程上下文切換一樣,中斷上下文切換也需要消耗CPU,切換次數過多也會耗費大量的
  15. CPU,甚至嚴重降低系統的整體性能。所以,當你發現中斷次數過多時,就需要注意去排查它是否
  16. 會給你的系統帶來嚴重的性能問題。

四 總結:

 
  1. 1.CPU上下文切換,是保證Linux系統正常工作的核心功能之一,一般情況下不需要我們特別關
  2. 注。
  3.  
  4. 2.但過多的上下文切換,會把CPU時間消耗在寄存器、內核棧以及虛擬內存等數據的保存和恢
  5. 覆上,從而縮短進程真正運行的時間,導致系統的整體性能大幅下降。
  6.  
  7. 3 cpu上下文切換就好比一個人有好多朋友要拜訪
  8. 有的朋友房子大(進程),進進出出裏三層外三層,
  9. 有的朋友住帳篷(線程),就拉開帳篷聊聊天,
  10. 有的朋友就隔着窗戶說兩句話打個照面路過(中斷)
  11.  
  12. 4 有哪些減少上下文切換的技術用例?
  13. 數據庫連接池(複用連接)、合理設置應用的最大進程,線程數、直接內存訪問DMA、零拷貝技術
  14.  
  15. 5 虛擬內存的保存是指虛擬內存的映射關係;保存下來的上下文會存儲在內核管理的內存中

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章