核心搶占與preempt count

2021-09-06 06:18:50 字數 2108 閱讀 6638

**:

1 相關資料結構 

struct thread_info ;

/* how to get the thread information struct from c */

static inline struct thread_info *current_thread_info(void)

#define preempt_count() (current_thread_info()->preempt_count)

2 以下內容**:核心搶占

與其他大部分unix變體和其他大部分的作業系統不同, linux完整地支援核心搶占。

在不支援核心搶占的核心中,核心**可以一直執行,到它完成為止。也就是說,排程程式沒有辦法在乙個核心級的任務正在執行的時候重新排程 – 核心中的各任務是協作方式排程的,不具備搶占性。

在2.6版的核心中,核心引入了搶占能力;現在,只要重新排程是安全的,那麼核心就可以在任何時間搶占正在執行的任務。

那麼,什麼時候重新排程才是安全的呢?只要沒有持有鎖,核心就可以進行搶占。鎖是非搶占區域的標誌。由於核心是支援smp的,所以,如果沒有持有鎖,那麼正在執行的**就是可重新匯入的,也就是可以搶占的。

為了支援核心搶占所作的第一處變動就是每個程序的thread_info引入了 preempt_count(thread_info.preempt_count)計數器。該計數器初始值為0,每當使用鎖的時候數值加1,釋放鎖的時候數值減1。當數值為0的時候,核心就可執行搶占。從中斷返回核心空間的時候,核心會檢查flag和preempt_count的值。如果flag中tif_need_resched被設定,並且preempt_count為0的話,這說明有乙個更為重要的任務需要執行並且可以安全地搶占,此時,排程程式就會排程(搶占當前程序)。如果preempt_count不為0,說明當前任務持有鎖,所以搶占是不安全的。這時,就會像通常那樣直接從中斷返回當前執行程序。 如果當前程序所持有的所有的鎖都被釋放了,那麼preemptcount就會重新為0。此時,釋放鎖的**會檢查need_resched是否被設定。如果是的話,就會呼叫排程程式。有些核心**需要允許或禁止核心搶占。

如果核心中的程序被阻塞了,或它顯式地呼叫了schedule(),核心搶占也會顯式地發生。這種形式的核心**從來都是受支援的,因為根本無需額外的邏輯來保證核心可以安全地發生被搶占。如果**顯式的呼叫了schedule(),那麼它應該清楚自己是可以安全地被搶占的。

核心搶占發生在: 

當"從中斷處理程式"正在執行,且返回核心空間之前 

核心**再一次具有可搶占性的時候 

如果核心中的任務顯式的呼叫schedule() 

如果核心中的任務阻塞(這同樣也會導致呼叫schedule()) 

注:current->threadinfo.flags中tif_need_resched為1,表示當前程序需要執行schedule()釋放cpu控制權 

current->threadinfo.preemptcount的值不為0,表示當前程序持有鎖不能釋放cpu控制權(不能被搶占)

當從核心態返回到使用者態的時候,要檢查是否進行排程,而排程要看兩個條件:

1.preempt_count是否為0

2.rescheduled是否置位

檢查preempt_count的時候,是統一檢查是否為0,也就是說,

有4個條件限制,可能不能夠進行排程。

1.preempt_disable()

#define preempt_disable() \

do while (0)

#define inc_preempt_count() add_preempt_count(1)

會在preempt_enable中釋放

2.add_preempt_count(hardirq_offset)

是在irq_enter()中呼叫的,記錄進入硬體中斷處理的次數(計數),

會在irq_exit()中釋放

3.__local_bh_disable((unsigned long)__builtin_return_address(0));

在do_softirq中呼叫的,

static inline void __local_bh_disable(unsigned long ip)

4.總開關,第一位。

搶占式核心與非搶占式核心的區別

核心搶占 可搶占式核心 即當程序位於核心空間時,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的程序。非搶占式核心 高優先順序的程序不能中止正在核心中執行的低優先順序的程序而搶占cpu執行。程序一旦處於核心態 例如使用者程序執行系統呼叫 則除非程序自願放...

核心競態與搶占

最古老的作業系統是單程序的。後來出現了多工作業系統,因為多程序在核心態中資源都是共享的,所以容易造成破壞,早期的程序排程器在核心態是不能被搶占的,在進入核心態的時候程序排程器停止排程,這樣降低了核心的複雜程度。穩定性也相對較高,伺服器中常用。更先進的核心,能夠在核心態搶占,這就需要鎖來保證核心執行緒...

核心搶占VS使用者搶占

使用者搶占 核心即將返回使用者空間的時候,如果need resched被設定,會導致schedule 被呼叫,此時就會發生使用者搶占。在核心返回使用者空間的時候,它知道自己是安全的,因為既然它可以繼續去執行當前程序,那麼它當然可以再去選擇乙個新的程序去執行。所以核心無論是從中斷處理程式還是在系統呼叫...