作業系統如何有效地掌控CPU
作業系統的本質
作業系統本質上也是一個程序,它與其他使用者程序共享CPU。與普通程序不同的是,它具有硬體的所有訪問許可權。而使用者程序預設對硬體是沒有任何訪問許可權的,它只能通過系統呼叫,委託作業系統來完成這些操作。
問題
當作業系統在建立完一個程序後,會將CPU的控制權交給這個新建立的程序。上下文切換,大家應該都知道。作業系統要做的就是停止一個程序,然後再啟動另一個程序。很簡單是吧,那麼問題來了,作業系統的程式都不在運行了,它已經把CPU的使用權給其他程序了,怎麼對這個程序進行控制呢?
協作方式:等待系統呼叫
在過去的某些系統中曾經就使用過這種方式,在這種情況下,作業系統信任使用者程序可以正確地執行,不會出么蛾子。
以下兩種情況出現時,CPU會恢復作業系統程序:
注:trap handler和exception handler是在電腦開機的時候告知CPU的
作業系統就恢復了對CPU的控制,在這個時候它就可以決定要不要進行上下文切換。
缺點:
1.只能被動地等待使用者程序進行System Call或者出錯,作業系統才能恢復對CPU的控制
2.如果使用者程序沒有進行I/O操作,進入死迴圈,則作業系統永遠無法恢復控制,唯一的解決方法就是重啟
非協作方式:定時器中斷
以上方式有明顯的缺點,為了讓計算機提供穩定的服務,作業系統必須把對使用者程序進行把控。而要想把控程序則必須保持對CPU的控制權。
如果不能讓在CPU內部執行的程式讓出CPU,那能不能從外部侵入呢?
可以,早期的作業系統開發人員就想到用定時器中斷的方式來處理,定時器是單獨的一個硬體裝置,它可以獨立執行。每隔一段時間就給CPU一箇中斷訊號,打斷它的執行。
但是打斷歸打斷,怎麼恢復作業系統呢?
和上面一樣,CPU在開機的時候會被告知一個interrup handler,當中斷出現的時候,它的處理方式就是恢復作業系統程序。
準備工作
綜上,針對這個定時器中斷的方案,作業系統在電腦開機的時候,要做這幾件事,一個是開啟定時器,另一個是告知CPU,讓它知道當定時器中斷產生的時候該執行什麼程式碼。
注:時間片的大小一般是定時器中斷時間的倍數。所以當某次因中斷恢復OS的時候,剛好可以執行上下文切換。