0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

論述不同的搶占模型如何影響用戶和系統(tǒng)的行為

Linux閱碼場(chǎng) ? 來(lái)源:Linuxer ? 2020-06-03 16:03 ? 次閱讀

當(dāng)配置Linux內(nèi)核的時(shí)候,我們可以選擇一些參數(shù),這些參數(shù)能影響系統(tǒng)的行為。你可以用不同的優(yōu)先級(jí)、調(diào)度類和搶占模型來(lái)工作。正確地選擇這些參數(shù)是非常重要的。

本文將論述不同的搶占模型如何影響用戶和系統(tǒng)的行為。

當(dāng)你使用 make menuconfig配置內(nèi)核的時(shí)候,你能看到這樣的菜單:

為了深入理解這三個(gè)搶占模型的區(qū)別,我們將寫一個(gè)案例:

2個(gè)線程,一個(gè)高優(yōu)先級(jí)RT(50),一個(gè)低優(yōu)先級(jí)RT(30)

高優(yōu)先級(jí)的線程要睡眠3秒

低優(yōu)先級(jí)的線程用CPU來(lái)做計(jì)算

3秒后高優(yōu)先級(jí)線程喚醒。

如果低優(yōu)先級(jí)的線程陷入系統(tǒng)調(diào)用,高優(yōu)先級(jí)的線程睡眠到期,究竟會(huì)發(fā)生什么?下面我們來(lái)一種模型一種模型地看。

No Forced Preemption

這種情況下,上下文切換發(fā)生在系統(tǒng)調(diào)用返回用戶空間的點(diǎn)。案例如下:

2個(gè)線程,一個(gè)高優(yōu)先級(jí)RT(50),一個(gè)低優(yōu)先級(jí)RT(30)

高優(yōu)先級(jí)的線程要睡眠3秒

低優(yōu)先級(jí)的線程進(jìn)入系統(tǒng)調(diào)用計(jì)算5秒

5秒后低優(yōu)先級(jí)線程從內(nèi)核系統(tǒng)調(diào)用返回

高優(yōu)先級(jí)線程將醒來(lái)(但是比預(yù)期遲了2秒)。

內(nèi)核代碼,簡(jiǎn)單的字符設(shè)備:

#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 devicestatic ssize_t my_read(struct file *file, char __user *buf,size_t count,loff_t *ppos){ int len=5; if(*ppos > 0) { return 0; } mdelay(5000); // busy-wait for 5 seconds if (copy_to_user(buf , "hello" , len)) { return -EFAULT; } else { *ppos +=len; return len; }} static struct file_operations my_fops ={ .owner = THIS_MODULE, .read = my_read,}; static int hello_init (void){ my_dev = MKDEV(400,0); register_chrdev_region(my_dev,1,"demo"); my_cdev=cdev_alloc(); if(!my_cdev) { printk (KERN_INFO "cdev alloc error. "); return -1; } my_cdev->ops = &my_fops; my_cdev->owner = THIS_MODULE; if(cdev_add(my_cdev,my_dev,1)) { printk (KERN_INFO "cdev add error. "); return -1; } return 0; } static voidhello_cleanup (void){ cdev_del(my_cdev); unregister_chrdev_region(my_dev, 1);} module_init (hello_init);module_exit (hello_cleanup);MODULE_LICENSE("GPL");

讀里面delay了5秒, 注意mdelay是一個(gè)計(jì)算型的busy-loop。

用戶空間代碼如下:

#include#include#include#include #include #include void *hi_prio(void *p){ printf("thread1 start time=%ld ",time(NULL)); sleep(3); printf("thread1 stop time=%ld ",time(NULL)); return NULL;} void *low_prio(void *p){ char buf[20]; sleep(1); int fd=open("/dev/demo",O_RDWR); // #mknod /dev/demo c 400 0 puts("thread2 start"); read(fd,buf,20); puts("thread2 stop"); return NULL;} int main(){ pthread_t t1,t2,t3; pthread_attr_t attr; struct sched_param param; pthread_attr_init(&attr); pthread_attr_setschedpolicy(&attr, SCHED_RR); param.sched_priority = 50; pthread_attr_setschedparam(&attr, ¶m); pthread_create(&t1,&attr,hi_prio,NULL); param.sched_priority = 30; pthread_attr_setschedparam(&attr, ¶m); pthread_create(&t2,&attr,low_prio,NULL); sleep(10); puts("end test"); return 0;}

實(shí)驗(yàn)步驟:

高優(yōu)先級(jí)線程開始睡眠3秒

低優(yōu)先級(jí)線程睡眠1秒然后做系統(tǒng)調(diào)用

高優(yōu)先級(jí)線程6秒后醒來(lái)(stop和start的時(shí)間差)

# insmod demo.ko # ./appthread1 start time=182thread2 startthread1 stop time=188thread2 stopend test

Preemptible Kernel

這種情況內(nèi)核里面也可以搶占,意味著上述程序里面的高優(yōu)先級(jí)線程3秒后可醒來(lái)。

這種情況下,系統(tǒng)會(huì)有更多的上下文切換,但是實(shí)時(shí)性更加好。對(duì)于要求軟實(shí)時(shí)的嵌入式系統(tǒng)而言,這個(gè)選項(xiàng)是最佳的。但是對(duì)于服務(wù)器而言,通常第一個(gè)選項(xiàng)更好——更少的上下文切換,更多的CPU時(shí)間用作有用功。

運(yùn)行結(jié)果(stop、start時(shí)間差3秒):

# insmod ./demo.ko#./appthread1 start time=234thread2 startthread1 stop time=237thread2 stopend test

Voluntary Kernel Preemption

這種情況和第一種情況"no forced preemption"類似,但是內(nèi)核開發(fā)者可以在進(jìn)行復(fù)雜操作的時(shí)候,時(shí)不時(shí)檢查一下是否可以reschedule。他們可以調(diào)用might_resched()函數(shù)。

在下面的代碼中,我們添加了一些檢查點(diǎn)(check point)

// callback for read system call on the devicestatic ssize_t my_read(struct file *file, char __user *buf,size_t count,loff_t *ppos){ int len=5; if(*ppos > 0) { return 0; } mdelay(4000); // busy-wait for 4 seconds might_resched(); delay(3000); // busy wait for 3 seconds if (copy_to_user(buf , "hello" , len)) { return -EFAULT; } else { *ppos +=len; return len; }}

如果我們把might_resched()注釋掉,它會(huì)delay 7秒。

添加cond_resched()調(diào)用將導(dǎo)致系統(tǒng)檢查是否有高優(yōu)先級(jí)的任務(wù)被喚醒,這樣高優(yōu)先級(jí)任務(wù)5秒可以醒來(lái)(其中1秒在systemcall之前,另外4秒在kernel)。

運(yùn)行結(jié)果:

#insmod./demo.ko#./appthread1 start time=320thread2 startthread1 stop time=325thread2 stopend test

Full Real Time Preemption

如果我們使能RT補(bǔ)丁,我們會(huì)得到一個(gè)硬實(shí)時(shí)的kernel。這意味著任何代碼可以搶占任何人。比如一個(gè)更加緊急的任務(wù)可以搶占中斷服務(wù)程序ISR。這個(gè)patch進(jìn)行了如下改動(dòng):

把中斷服務(wù)程序轉(zhuǎn)化為優(yōu)先級(jí)是50的RT線程

把softIRQ轉(zhuǎn)化為優(yōu)先級(jí)是49的RT線程

把所有的spinlock變成mutex

高精度定時(shí)器

其他的細(xì)小改動(dòng)

打補(bǔ)丁后會(huì)看到2個(gè)新增的菜單:

其中“Preemptible Kernel (Basic RT)” 是為了調(diào)試目的的,為了全面使用RT補(bǔ)丁的功能,我們應(yīng)該選擇最后一項(xiàng) – Fully Preemptible Kernel。這樣我們會(huì)有更多的上下文切換,但是可以滿足RT的實(shí)時(shí)要求。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40084
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207920

原文標(biāo)題:理解Linux內(nèi)核搶占模型(最透徹一篇)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Simscape Battery模型的電池系統(tǒng)建模與仿真

    Simscape Battery? 以模塊庫(kù)和 API的方式幫助我們對(duì)電池以及儲(chǔ)能系統(tǒng)進(jìn)行建模。我們可以用它來(lái)實(shí)現(xiàn)電芯電熱耦合模型、配置和測(cè)試電池架構(gòu)、設(shè)計(jì)電池管理系統(tǒng),繼而評(píng)估電池系統(tǒng)
    的頭像 發(fā)表于 09-05 09:45 ?182次閱讀
    基于Simscape Battery<b class='flag-5'>模型</b>的電池<b class='flag-5'>系統(tǒng)</b>建模與仿真

    AI行為識(shí)別視頻監(jiān)控系統(tǒng) Python

    AI行為識(shí)別視頻監(jiān)控系統(tǒng)來(lái)自機(jī)器視覺(jué)技術(shù)的革新。機(jī)器視覺(jué)技術(shù)應(yīng)用是人工智能技術(shù)分析的一個(gè)支系。它可以在圖形和圖象具體內(nèi)容敘述中間創(chuàng)建投射關(guān)聯(lián),使電腦可以根據(jù)圖像處理和剖析比較,進(jìn)而熟悉視頻圖象中
    的頭像 發(fā)表于 07-06 10:36 ?293次閱讀
    AI<b class='flag-5'>行為</b>識(shí)別視頻監(jiān)控<b class='flag-5'>系統(tǒng)</b> Python

    鴻蒙Ability Kit(程序框架服務(wù))【組件啟動(dòng)規(guī)則(Stage模型)】

    總體規(guī)則 為了保證用戶具有更好的使用體驗(yàn),對(duì)以下幾種易影響用戶體驗(yàn)與系統(tǒng)安全的行為做了限制: 后臺(tái)應(yīng)用任意彈框,如各種廣
    的頭像 發(fā)表于 06-10 18:47 ?587次閱讀
    鴻蒙Ability Kit(程序框架服務(wù))【組件啟動(dòng)規(guī)則(Stage<b class='flag-5'>模型</b>)】

    視頻AI行為監(jiān)測(cè)系統(tǒng)在高速公路中應(yīng)用

    在高速公路的監(jiān)控中,視頻AI行為監(jiān)測(cè)系統(tǒng)扮演著至關(guān)重要的角色。它利用先進(jìn)的AI技術(shù),對(duì)高速公路上的監(jiān)控視頻進(jìn)行實(shí)時(shí)分析,為交通管理部門提供準(zhǔn)確、及時(shí)的信息,從而提升道路的通行效率,保障交通安全
    的頭像 發(fā)表于 06-05 18:06 ?662次閱讀

    系統(tǒng)中的latency是如何產(chǎn)生的

    在當(dāng)今數(shù)字時(shí)代,手機(jī)已成為人們?nèi)粘I钪胁豢苫蛉?,多任?wù)處理和實(shí)時(shí)響應(yīng)對(duì)于用戶體驗(yàn)越來(lái)越重要,搶占(preemption)機(jī)制在提升系統(tǒng)性能和用戶體驗(yàn)方面發(fā)揮了至關(guān)重要的作用。內(nèi)核
    的頭像 發(fā)表于 06-04 09:18 ?410次閱讀
    <b class='flag-5'>系統(tǒng)</b>中的latency是如何產(chǎn)生的

    Anthropic修改服務(wù)政策:允未成年人使用AI模型,禁AI用于非法行為

    據(jù)報(bào)道,Anthropic于上周對(duì)其服務(wù)政策進(jìn)行了調(diào)整,決定自6月6日起允許未成年人使用旗下AI模型的服務(wù),并進(jìn)一步明確了不得將此AI用于侵犯用戶隱私等不當(dāng)行為。
    的頭像 發(fā)表于 05-13 14:23 ?397次閱讀

    【大語(yǔ)言模型:原理與工程實(shí)踐】大語(yǔ)言模型的應(yīng)用

    ,它通過(guò)抽象思考和邏輯推理,協(xié)助我們應(yīng)對(duì)復(fù)雜的決策。 相應(yīng)地,我們?cè)O(shè)計(jì)了兩類任務(wù)來(lái)檢驗(yàn)大語(yǔ)言模型的能力。一類是感性的、無(wú)需理性能力的任務(wù),類似于人類的系統(tǒng)1,如情感分析和抽取式問(wèn)答等。大語(yǔ)言模型在這
    發(fā)表于 05-07 17:21

    模型在戰(zhàn)略評(píng)估系統(tǒng)中的應(yīng)用有哪些

    體現(xiàn)在以下幾個(gè)方面: 數(shù)據(jù)整合與分析:大模型具有處理大規(guī)模數(shù)據(jù)的能力,可以整合來(lái)自不同來(lái)源、不同格式的戰(zhàn)略數(shù)據(jù),如市場(chǎng)趨勢(shì)、競(jìng)爭(zhēng)情報(bào)、用戶行為等。 戰(zhàn)略預(yù)測(cè)與模擬:大模型通過(guò)學(xué)習(xí)和理解
    的頭像 發(fā)表于 04-24 13:48 ?188次閱讀

    RTTnano的用戶main函數(shù)中的優(yōu)先級(jí)是多少?

    RTTnano 的用戶main函數(shù)中的優(yōu)先級(jí)是多少?為什么會(huì)出現(xiàn)創(chuàng)建新的task之后,main函數(shù)會(huì)搶占掉低優(yōu)先級(jí)的task,例如RT_THREAD_PRIORITY_MAX設(shè)置為8 ,低于3
    發(fā)表于 02-26 08:01

    SPICE中的熱模型介紹

    SPICE模型中的熱模型是指用于模擬和預(yù)測(cè)電子元件在工作時(shí)的熱行為特性的模型。這些模型通常與電路仿真軟件一起使用,以便在設(shè)計(jì)階段評(píng)估和優(yōu)化電
    的頭像 發(fā)表于 02-06 11:28 ?739次閱讀
    SPICE中的熱<b class='flag-5'>模型</b>介紹

    跨電感電壓調(diào)節(jié)器(TLVR)的瞬態(tài)行為

    電壓調(diào)節(jié)器(TLVR)。TLVR的原理圖來(lái)自耦合電感模型,但物理行為不同。事實(shí)上,耦合電感的簡(jiǎn)單模型通常是可以輕松用于仿真以實(shí)現(xiàn)正確波形的東西,但它與實(shí)際物理行為并不對(duì)應(yīng)。另一方面,T
    的頭像 發(fā)表于 01-24 09:13 ?2490次閱讀
    跨電感電壓調(diào)節(jié)器(TLVR)的瞬態(tài)<b class='flag-5'>行為</b>

    使用Cauer網(wǎng)絡(luò)仿真熱行為與對(duì)開關(guān)損耗影響的評(píng)估

    過(guò)去,仿真的基礎(chǔ)是行為和具有基本結(jié)構(gòu)的模型,它們主要適用于簡(jiǎn)單集成電路技術(shù)中使用的器件。但是,當(dāng)涉及到功率器件時(shí),這些簡(jiǎn)單的模型通常無(wú)法預(yù)測(cè)與為優(yōu)化器件所做的改變相關(guān)的現(xiàn)象?,F(xiàn)在,通過(guò)引入物理和可
    的頭像 發(fā)表于 12-29 16:02 ?1389次閱讀
    使用Cauer網(wǎng)絡(luò)仿真熱<b class='flag-5'>行為</b>與對(duì)開關(guān)損耗影響的評(píng)估

    淺談裝配系統(tǒng)中的數(shù)字孿生

    建立數(shù)字孿生體的行為模型。在裝配系統(tǒng)中創(chuàng)建的數(shù)字孿生模型不僅僅是實(shí)際零部件的三維CAD模型,同時(shí)基于裝備的傳感器,也對(duì)各組件的
    的頭像 發(fā)表于 12-22 11:51 ?478次閱讀

    大信號(hào)模型和小信號(hào)模型的區(qū)別

    電路或系統(tǒng)在輸入信號(hào)幅度較大時(shí)的行為。在這種模型下,電路或系統(tǒng)的輸出信號(hào)與輸入信號(hào)之間的線性關(guān)系被忽略,而是關(guān)注輸入信號(hào)幅度變化對(duì)電路或系統(tǒng)
    的頭像 發(fā)表于 12-19 11:35 ?7723次閱讀

    OpenHarmony應(yīng)用模型的構(gòu)成要素與Stage優(yōu)勢(shì)

    系統(tǒng)管控成本。 提供特定場(chǎng)景(如服務(wù)卡片、輸入法)的應(yīng)用組件,以便滿足更多的使用場(chǎng)景。 規(guī)范化后臺(tái)進(jìn)程管理:為保障用戶體驗(yàn),Stage模型對(duì)后臺(tái)應(yīng)用進(jìn)程進(jìn)行了有序治理,應(yīng)用程序不能隨意駐留在后臺(tái),同時(shí)應(yīng)用后臺(tái)
    發(fā)表于 09-26 16:48