LINUX進程調度分析源碼,Linux 實時調度(源碼分析)

為了弄清楚在多cpu系統中是如何實現實時調度的,先引入以下幾個概念:

cpu的狀態:

我們知道,在linux系統中,任務的優先級為0~140。

INVALID:(-1)該cpu不可用

IDLE(0):140

NORMAL(1):100~139對應于普通任務的優先級

RT0~RT99(2~102):對應于實時任務的優先級

進程優先級:

在linux內核中,每個進程都有一個task_struct,其中與優先級相關的屬性包括

1、prio:對于非實時進程而言prio==normal_prio=99-rt_priority(prio的值越大,則進程的優先級越小)

2、normal_prio:99-rt_priority

3、static_prio:=100+nice

4、rt_priority:0:非實時任務;[1,99]實時任務,值越大,優先級越高。

在調度時使用了prio,其數值0對應最高優先級,99為最低實時優先級。Prio和normal_prio數值越大優先級越小,而rt_priority的數值越大優先級越大。

task balance:

在多cpu系統中,為了保證各個cpu上實時任務的負載均衡,引入了push和pull操作:

1、push操作:

當當前cpu上有多于一個的實時任務,那么需要使用pull操作看看是否可以將還未運行的實時任務移動到其他的cpu上,主要操作由push_rt_task函數完成。static?int?push_rt_task(struct?rq?*rq)

{

struct?task_struct?*next_task;

struct?rq?*lowest_rq;

int?ret?=?0;

///如果當前隊列不是超載狀態,則直接返回

if?(!rq->rt.overloaded)

return?0;

///選擇rq中下一個進程

next_task?=?pick_next_pushable_task(rq);

if?(!next_task)

return?0;

retry:

......

///如果下一個進程的優先級比當前進程的優先級高,那么需要執行的不是push操作而是重新調度

if?(unlikely(next_task->prio?curr->prio))?{

resched_task(rq->curr);

return?0;

}

......

///尋找那個cpu的rq符合條件,將其rq上鎖

lowest_rq?=?find_lock_lowest_rq(next_task,?rq);

///如果沒有找到合適的rq,我們則需要判斷:到底還要不要再找,因為在find_lock_lowest_rq函數中釋放了當前rq上的鎖,因此可能會導致當前rq上沒有需要push的任務,在這種情況下我們就不用再試,如果需要push的任務還在,那么則進入retry繼續嘗試。

if?(!lowest_rq)?{

struct?task_struct?*task;

task?=?pick_next_pushable_task(rq);

if?(task_cpu(next_task)?==?rq->cpu?&&?task?==?next_task)?{

goto?out;

}

if?(!task)

goto?out;

put_task_struct(next_task);

next_task?=?task;

goto?retry;

}

///執行任務遷移相關的工作。

deactivate_task(rq,?next_task,?0);

set_task_cpu(next_task,?lowest_rq->cpu);

activate_task(lowest_rq,?next_task,?0);

ret?=?1;

resched_task(lowest_rq->curr);

double_unlock_balance(rq,?lowest_rq);

out:

put_task_struct(next_task);

return?ret;

}

2、pull操作

與push操作相反,pull操作用于當前cpu的rq比較空閑,想要主動調入實時任務,該操作主要由

pull_rt_task完成。static?int?pull_rt_task(struct?rq?*this_rq)

{

int?this_cpu?=?this_rq->cpu,?ret?=?0,?cpu;

struct?task_struct?*p;

struct?rq?*src_rq;

if?(likely(!rt_overloaded(this_rq)))

return?0;

///查找每一個超載的cpu

for_each_cpu(cpu,?this_rq->rd->rto_mask)?{

......

///src_rq:需要pull的cpu。

src_rq?=?cpu_rq(cpu);

///如果src_rq的下一個任務的優先級高于當前cpu的優先級,則什么都不用做,因為src_cpu會主動執行pull操作。

if?(src_rq->rt.highest_prio.next?>=

this_rq->rt.highest_prio.curr)

continue;

double_lock_balance(this_rq,?src_rq);

///判斷是否有需要被pull的任務,沒有則退出

if?(src_rq->rt.rt_nr_running?<=?1)

goto?skip;

///找到src_rq上最高優先級的任務

p?=?pick_next_highest_task_rt(src_rq,?this_cpu);

if?(p?&&?(p->prio?rt.highest_prio.curr))?{

WARN_ON(p?==?src_rq->curr);

WARN_ON(!p->on_rq);

if?(p->prio?curr->prio)

goto?skip;

ret?=?1;

deactivate_task(src_rq,?p,?0);

set_task_cpu(p,?this_cpu);

activate_task(this_rq,?p,?0);

}

skip:

double_unlock_balance(this_rq,?src_rq);

}

return?ret;

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530249.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux源碼文件名,Linux中文件名解析處理源碼分析

Linux中文件名解析處理源碼分析前言Linux中對一個文件進行操作的時候&#xff0c;一件很重要的事情是對文件名進行解析處理&#xff0c;并且找到對應文件的inode對象&#xff0c;然后創建表示文件的file對象。在此&#xff0c;對文件名解析過程&#xff0c;并且如何找到對應ino…

帝國cms linux偽靜態規則,帝國cms7.2偽靜態規則怎么寫

一、在linux主機下實現偽靜態確認虛擬主機是否支持rewrite偽靜態.htaccess文件。添加.htaccess 文件&#xff0c;把htaccess 文件放在網站根目錄。二、在win主機下實現偽靜態確認虛擬主機是否支持rewrite偽靜態httpd.ini文件。添加httpd.ini文件&#xff0c;把httpd.ini文件放入…

linux core 永久生效,【調試】Core Dump是什么?Linux下如何正確永久開啟?

內容簡介【調試】Core Dump是什么&#xff1f;Linux下如何正確永久開啟&#xff1f;Core Dump是什么&#xff1f;Linux下如何正確永久開啟&#xff1f;Core Dump是什么&#xff1f;Core Dump乍聽之下很抽象。當程序運行的過程中異常終止或崩潰&#xff0c;操作系統會將程序當時…

linux故障排查書籍,Linux系統故障排查和修復技巧.docx

fsck -y /cievZhdab(fsck為文件系統檢測修復命令&#xff0c;“-y”設定檢測到錯誤自動修復&#xff0c;Zdev/hda6 為發生錯誤的硬盤分區&#xff0c;請依據具體情況更改此參數) 系統修復完成后&#xff0c;用命令“reboot&#xff0c;重新啟動即可? 案例三、GRUB選項設置錯誤…

用于用戶C語言標識符,下列可用于C語言用戶標識符的一組是( )

摘要&#xff1a;下列不屬于骨肉瘤患者常見護理問題()于C語言用戶組Since people send nonverbal signals through multiple channels simultaneously, it is impossible to increase our nonverbal communication competence by becoming more aware of how it operates in sp…

c語言編程常見問題解答,C語言編程常見問題解答之常用函數的包含文件

函數 包含 類別 功能_atold math.h 數學子程序 把字符串轉換為浮點數_beginthread process.h 進程控制子程序 啟動執行一個新線程_bios_disk bios.h 接口子程序 輸出BIOS磁…

c語言猜四位數游戲猜10次,C語言猜數字游戲--隨機生成4個不相同的數字從小到大排序,用戶開始游戲,如果用戶猜對數字和數字對應的位置,界面回饋A,如果數字正確位置不正確,則回饋B...

1.看程序運行截圖吧&#xff01;&#xff01;由于博主本人較笨&#xff0c;就不動畫演示了&#xff0c;如果動畫的話可能將是一個漫長的過程&#xff01;猜數字游戲.png2.游戲題目隨機生成4個不相同的數字從小到大排序&#xff0c;用戶開始游戲&#xff0c;如果用戶猜對數字和數…

雙端堆c語言,數據結構——雙端堆(C語言)

定義雙端堆&#xff1a;是一棵完全二叉樹&#xff0c;該完全二叉樹要么為空&#xff0c;要么同時滿足下列性質&#xff1a;(1) 根節點不包含元素&#xff1b;(2) 左子樹是一個最小堆&#xff1b;(3) 右子樹是一個最大堆&#xff1b;(4) 如果右子樹不空&#xff0c;令i是左子樹中…

C語言和我的世界指令哪個難,我的世界難度有什么區別 難度選擇指令介紹

我的世界中的難度(Difficulty)可以在Minecraft的選項菜單內切換。更改這個選項將直接影響到游戲本身。選項中并沒有設定影響攻擊性生物的可生成數量&#xff0c;包括和平模式。目前游戲共有和平、簡單、普通和困難4種難度。我的世界難度區別和平&#xff1a;會生成攻擊性生物&a…

w ndows10即將停止更新,微軟開始警告Windows 10 v1909用戶即將停止更新服務

如果您仍在運行Windows 10版本1909&#xff0c;版本1903或更早版本&#xff0c;則可能已經在系統任務欄中注意到一條新消息&#xff1a;Windows 10版本即將終止服務。根據Windows 10 May 2020 Update或2020年10月Update。為了將用戶升級到最新版本的Windows 10&#xff0c;“您…

篩法求素數c 語言,位篩法求素數,有段代碼看不懂,有大佬可以來說一下

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓就是BITArray[ (i -3)/ CHAR_BIT ]其中i從0開始&#xff0c;那下標不就為負了&#xff1f;而指向的又是哪個數據&#xff1f;下面是完整代碼。#include #include #include #include #include #include#include int main( ){unsigne…

c語言中日期間的天數怎么計算,關于計算兩個日期間天數的代碼,大家來看看...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓這是原貼:http://post.baidu.com/f?kz100411727這是原碼:#include "stdio.h"main(){long int i,a[2],b[2],c[2],x[12]{0,31,59,90,120,151,181,212,243,273,304,334},y,z[2];scanf("%ld-%ld-%ld %ld-%ld-%ld"…

linux nf conntrack,Linux基于mark的策略路由以及nf_conntrack RELATED

談到什么是意義&#xff0c;話題總顯得很大&#xff0c;近日每晚都和老城里的朋友聊老城的文化&#xff0c;老城的老房子&#xff0c;老城的叫賣聲&#xff0c;老城的方言…進行了很多的思考&#xff0c;也挺充實。至于技術方面&#xff0c;也有跟朋友以及前同事聊過&#xff0…

android 根據資源名稱,如何在Android中按名稱訪問可繪制資源

你可以做這樣的事情。public static Drawable getDrawable(String name) {Context context YourApplication.getContext();int resourceId context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName());return contex…

Android10不能用谷歌,谷歌真的很嚴格,一大波老APP將不能在安卓10.0運行

蘋果iOS的一大優點就是軟件生態&#xff0c;第三方APP都會主動適配新的iOS系統以及手機。雖然說Android的開放性是也是一大優點&#xff0c;但是第三方軟件參差不齊的優化適配水平也讓安卓的用戶非常頭疼。不過谷歌每年都在致力于讓Android的軟件生態更好。根據XDA的報道&#…

android 回歸測試,android測試:monkey使用方法

android測試&#xff1a;monkey使用方法Android Sdk給我們提供了Monkey和Monkeyrunner這兩個自動化測試工具。一、什么是MonkeyMonkey是一個命令行工具&#xff0c;可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流&#xff0c;實現對正在開發的應用程序進行壓…

c語言編程季節輸出春夏秋冬,c語言編程題:?用枚類型定義春、夏、秋、冬四個季節...

滿意答案bcabcdefg2013.07.28采納率&#xff1a;49% 等級&#xff1a;12已幫助&#xff1a;5373人#includeenum season{spring 1,summer,autumn,winter,};season GetSeasonByMonth(char month){if(month < 3 && month>1)return spring;else if(month < 6 …

android fragment addtobackstack,Android Fragment Back Stack的問題

我對android片段Backstack的工作方式遇到了一個很大的問題&#xff0c;對于提供的任何幫助將不勝感激。假設您有3個片段[1] [2] [3]我希望用戶能夠導航[1] > [2] > [3]但在返回的途中(按返回按鈕)[3] > [1]。就像我想象的那樣&#xff0c;這可以通過addToBackStack(..…

華為升級harmonyos的機型名單,華為鴻蒙 OS 2.0 系統適配名單已出,四月推送,天璣機型暫時無緣...

原標題&#xff1a;華為鴻蒙 OS 2.0 系統適配名單已出&#xff0c;四月推送&#xff0c;天璣機型暫時無緣華為官方在 2020 年發布了旗下自研系統“HarmonyOS 2.0”版本&#xff0c;發布會現場展示了 HarmonyOS 2.0 開發者 Beta 版本&#xff0c;并開啟開發者 Beta 的公測。此外…

android如何實現QQ信息通知,android NotificationListenerService監聽通知欄(qq 微信 短信)...

【實例簡介】android NotificationListenerService 監聽通知欄&#xff0c;android NotificationListenerService 監聽通知欄 android NotificationListenerService 監聽通知欄【實例截圖】【核心代碼】NLsevice└── NLsevice├── AndroidManifest.xml├── bin│ ├──…