linux kthread任務管理

目錄

  • 一、linux 創建內核線程
    • 1.1 kthread_create
    • 1.2 kthread_create_worker + kthread_queue_work
  • 二、設置線程優先級和調度策略
    • 2.1 sched_setscheduler
    • 2.2 調度策略

一、linux 創建內核線程

1.1 kthread_create

在 linux 中,可以使用 kthread_create 接口創建內核線程,該接口原型如下:

struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...);

入參含義:

- threadfn:線程函數的入口點。
- data:傳遞給線程函數的參數。
- namefmt:線程的名字,可以用格式化字符串指定。

示例代碼:

#include <linux/kthread.h>
#include <linux/delay.h>// 線程函數
int thread_function(void *data) {while (!kthread_should_stop()) {// 線程的主要工作pr_info("Thread is running\n");ssleep(5); // 休眠5秒}return 0;
}// 在合適的地方創建線程
struct task_struct *task;
task = kthread_create(thread_function, NULL, "my_thread");
if (!IS_ERR(task)) {wake_up_process(task); // 啟動線程
}

1.2 kthread_create_worker + kthread_queue_work

kthread_create_worker 主要用于創建一個用于管理工作隊列的工作線程。
函數原型:

struct kthread_worker *kthread_create_worker(unsigned int flags, const char namefmt[], ...);

入參含義:

- flags:創建worker時的標志。
- namefmt:worker的名稱。

kthread_queue_work 用于將一個工作項添加到由kthread_worker 管理的工作隊列中。
函數原型:

void kthread_queue_work(struct kthread_worker *worker, struct kthread_work *work);

入參含義:

-worker:目標worker。
-work:要執行的工作。

示例代碼:

#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/slab.h>static struct kthread_worker *worker;
static struct kthread_work work;void work_function(struct kthread_work *work) {pr_info("Work function is running\n");
}int __init my_module_init(void) {worker = kthread_create_worker(0, "my_worker");if (IS_ERR(worker)) {pr_err("Failed to create kthread worker\n");return PTR_ERR(worker);}// 初始化工作kthread_init_work(&work, work_function);// 將工作排隊kthread_queue_work(worker, &work);return 0;
}void __exit my_module_exit(void) {kthread_destroy_worker(worker);
}module_init(my_module_init);
module_exit(my_module_exit);

上述示例代碼中,

  • kthread_create_worker創建一個工作隊列kthread_worker
  • kthread_queue_work 將一個工作項 kthread_work 添加到工作隊列 kthread_worker;
  • 每調用一次 kthread_queue_work(worker, &work);,工作項 kthread_work 對應的執行函數 work_function 就會得到一次調用。

二、設置線程優先級和調度策略

2.1 sched_setscheduler

sched_setscheduler 接口是 linux 內核中,設置特定線程或進程優先級和調度策略的接口。函數原型:

int sched_setscheduler(struct task_struct *p, int policy, const struct sched_param *param);

入參說明

- p:指向目標任務(線程或進程)的 task_struct 結構體的指針。
- policy:調度策略。
- param:指向 sched_param 結構體的指針,包含了調度參數,如優先級。

kthread_create_worker + sched_setscheduler 創建線程并設置調度策略和優先級:

static int __init my_module_init(void) {struct sched_param param;int ret;// 創建內核線程工作隊列my_worker = kthread_create_worker(0, "my_worker");// 獲取內核線程的task_structmy_worker_thread = my_worker->task;// 設置調度策略和優先級param.sched_priority = MAX_RT_PRIO - 1;  // 設置為最高實時優先級ret = sched_setscheduler(my_worker_thread, SCHED_FIFO, &param);return 0;
}

kthread_create + sched_setscheduler 創建線程并設置調度策略和優先級:

// 線程函數
static int thread_function(void *data) {while (!kthread_should_stop()) {}return 0;
}static int __init my_module_init(void) {struct sched_param param;int ret;// 創建內核線程my_thread = kthread_create(thread_function, NULL, "my_thread");// 設置調度策略和優先級param.sched_priority = MAX_RT_PRIO - 1;  // 設置為最高實時優先級ret = sched_setscheduler(my_thread, SCHED_FIFO, &param);// 啟動內核線程wake_up_process(my_thread);return 0;
}

2.2 調度策略

  • SCHED_NORMAL:普通調度策略,也稱為 SCHED_OTHER。Linux 默認的普通任務調度策略,基于時間片輪轉調度算法,適用于大多數用戶進程和內核線程。

  • SCHED_FIFO:先進先出調度策略。使用該策略時,系統優先調用高優先級的任務,想通優先級的任務按照先到先服務的順序執行,只有在隊列中所有優先級最高的任務都執行完或者放棄 CPU 后,才會執行其他任務。優先級使用 sched_param 結構中的 sched_priority 成員設置,值越小優先級越高(0 最高)。

  • SCHED_RR:循環調度策略。優先高優先級任務+相同優先級先進先出+每個任務時間片輪轉,類似于 SCHED_FIFO,但每個任務有一個時間片,如果任務在該時間片內沒有運行完畢,會將任務移到隊列末尾等待下一輪調度。也可以通過 sched_param 結構的 sched_priority 設置優先級。

  • SCHED_BATCH:用于低優先級任務的批處理。用于大量計算密集型任務,通常在系統負載較低時,調度器會執行 SCHED_BATCH 線程。

  • SCHED_IDLE:專為低優先級的后臺任務設計。只有在沒有其他更重要的任務需要執行時,才會考慮執行 SCHED_IDLE 線程。

  • SCHED_DEADLINE:允許任務在預定的截止時間內完成執行,以滿足實時系統對任務響應時間的嚴格要求。deadline 調度策略為每個任務分配固定的 CPU 時間片(Budget),并指定每個周期內允許執行的最大時間量(Period)。

參考:
SCHED_FIFO與SCHED_OTHER調度機制

【Linux 內核】進程管理 - 進程優先級 ② ( prio 調度優先級 | static_prio 靜態優先級 | normal_prio 正常優先級 | rt_priority 實時優先級 )

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

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

相關文章

移動校園(7)ii:uniapp路由響應攔截器處理token,以及微信小程序報錯當前頁面正在處于跳轉狀態,請稍后再進行跳轉....

依據昨天的寫完&#xff0c;在token過期之后&#xff0c;再次調用接口&#xff0c;會觸發后端攔截&#xff0c;扔進全局錯誤處理中間件 前端說明提示都沒有&#xff0c;只有一個這個&#xff0c;現在優化一下&#xff0c;再寫一個類似全局后置守衛&#xff0c;當狀態碼是401的時…

MySQL——數據連接池

數據庫連接 --- 執行完畢 --- 釋放&#xff08;連接到釋放的過程十分浪費系統資源&#xff09; 池化技術&#xff1a;準備一些預先的資源&#xff0c;過來就連接預先準備好的 編寫連接池&#xff0c;實現一個接口 DataSource 開源數據源實現&#xff08;拿來即用&#xff09;…

增強安全防護,解讀智慧校園系統的登錄日志功能

在構建智慧校園系統時&#xff0c;登錄日志功能扮演著不可或缺的角色&#xff0c;它不僅是系統安全的守護者&#xff0c;也是提升管理效率和確保合規性的有力工具。這一機制詳細記錄每次登錄嘗試的方方面面&#xff0c;涵蓋了時間戳、用戶身份、登錄來源的IP地址乃至使用的設備…

phpcms 升級php8.3.8

windows 2008 server 不支持php8.3.8,需升級為windows 2012 1.下載php8.3.8 PHP8.3.9 For Windows: Binaries and sources Releases 2.配置php.ini (1.)在php目錄下找到php.ini-development文件&#xff0c;把它復制一份&#xff0c;改名為php.ini (2.)修改php安裝目錄 根…

《昇思 25 天學習打卡營第 10 天 | ResNet50 遷移學習 》

《昇思 25 天學習打卡營第 10 天 | ResNet50 遷移學習 》 活動地址&#xff1a;https://xihe.mindspore.cn/events/mindspore-training-camp 簽名&#xff1a;Sam9029 使用遷移學習進行狼狗圖像分類 簡介 在機器學習和深度學習中&#xff0c;我們經常面臨數據不足的問題。 遷…

python【文件操作】

文件操作 一、創建文件夾二、文件操作模式1.覆蓋寫入2.讀取3.追加 三、 Python腳本在文件中查找和替換文本四、 python清空文件夾 一、創建文件夾 判斷文件或者文件夾是否存在 import ospathrD://測試文件夾 if not os.path.exists(path):os.mkdir(path)print(os.path.exists…

C++模板元編程(二)——完美轉發

完美轉發指的是函數模板可以將自己的參數“完美”地轉發給內部調用的其它函數。所謂完美&#xff0c;即不僅能準確地轉發參數的值&#xff0c;還能保證被轉發參數的左、右值屬性不變。 文章目錄 場景舊的方法新的方法內部實現參考文獻 場景 思考下面的代碼&#xff1a; templ…

高防服務器的重要性

在數字化時代&#xff0c;網絡安全已成為企業和個人最為關注的問題之一。隨著網絡攻擊的日益頻繁和復雜&#xff0c;傳統的服務器租用服務已難以滿足高安全需求的市場。高防服務器租用應運而生&#xff0c;成為保護網絡安全的重要解決方案。本文將探討高防服務器租用的概念、重…

專業140+總分420+天津大學815信號與系統考研經驗天大電子信息與通信工程,真題,大綱,參考書。

順利上岸天津大學&#xff0c;專業課815信號與系統140&#xff0c;總分420&#xff0c;總結一些自己的復習經歷&#xff0c;希望對于報考天大的同學有些許幫助&#xff0c;少走彎路&#xff0c;順利上岸。專業課&#xff1a; 815信號與系統&#xff1a;指定教材吳大正&#xf…

2-26 基于matlab開發的制冷循環模型

基于matlab開發的制冷循環模型。Simscape兩相流域中的制冷循環模型&#xff0c;在simulink中完成多循環溫度控制。程序已調通&#xff0c;可直接運行。 2-26 制冷循環模型 Simscape兩相流域 - 小紅書 (xiaohongshu.com)

Arduino ESP8266 開發環境搭建

Arduino ESP8266 開發環境搭建 很久之前學嵌入式時&#xff0c;用過Arduino8266進行開發&#xff0c;開發成本低、難度小&#xff0c;體驗很不錯。 近期&#xff0c;又突然要用&#xff0c;遂再次搭建環境&#xff0c;但變動挺多&#xff0c;有些小波折&#xff0c;開貼記錄。…

生成式AI應用實列和價值鏈

生成式AI應用實列和價值鏈 生成式AI應用實列ChatGPTGeminiGitHub CopilotSynthesia 價值鏈 生成式AI應用實列 ChatGPT ChatGPT 并不是生成式 AI 行業中唯一的公司。 Stability AI 的 Stable Diffusion 可以根據文本描述生成圖像&#xff0c;發布后 90 天內&#xff0c;在 Git…

vue是如何進行監聽數據變化的?vue2和vue3分別是什么,vue3為什么要更換

在 Vue 中&#xff0c;數據變化的監聽是通過響應式系統來實現的。Vue 2.x 和 Vue 3 在這方面有一些區別。 Vue 2.x 的數據監聽 Vue 2.x 使用的是 Object.defineProperty() 方法來實現數據的響應式。當你聲明一個 Vue 實例的數據對象時&#xff0c;Vue 將遍歷這個對象的屬性&a…

清除屏幕上信息的命令clear

清除屏幕上信息的命令clear There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should leave quickly. 清…

高考志愿填報千萬要注意這四點

在高考志愿填報過程中&#xff0c;確實有很多需要留心的點。我為你總結了四個關鍵點&#xff0c;希望能幫助你順利完成志愿填報&#xff1a; 1、學校提供的支持 學校作為學生志愿填報咨詢服務的主陣地&#xff0c;應提供體系化和制度化的支持。包括及時關注并傳達政策動向和相…

行內元素、塊級元素居中

行內元素居中 水平居中 {text-align&#xff1a;center;}垂直居中 單行——行高等于盒子高度 <head><style>.father {width: 400px;height: 200px;/* 行高等于盒子高度&#xff1a;line-height: 200px; */line-height: 200px;background-color: pink;}.son {}&…

如何做好IT類的技術面試?

我們在找工作時&#xff0c;需要結合自己的現狀&#xff0c;針對意向企業做好充分準備。作為程序員&#xff0c;你有哪些面試IT技術崗的技巧&#xff1f; 方向一&#xff1a;分享你面試IT公司的小技巧 我分享一些基于廣泛觀察和用戶反饋的面試IT公司的小技巧&#xff1a; 技術準…

孟德爾隨機化-痛風

寫在前面 昨天看到文獻&#xff0c;稱飲酒與痛風無關聯&#xff0c;甚是疑惑&#xff0c;今天剛好看了一篇新文獻&#xff0c;雖然不是主要講飲酒與痛風的&#xff0c;但也有牽扯到這方面內容&#xff0c;而且是相反的內容&#xff0c;特記錄一下。 孟德爾隨機化-受教育程度與…

vuepress創建步驟

背景 記錄vuepress配置步驟&#xff0c;以便下次使用快速上手。 讀此文章之前默認您已經學會了創建vuepress項目。vuepres快速開始 最終成品 doc.jeecgflow.com 配置步驟 創建.vuepress 目錄。 你的文檔目錄下創建一個 .vuepress 目錄。 創建.vuepress/config.js module.e…

mysql面試題 Day4

1 什么是覆蓋索引&#xff1f;對要查詢的列 和 查詢條件中的列 有什么要求 覆蓋索引&#xff08;Covering Index&#xff09;是指一個索引包含了一次查詢所需的全部列&#xff0c;因此可以完全滿足查詢需求&#xff0c;而無需訪問實際的表行數據。&#xff08;即避免回表操作&…