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;它只在 內核空間運行,從來不切換到用戶空間去;並且和普通進程一樣,可以被調度,也可以被搶占。