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, ¶m);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, ¶m);// 启动内核线程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 实时优先级 )
相关文章:
linux kthread任务管理
目录 一、linux 创建内核线程1.1 kthread_create1.2 kthread_create_worker kthread_queue_work 二、设置线程优先级和调度策略2.1 sched_setscheduler2.2 调度策略 一、linux 创建内核线程 1.1 kthread_create 在 linux 中,可以使用 kthread_create 接口创建内核…...
 
第一节 网络安全概述
一.网络空间安全 网络空间:一个由信息基础设施组成相互依赖的网络。 ---- 海陆空天(大海、陆 地、天空、航天) 通信保密阶段 ---- 计算机安全 ----- 信息系统安全 ----- 网络空间安全 计算机安全:开始秉持着“严于律己&#x…...
 
星光云VR全景系统源码
星光云VR全景系统源码 体验地址请查看...
spdlog一个非常好用的C++日志库(七): 源码分析之异常类spdlog_ex
目录 1.自定义异常类spdlog_ex 1.1.通用异常 1.2.系统调用异常 1.3.what()函数 2.异常的使用 2.1.抛出异常 2.2.控制异常使用 1.自定义异常类spdlog_ex 标准库异常类(std::exception)系列,能满足大多数使用异常的场景,但对…...
 
从一次 SQL 查询的全过程了解 DolphinDB 线程模型
1. 前言 DolphinDB 的线程模型较为复杂,写入与查询分布式表都可能需要多个类型的线程。通过了解 SQL 查询的全过程,可以帮助我们了解 DolphinDB 的线程模型,掌握 DolpinDB 的配置,以及优化系统性能的方法。 本教程以一个分布式 …...
 
Vue3.js“非原始值”响应式实现基本原理笔记(二)
如果您觉得这篇文章有帮助的话!给个点赞和评论支持下吧,感谢~ 作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…...
 
论文 | PRCA: 通过可插拔奖励驱动的上下文适配器拟合用于检索问答的黑盒大语言模型
论文全称:PRCA: Fitting Black-Box Large Language Models for Retrieval Question Answering via Pluggable Reward-Driven Contextual Adapter 核心问题:如何在检索增强式问答(ReQA)任务中,利用大型语言模型…...
网络状态的智能感知:WebKit 支持 Network Information API 深度解析
网络状态的智能感知:WebKit 支持 Network Information API 深度解析 在现代 Web 应用中,理解用户的网络连接状态对于提供适应性体验至关重要。Network Information API,一个新兴的 Web API,允许 Web 应用访问设备的网络信息&…...
 
Vue3基础知识:组合式API中的provide和inject,他们作用是什么?如何使用?以及案例演示
1.provide和inject相较于父子传递的不同在于provide,inject可以用于跨层级通信(通俗易懂的讲就是可以实现爷孙之间的直接信息传递)。 1.跨层级传递数据 1.在顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 演示一:跨…...
Transformer自注意力机制(Self-Attention)模型
 上一篇我们介绍了transform专题一:Seq2seq model,也知道了transfrom属于seq2seq模型,这一排篇咱们接着介绍另外几种seq2seq架构的模型。)RNN(循环神经网络)CNN(卷积神经网络)&…...
 
【计算机体系结构】缓存的false sharing
在介绍缓存的false sharing之前,本文先介绍一下多核系统中缓存一致性是如何维护的。 目前主流的多核系统中的缓存一致性协议是MESI协议及其衍生协议。 MESI协议 MESI协议的4种状态 MESI协议有4种状态。MESI是4种状态的首字母缩写,缓存行的4种状态分别…...
 
Ubuntu24.04 Isaacgym的安装
官方论坛 rl-接口 教程1 教程2 教程3 1.下载压缩包 link 2. 解压 tar -xvf IsaacGym_Preview_4_Package.tar.gz核心教程在 isaacgym/docs/install.html下 3. 从源码安装 Ubuntu24.04还需首先进入虚拟环境 python -m venv myenv # 创建虚拟环境,已有可跳过…...
docker 设置代理,通过代理服务器拉取镜像
docker 拉取目标镜像需要通过代理服务器进行时,可以通过为 docker 配置全局代理来实现。 注:Linux 上通过临时命令 export HTTP_PROXY 设置的代理,对 curl 这些有用,但是对 docker pull 不起作用。 示例 假设您的代理服务器地址是…...
 
OpenCV教程02:图像处理系统1.0(翻转+形态学+滤波+缩放+旋转)
-------------OpenCV教程集合------------- Python教程99:一起来初识OpenCV(一个跨平台的计算机视觉库) OpenCV教程01:图像的操作(读取显示保存属性获取和修改像素值) OpenCV教程02:图像处理…...
人工智能在招投标领域的运用---监控视频连续性检测
作者:舒城县公共交易中心 zhu_min726126.com 原创,转载请注明出处。 摘要 随着人工智能(AI)技术的飞速发展,其在各个领域的应用日益广泛。本文旨在探讨人工智能在招投标领域的运营,重点介绍AI对视频完整…...
 
加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽
在当前高度智能化的社会背景下,智能手机早已成为人们生活、工作的必备品,智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节,包括钻孔和铣槽等。钻孔要求精度高、孔位准确,而铣槽则需要保证槽位规整、深度适宜。这些…...
Java Stream API 常用操作技巧
Java 8 引入的 Stream API 为集合操作提供了一种声明式编程模型,极大地简化了数据处理的复杂性。本文将介绍 Java Stream API 的几种常用操作方式,帮助开发者更高效地处理集合数据。 1. 过滤(Filtering) 过滤是选择集合中满足特…...
 
SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决
概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…...
Android 系统网络、时间服务器配置修改
1.修改wifi 是否可用的检测地址: 由于编译的源码用的是谷歌的检测url,国内访问不了,系统会认为wifi网络受限,所以改成国内的地址 adb shell settings delete global captive_portal_https_urladb shell settings delete global captive_por…...
 
类和对象深入理解
目录 static成员概念静态成员变量面试题补充代码1代码2代码3如何访问private中的成员变量 静态成员函数静态成员函数没有this指针 特性 友元友元函数友元类 内部类特性1特性2 匿名对象拷贝对象时的一些编译器优化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
 
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
 
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
 
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
 
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
 
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
