目錄
無強制搶占
可搶占核心
自願核心搶占
完全實時搶占
在配置linux核心時,我們可以設定一些影響系統行為的引數。您可以使用不同的優先順序,排程類和搶占模型。了解並選擇正確的引數非常重要。
在這篇文章中,我將介紹不同的搶占模型,以及每種模型如何影響使用者和核心行為
如果配置核心(使用make menuconfig),通常可以在核心功能子選單中找到選項–搶占模型:
為了理解每個選項,讓我們舉個例子:
這種情況既簡單又合理,但是如果低優先順序執行緒在高優先順序處於休眠狀態時呼叫核心**會怎樣?這取決於上面的配置
僅當我們從核心返回時,才進行上下文切換。讓我們舉個例子:
讓我們看一下**:
核心**–簡單字元裝置驅動程式:
#include #include #include #include #include #include #include #include #include #include #include #include static dev_t my_dev;
static struct cdev *my_cdev;
// callback for read system call on the device
static ssize_t my_read(struct file *file, char __user *buf,size_t count,loff_t *ppos)
mdelay(5000); // busy-wait for 5 seconds
if (copy_to_user(buf , "hello" , len)) else }
static struct file_operations my_fops =;
static int hello_init (void)
my_cdev->ops = &my_fops;
my_cdev->owner = this_module;
if(cdev_add(my_cdev,my_dev,1))
return 0; }
static void
hello_cleanup (void)
module_init (hello_init);
module_exit (hello_cleanup);
module_license("gpl");
讀取延遲5秒鐘(延遲是乙個繁忙的等待迴圈)並返回一些資料
使用者空間**:
#include#include#include#include #include #include void *hi_prio(void *p)
void *low_prio(void *p)
int main()
# insmod demo.ko
thread1 start time=182
thread2 start
thread1 stop time=188
thread2 stop
end test
在此配置中,上下文切換也在核心中按時完成,這意味著如果我們執行上述測試,我們將看到3秒鐘後喚醒高優先順序執行緒:
這意味著在此選項中,系統每秒將執行更多上下文切換,但
更「實時」。在對實時性有要求的嵌入式系統上,最好使用此選項,但
在通常非同步工作的伺服器系統中,第乙個選項更好–上下文切換少– cpu時間長
輸出:
# insmod ./demo.ko
thread1 start time=234
thread2 start
thread1 stop time=237
thread2 stop
end test
在這種配置下,系統就像「沒有強制搶占」那樣工作,但是如果核心開發人員正在編寫複雜的**,則它負責不時檢查是否需要重新排程。他可以使用
may_resched()函式做到這一點
因此,在此示例中,如果要新增此「檢查點」,我們將更改**:
// callback for read system call on the device
static ssize_t my_read(struct file *file, char __user *buf,size_t count,loff_t *ppos)
mdelay(4000); // busy-wait for 4 seconds
might_resched();
delay(3000); // busy wait for 3 seconds
if (copy_to_user(buf , "hello" , len)) else
}
如果我們注釋掉may_resched()行,它將總共延遲7秒鐘,如果其他高優先順序執行緒處於喚醒狀態,則新增
cond_resched呼叫將檢查並執行上下文切換。將在5秒鐘後呼叫(呼叫之前1秒鐘,核心中4秒鐘)
輸出:
# insmod ./demo.ko
thread1 start time=320
thread2 start
thread1 stop time=325
thread2 stop
end test
如果您應用rt補丁 ,您將獲得hard實時核心。這意味著任何**都可以阻止其他**,如果您執行中斷服務程式**,並且需要處理更緊急的事情,它將阻止isr**。該補丁會更改以下內容:
應用補丁後,您可以在選單中看到另外兩個選項:
選項「搶占式核心(基本rt)」用於除錯(請參閱文件)
要進行上述所有更改,您需要選擇最後乙個選項–完全可搶占核心。
現在,如果您建立乙個rt優先順序大於50的執行緒,它將阻止中斷
請注意,在此配置中,系統具有更多工,並且每秒執行更多上下文切換。也就是說,cpu花費更多的時間來切換任務,但是我們可以按要求的任何最後期限(1毫秒或更長時間)
了解 Linux核心架構 2
程序,程序切換,排程 傳統上,unix作業系統下執行的應用程式,伺服器及其他程式都稱為程序 processes 每個程序都在cpu的虛擬記憶體中分配位址空間 各程序的位址空間是完全獨立的,因此程序並不會意識到彼此的存在 從程序的角度來看,它會認為自己是系統中唯一的程序 如果程序想要彼此通訊 例如交換...
了解並編譯linux核心
一 核心的功能 1 系統呼叫 2 程序控制 3 記憶體管理 4 檔案系統管理 5 裝置驅動程式 二 編譯linux核心 進入到核心源 目錄 cd usr src linux 2.6.15 make config make xconfig make menuconfig make 三 裁剪linux ...
讀核日記 《Linux核心完全注釋》
linux核心完全注釋 v1.9.5版說明 linux 核心 6.程序間通訊機制 linux 核心 4.記憶體管理 linux 核心 5.linux程序 linux 核心 3.軟體基礎 linux 核心 2.硬體基礎 linux 核心 1.前言 讀核日記 八 linux的記憶體管理機制 2 讀核日記...