上下文切換是對任務當前運行狀態的暫存和恢復數據庫
當多個進程競爭CPU的時候,CPU爲了保證每一個進程能公平被調度運行,採起了處理任務時間分片的機制,
輪流處理多個進程,因爲CPU處理速度很是快,在人類的感官上認爲是並行處理,實際是"僞"並行,
同一時間只有一個任務在運行處理。多線程
根據 Tsuna 的測試報告,每次上下文切換都須要幾十納秒到到微秒的CPU時間,這些時間對CPU來講,
就比如人類對1分鐘或10分鐘的感受概念。在分秒必爭的計算機處理環境下,浪費太多時間在切換上,
只能會下降真正處理任務的時間,表象上致使延時、排隊、卡頓現象發生。學習
進程上下文切換、線程上下文切換、中斷上下文切換測試
系統調用、進程狀態轉換(運行、就緒、阻塞)、時間片耗盡、系統資源不足、sleep、優先級調度、硬件中斷等spa
線程是調度的基本單位,進程是資源擁有的基本單位,同屬一個進程的線程,發生上下文切換,線程
只切換線程的私有數據,共享數據不變,所以速度很是快。blog
數據庫鏈接池(複用鏈接)、合理設置應用的最大進程,線程數、直接內存訪問DMA、零拷貝技術進程
(1)進程運行態爲內核運行態和進程運行態。內核空間態資源包括內核的堆棧、寄存器等;用戶空間態資源包括虛擬內存、棧、變量、正文、數據等事件
(2)系統調用(軟中斷)在內核態完成的,須要進行2次CPU上下文切換(用戶空間-->內核空間-->用戶空間),不涉及用戶態資源,也不會切換進程。內存
(3)進程是由內核來管理和調度的,進程的切換隻能發生在內核態。因此,進程的上下文不只包括了用戶空間的資源,也包括內核空間資源。
(4)進程的上下文切換過程:
(a)接收到切換信號,掛起進程,記錄當前進程的虛擬內存、棧等資源存儲;
(b)將這個進程在 CPU 中的上下文狀態存儲於起來;
(c)而後在內存中檢索下一個進程的上下文;
(d)並將其加載到 CPU的寄存器中恢復;
(e)還須要刷新進程的虛擬內存和用戶棧;
(f)最後跳轉到程序計數器所指向的位置(即跳轉到進程被中斷時的代碼行),以恢復該進程。
(5)、下列將會觸發進程上下文切換的場景:
(a)、根據調度策略,將CPU時間劃片爲對應的時間片,當時間片耗盡,當前進程必須掛起。
(b)、資源不足的,在獲取到足夠資源以前進程掛起。
(c)、進程sleep掛起進程。
(d)、高優先級進程致使當前進度掛起
(e)、硬件中斷,致使當前進程掛起
(1)、不一樣進程之間的線程上下文切換,其過程和進程上下文切換大體相同。
(2)、線程內部的線程進上下文切換。不須要切換進程的用戶資源,只須要切換線程私有的數據和寄存器等。
這會比進程上下文進程切換消耗的資源少,因此多線程相比多進程的優點。
爲了快速響應硬件的事件(如USB接入),中斷處理會打斷進程的正常調度和執行,轉而調用中斷處理程序,
響應設備事件。而打斷其它進程執行時,須要進行上下文切換。中斷事件過多,會無謂的消耗CPU資源,致使進程處理時間延長。
對於一個CPU來講,中斷處理比進程擁有更高的優先級
最後,我想邀請你一塊兒來聊聊,你所理解的CPU上下文切換,你能夠結合今天的內容,總結本身的思路和見解,寫下你的學習心得
進程切換我想到了不少年前在銀行櫃檯辦理業務的情形。1:銀行分配各個窗口給來辦理業務的人2:若是隻有1個窗口開放(系統資源不足),大部分都得等3:若是正在辦理業務的忽然說本身不辦了(sleep),那他就去旁邊再想一想(等)4:若是忽然來了個VIP客戶,能夠強行插隊5:若是忽然斷電了(中斷),都得等。。