linux裝置驅動歸納總結(四):3.搶占和上下文切換
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
上一節介紹了程序排程的一些基本概念,并簡單介紹了在沒有搶占的情況下,CFS排程的是如何配置設定程序的優先級和時間片。但是,核心并不會隻是單一地配置設定時間片讓程序運作。
一、什麼是上下文切換
上下文切換,是指從一個可執行的程序切換到另外一個可執行的程序。在linux核心中,上下文的切換有兩種方式:第一種是程序主動讓出CPU,這樣的操作成為“讓步”。第二種是由核心排程程式決定程序運作時間,在在運作時間結束(如時間片耗盡)或者需要切換高優先級程序時強制挂起程序,這樣的操作叫“搶占”。
搶占是我一直誤解的概念,我一直以為搶占是一個程序強制切換到另一程序。最近才知道,執行搶占的是核心,并不是程序。
搶占分為兩種:使用者搶占和核心搶占。下面将一一介紹。
二、使用者搶占
如果隻是靠每個程序主動放棄CPU,這是相當不明智的做法,是以,核心使用need_resched标志(在每個程序對應的thread_info結構體内)來表示程序是否需要被排程。當一個程序的時間片耗盡,或者有更高優先級的程序進入可執行隊列,目前運作的程序對應的need_reched标志會被設定。
在核心即将要傳回使用者空間的時候,如果need_resched标志被設定,核心會在繼續執行原來的程序之前調用排程程式,此時就會發生使用者搶占。
要注意,使用者搶占是發生在即将傳回使用者空間前,核心調用排程程式,重新選擇一個更加合适的程序來運作(如高優先級),當然也可以是原來的程式。
總的來說,在以下情況下會發生使用者搶占:
1、從系統調用傳回使用者空間。
2、從中斷處理程式傳回使用者空間。
類比一下生活,其實這個很容易了解。如有人占用着廁所解大手時,有人進來需要解小手,或者允許他解大手的時間已經用完了,管廁所的人兄就會做個标記。等解大手的人兄沖完廁所了,管廁所的人兄看到自己做的标記,馬上把解大手的人兄趕出來,把廁所讓給解小手的人兄。
使用者搶占并不是2.6核心的新特征,它隻是一種程序排程的政策。核心傳回使用者空間後,每個程序有獨立的4G虛拟空間,這時的程序排程并不會出現核心資源的争奪。
三、核心搶占
核心搶占是2.6核心的新特征,在之前的核心中,排程程式是不能排程正在運作在核心中的程序,即使時間片已經用完,隻有在程序傳回使用者空間或者阻塞,才能進行程序的排程。
在2.6核心中,核心提供了為高優先級程序搶占正在核心運作的程序的機會。但是,對于多個同時運作的程序,核心空間的資源的共享的。是以,核心在搶占并且排程程序的時候,必須要保證排程是安全的。所謂的安全,就是不會因為新程序的排程導緻一些共享資源的錯亂,這就是下一節要讨論的核心同步。
核心程序可以調用函數來禁止核心搶占,在禁止這段時間内,搶占是不允許的,這樣也是保護核心共享資源的一種方法。
是以,核心搶占發生在以下時候:
1、當終端處理程式将要執行完畢,傳回核心空間之前。
2、執行在可以搶占的代碼的時候。
3、核心程序讓出CPU後,如阻塞。
生活上的例子我就不舉了,描述拉到一半的過程實在惡心,有興趣的自己聯想。
四、總結
今天介紹了搶占的概念,這些都是我的了解,并不能確定一定正确,同時我把書上這麼長的介紹壓縮成短短的幾句話,必然有很多不足的地方,希望大家能夠指正。
在很多的書籍中描述的搶占大多數都是多核心搶占,并不是說使用者搶占,使用者搶占可以了解為一種程序排程的方式。
而由于核心搶占的出現,核心用共享資源的保護顯得尤為重要,這是因為所有的程序都進入核心運作,稍不留神就會把另一個程序的資源更改掉,下節就是要介紹如何實作核心資源的保護。
同時需要強調的是,程序排程的介紹并沒有涉及中斷,一般的,隻要中斷産生,核心就會馬上相應,不管程序在核心還是使用者空間,是以這也是核心資源保護的内容之一。