Linux核心 了解Linux核心搶占

2021-10-09 21:56:34 字數 3349 閱讀 1256

目錄

無強制搶占

可搶占核心

自願核心搶占

完全實時搶占

在配置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 讀核日記...