核心競態與搶占

2021-06-10 07:52:48 字數 974 閱讀 5780

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

以下用兩段**說明

第一種 非競態核心

static int test_init(void)

module_init(test_init);

提示符下輸入:

$insmod test.ko &

test_init

當模組載入時進入死迴圈,進入核心態時程序排程器停止工作,其他程序不會被呼叫到,所以機器就徹底死掉了

static int test_init(void)

module_init(test_init);

提示符下輸入:

$insmod test.ko &

test_init

當模組載入時進入死迴圈,但是程序排程器仍然在工作,所以後台程序依然可以繼續工作

說明:preempt_enable 允許搶占。

preempt_disable禁止搶占。

請參閱《深入理解linux核心》第5章

具體配置核心搶占方式

核心特性->

搶占模式->

三種搶占模式,核心態禁止搶占,自搶占核心,允許搶占核心

併發與競態

linux是乙個多工的作業系統,在多個程序同時執行時,就有可能為了競爭同乙個資源發生堵塞。以下是解決的幾種方法 1 訊號量 declare mutex sem if down interruptible sem critical section up sem 2 完成量 declare comple...

12 競態條件 時序競態

sleep函式幾點說明 1 sleep函式作用,讓程序睡眠。2 能被訊號打斷,然後處理訊號函式以後,就不再睡眠了。直接向下執行 3 sleep函式的返回值,是剩餘的秒數 sleep是可被中斷的睡眠,但不一定睡夠100s sleep是可中斷的睡眠 void handler int num if 1 v...

核心搶占與preempt count

1 相關資料結構 struct thread info how to get the thread information struct from c static inline struct thread info current thread info void define preempt c...