盡管每個行程都有自己的地址空間,但所有行程必須共享CPU暫存器。因此,在恢復一個行程的執行之前,內核必須確保每個暫存器裝載了掛起行程時所需要的值。
行程恢復執行前必須裝入暫存器的一組資料成為硬體背景關系(hardware context)。硬體背景關系是行程可執行背景關系的一個自己,因為可執行背景關系包含行程執行時所需要的所有資訊。在Linux中,行程硬體上下午的一部分存放在TSS段,而剩余部分存放在內核態堆疊中。
在下面描述中,假定用prev區域變數表示切換出的行程描述符,next表示切換進的行程描述符。因此,我們把行程切換定義為這樣的行為:保存prev硬體背景關系,用next硬體背景關系代替prev。因為行程切換經常發生,因此減少保存和裝入硬體背景關系所話費的時間是非常重要的。
早期Linux版本利用80x86體系結構所需提供的硬體支持,并通過far jmp1指令跳到next行程TSS描述符的選擇符來執行行程切換。當執行這條指令時,CPU通過自動保存原來的硬體背景關系,裝入新的硬體背景關系來執行硬體背景關系切換。但Linux2.6使用軟體執行行程切換,原因有:
通過一組mov指令逐步執行切換,這樣能較好地控制所裝入的資料的合法性,一面被惡意用戶偽造。far jmp指令不會有這樣的檢查。
舊方法和新方法所需時間大致相同。
行程切換值發生在內核態,在執行行程切換之前,用戶態行程使用的所有暫存器內容已保存在內核堆疊上,這也包括ss和esp這對暫存器的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/132913.html
標籤:系統維護與使用區
上一篇:Ambari2.7.3搭建HDP集群遇到的問題,有大佬能幫看看嘛?
下一篇:Linux中“/”和“~”的區別
