上下文切換的過程?
上下文切換是操作系統在將CPU從一個進程切換到另一個進程時所執行的過程。它涉及保存當前執行進程的狀態并加載下一個將要執行的進程的狀態。下面是上下文切換的詳細過程:
- 保存當前進程的上下文:
- 當操作系統決定切換到另一個進程時,首先需要保存當前正在執行的進程的執行狀態。
- 這包括將當前進程的寄存器狀態(如通用寄存器、程序計數器PC、棧指針等)保存到進程控制塊(PCB)中。
- 操作系統還可能會保存其他與進程相關的狀態信息,如頁表、內存映射、打開的文件等。
- 選擇新進程:
- 操作系統根據調度算法從就緒隊列中選擇下一個要執行的進程。
- 這個選擇可能基于各種因素,如優先級、時間片大小、進程狀態等。
- 加載新進程的上下文:
- 一旦新進程被選擇,操作系統需要加載該進程的執行狀態,以便CPU可以開始執行該進程。
- 這包括從該進程的PCB中恢復寄存器狀態,如通用寄存器、程序計數器PC、棧指針等。
- 操作系統還可能恢復其他與進程相關的狀態信息,如頁表、內存映射、打開的文件等。
- 更新調度信息:
- 在進行上下文切換后,操作系統可能需要更新調度信息,如更新就緒隊列、時間片計數等。
- 這確保了系統可以繼續有效地調度進程,并避免出現死鎖或其他資源爭用問題。
- 切換到新進程執行:
- 一旦新進程的上下文被加載到CPU中,CPU開始執行新進程的代碼。
- 新進程從其上次中斷或被搶占的位置繼續執行。
進程、線程、協程切換的開銷?
- 進程切換的開銷:
- 進程切換涉及到從一個進程切換到另一個進程,因此需要保存和恢復大量的上下文信息,包括寄存器狀態、內存映射、文件描述符等。
- 進程切換的開銷通常較大,因為它需要切換整個進程的上下文,可能涉及到內存的切換和頁面交換等操作。
- 由于進程之間是相互隔離的,切換進程需要操作系統進行較多的工作,包括內存管理、權限檢查等,因此進程切換的開銷相對較大。
- 線程切換的開銷:
- 線程是在同一個進程內部運行的,因此線程切換的開銷相對較小。
- 線程切換只需要保存和恢復線程的寄存器狀態和堆棧信息等少量上下文信息。
- 由于線程共享進程的地址空間和其他資源,線程切換無需進行內存管理或權限檢查等操作,因此開銷較進程切換要小。
- 協程切換的開銷:
- 協程是輕量級的用戶態線程,其切換開銷比進程和線程都要小。
- 協程切換只需要保存和恢復協程的棧幀信息,以及一些額外的狀態信息,如指令指針等。
- 由于協程是在用戶態管理的,無需涉及操作系統的內核調度和內存管理,因此協程切換的開銷最小。
為什么進程切換的開銷比線程的大?
- 進程是系統資源的基本單位,它們之間是相互隔離的,切換進程需要操作系統進行大量的內存管理和權限檢查等工作,因此開銷較大。
- 各個進程之間可能擁有獨立的內存空間,切換進程需要進行內存頁的切換和可能的頁面交換,把虛擬地址轉換為物理地址需要查頁表,查頁表是很慢的過程,轉換檢測緩沖區 TLB 可以提高頁表查詢速度就是一個緩存,頁表切換后 TLB 就會失效,命中率就會變低,切換過程就會慢,線程則不需要切換地址空間所以開銷比較小。
為什么線程切換的開銷比協程的大?
協程切換比線程切換開銷小的主要原因有以下幾點:
- 用戶空間操作: 協程通常在用戶空間內管理,切換時不需要陷入內核態,而線程切換涉及內核態和用戶態之間的切換。由于內核態切換通常涉及到上下文的保存和恢復,以及內核數據結構的操作,開銷較大。
- 輕量級調度: 協程的調度是由用戶程序自行控制的,通常采用協作式調度,用戶程序在適當的時機主動讓出CPU,切換到其他協程。這種調度方式不需要內核的介入,開銷較小。
- 上下文切換成本低: 協程切換通常只涉及保存和恢復協程的執行上下文,如棧指針、寄存器等,這個過程在用戶空間內完成,不涉及內核調度器和內核態的切換,因此開銷較小。
- 無需同步原語: 在線程切換時,通常需要考慮同步原語(如互斥鎖、條件變量)的狀態和處理,以確保線程間的數據一致性。而在協程切換時,通常不需要考慮這些同步原語,因為協程之間共享同一個線程的地址空間,不涉及多線程之間的競爭和同步。
協程切換比線程切換開銷小的主要原因是協程在用戶空間內管理,不涉及內核態和用戶態之間的切換,調度方式輕量級,上下文切換成本低,且無需考慮同步原語等因素。這使得協程在高并發、IO密集型等場景下具有較好的性能和效率。
什么是 TLB?
TLB(Translation Lookaside Buffer,譯碼后備緩沖器)是一種硬件緩存,存儲了最近使用的虛擬地址到物理地址的映射關系,用于加速虛擬地址到物理地址的轉換過程。在現代計算機體系結構中,TLB通常被用于處理虛擬內存系統中的地址轉換。由于TLB的容量有限,如果訪問的虛擬地址不在TLB中,就會發生TLB缺失(TLB Miss),此時需要訪問MMU進行地址轉換,并將新的映射關系加載到TLB中。因此,TLB的命中率直接影響了系統的性能表現。
- 加速地址轉換: TLB存儲了虛擬地址到物理地址的映射關系,當CPU需要訪問內存時,先在TLB中查找對應的物理地址,如果命中則直接獲取物理地址,避免了訪問內存管理單元(MMU)進行地址轉換的開銷。
- 減少內存訪問延遲: 由于TLB位于CPU芯片內部,其訪問速度遠高于訪問主存的速度,因此能夠大大減少內存訪問的延遲,提高程序執行效率。
- 提高性能: TLB的存在可以大幅度提高系統的性能,特別是在需要頻繁進行地址轉換的應用場景下,如多任務操作系統、虛擬化環境等。
為什么每次切換 TLB 都會失效?
TLB(Translation Lookaside Buffer,譯碼后備緩沖器)每次失效的原因主要有以下幾點:
- 容量限制: TLB是一個硬件緩存,其容量通常比較有限。當系統中的虛擬地址空間非常大時,TLB無法存儲所有的虛擬地址到物理地址的映射關系,因此會發生TLB失效。
- 進程切換: 在多任務操作系統中,每個進程都有自己的虛擬地址空間,當發生進程切換時,當前進程的虛擬地址空間會被替換為下一個進程的虛擬地址空間。由于不同進程的虛擬地址空間可能不同,因此TLB中存儲的映射關系就會失效。
- 頁表更新: 虛擬地址到物理地址的映射關系是由操作系統的頁表管理的,當頁表發生變化時(如頁面置換、頁表更新等),TLB中存儲的映射關系也會失效。
- 地址空間切換: 在虛擬化環境中,虛擬機之間的地址空間是相互隔離的,當虛擬機切換時,TLB中存儲的映射關系也會失效。