內核線程的進程描述符task_struct中的mm和active_mm


task_struct進程描述符中包含兩個跟進程地址空間相關的字段mm, active_mm,

struct task_struct
{
    // ...
    struct mm_struct *mm;
    struct mm_struct *avtive_mm;
    //...
};

大多數計算機上系統的全部虛擬地址空間分為兩個部分: 供用戶態程序訪問的虛擬地址空間和供內核訪問的內核空間。每當內核執行上下文切換時, 虛擬地址空間的用戶層部分都會切換, 以便當前運行的進程匹配, 而內核空間不會放生切換。

對於普通用戶進程來說,mm指向虛擬地址空間的用戶空間部分,而對於內核線程,mm為NULL。

這位優化提供了一些余地, 可遵循所謂的惰性TLB處理(lazy TLB handing)。active_mm主要用於優化,由於內核線程不與任何特定的用戶層進程相關,內核並不需要倒換虛擬地址空間的用戶層部分,保留舊設置即可。由於內核線程之前可能是任何用戶層進程在執行,故用戶空間部分的內容本質上是隨機的,內核線程決不能修改其內容,故將mm設置為NULL,同時如果切換出去的是用戶進程,內核將原來進程的mm存放在新內核線程的active_mm中,因為某些時候內核必須知道用戶空間當前包含了什么。

為什么沒有mm指針的進程稱為惰性TLB進程?

假如內核線程之后運行的進程與之前是同一個, 在這種情況下, 內核並不需要修改用戶空間地址表。地址轉換后備緩沖器(即TLB)中的信息仍然有效。只有在內核線程之后, 執行的進程是與此前不同的用戶層進程時, 才需要切換(並對應清除TLB數據)。

內核線程和普通的進程間的區別在於內核線程沒有獨立的地址空間,mm指針被設置為NULL;它只在 內核空間運行,從來不切換到用戶空間去;並且和普通進程一樣,可以被調度,也可以被搶占。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM