当前位置: 首页 > news >正文

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 实时优先级 )

相关文章:

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 中&#xff0c;可以使用 kthread_create 接口创建内核…...

第一节 网络安全概述

一.网络空间安全 网络空间&#xff1a;一个由信息基础设施组成相互依赖的网络。 ---- 海陆空天&#xff08;大海、陆 地、天空、航天&#xff09; 通信保密阶段 ---- 计算机安全 ----- 信息系统安全 ----- 网络空间安全 计算机安全&#xff1a;开始秉持着“严于律己&#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 标准库异常类&#xff08;std::exception&#xff09;系列&#xff0c;能满足大多数使用异常的场景&#xff0c;但对…...

从一次 SQL 查询的全过程了解 DolphinDB 线程模型

1. 前言 DolphinDB 的线程模型较为复杂&#xff0c;写入与查询分布式表都可能需要多个类型的线程。通过了解 SQL 查询的全过程&#xff0c;可以帮助我们了解 DolphinDB 的线程模型&#xff0c;掌握 DolpinDB 的配置&#xff0c;以及优化系统性能的方法。 本教程以一个分布式 …...

Vue3.js“非原始值”响应式实现基本原理笔记(二)

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…...

论文 | PRCA: 通过可插拔奖励驱动的上下文适配器拟合用于检索问答的黑盒大语言模型

论文全称&#xff1a;PRCA: Fitting Black-Box Large Language Models for Retrieval Question Answering via Pluggable Reward-Driven Contextual Adapter 核心问题&#xff1a;如何在检索增强式问答&#xff08;ReQA&#xff09;任务中&#xff0c;利用大型语言模型&#xf…...

网络状态的智能感知:WebKit 支持 Network Information API 深度解析

网络状态的智能感知&#xff1a;WebKit 支持 Network Information API 深度解析 在现代 Web 应用中&#xff0c;理解用户的网络连接状态对于提供适应性体验至关重要。Network Information API&#xff0c;一个新兴的 Web API&#xff0c;允许 Web 应用访问设备的网络信息&…...

Vue3基础知识:组合式API中的provide和inject,他们作用是什么?如何使用?以及案例演示

1.provide和inject相较于父子传递的不同在于provide,inject可以用于跨层级通信&#xff08;通俗易懂的讲就是可以实现爷孙之间的直接信息传递&#xff09;。 1.跨层级传递数据 1.在顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 演示一&#xff1a;跨…...

Transformer自注意力机制(Self-Attention)模型

​ 上一篇我们介绍了transform专题一&#xff1a;Seq2seq model&#xff0c;也知道了transfrom属于seq2seq模型&#xff0c;这一排篇咱们接着介绍另外几种seq2seq架构的模型。&#xff09;RNN&#xff08;循环神经网络&#xff09;CNN&#xff08;卷积神经网络&#xff09;&…...

【计算机体系结构】缓存的false sharing

在介绍缓存的false sharing之前&#xff0c;本文先介绍一下多核系统中缓存一致性是如何维护的。 目前主流的多核系统中的缓存一致性协议是MESI协议及其衍生协议。 MESI协议 MESI协议的4种状态 MESI协议有4种状态。MESI是4种状态的首字母缩写&#xff0c;缓存行的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 # 创建虚拟环境&#xff0c;已有可跳过…...

docker 设置代理,通过代理服务器拉取镜像

docker 拉取目标镜像需要通过代理服务器进行时&#xff0c;可以通过为 docker 配置全局代理来实现。 注&#xff1a;Linux 上通过临时命令 export HTTP_PROXY 设置的代理&#xff0c;对 curl 这些有用&#xff0c;但是对 docker pull 不起作用。 示例 假设您的代理服务器地址是…...

OpenCV教程02:图像处理系统1.0(翻转+形态学+滤波+缩放+旋转)

-------------OpenCV教程集合------------- Python教程99&#xff1a;一起来初识OpenCV&#xff08;一个跨平台的计算机视觉库&#xff09; OpenCV教程01&#xff1a;图像的操作&#xff08;读取显示保存属性获取和修改像素值&#xff09; OpenCV教程02&#xff1a;图像处理…...

人工智能在招投标领域的运用---监控视频连续性检测

作者&#xff1a;舒城县公共交易中心 zhu_min726126.com 原创&#xff0c;转载请注明出处。 摘要 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在各个领域的应用日益广泛。本文旨在探讨人工智能在招投标领域的运营&#xff0c;重点介绍AI对视频完整…...

加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽

在当前高度智能化的社会背景下&#xff0c;智能手机早已成为人们生活、工作的必备品&#xff0c;智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节&#xff0c;包括钻孔和铣槽等。钻孔要求精度高、孔位准确&#xff0c;而铣槽则需要保证槽位规整、深度适宜。这些…...

Java Stream API 常用操作技巧

Java 8 引入的 Stream API 为集合操作提供了一种声明式编程模型&#xff0c;极大地简化了数据处理的复杂性。本文将介绍 Java Stream API 的几种常用操作方式&#xff0c;帮助开发者更高效地处理集合数据。 1. 过滤&#xff08;Filtering&#xff09; 过滤是选择集合中满足特…...

SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…...

Android 系统网络、时间服务器配置修改

1.修改wifi 是否可用的检测地址&#xff1a; 由于编译的源码用的是谷歌的检测url,国内访问不了&#xff0c;系统会认为wifi网络受限&#xff0c;所以改成国内的地址 adb shell settings delete global captive_portal_https_urladb shell settings delete global captive_por…...

类和对象深入理解

目录 static成员概念静态成员变量面试题补充代码1代码2代码3如何访问private中的成员变量 静态成员函数静态成员函数没有this指针 特性 友元友元函数友元类 内部类特性1特性2 匿名对象拷贝对象时的一些编译器优化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接…...

4个高效步骤实现HMCL启动器数据无忧迁移全攻略

4个高效步骤实现HMCL启动器数据无忧迁移全攻略 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL 当你终于升级了新电脑&#xff0c;兴冲冲地安装好HMCL启动器准备…...

告别Transformer!用TimeKAN在ETTh1数据集上实现SOTA级长时序预测(附PyTorch复现指南)

TimeKAN&#xff1a;用频率分解与轻量架构重塑长时序预测的PyTorch实践指南 时序预测领域正在经历一场静悄悄的革命——当Transformer模型因计算复杂度陷入瓶颈时&#xff0c;一种融合频率分解思想与新型网络架构的解决方案正在ETTh1等基准数据集上刷新纪录。本文将带您深入Tim…...

HunyuanVideo-Foley使用技巧:如何用文字描述控制生成音效风格

HunyuanVideo-Foley使用技巧&#xff1a;如何用文字描述控制生成音效风格 1. 引言&#xff1a;文字描述如何影响音效生成 想象一下&#xff0c;你拍摄了一段海滩视频&#xff0c;但缺少合适的音效。传统方法需要手动寻找和编辑各种声音素材&#xff0c;耗时又费力。而Hunyuan…...

如何利用社交媒体平台来优化网站SEO

如何利用社交媒体平台来优化网站SEO 在当今的数字化时代&#xff0c;社交媒体已经成为每个企业和个人不可或缺的一部分。作为网站运营者&#xff0c;我们常常面临如何通过社交媒体平台来优化网站SEO&#xff08;搜索引擎优化&#xff09;的问题。本文将深入探讨这一话题&#…...

VideoAgentTrek-ScreenFilter智能体(Agent)实践:自主决策的视频内容净化流程

VideoAgentTrek-ScreenFilter智能体实践&#xff1a;自主决策的视频内容净化流程 最近在做一个视频内容平台的项目&#xff0c;团队最头疼的问题就是每天海量的UGC视频审核。人工审核不仅成本高、效率低&#xff0c;而且标准还容易不统一。后来我们尝试引入了一些AI内容识别工…...

网站SEO优化有哪些技巧

网站SEO优化有哪些技巧 在当前数字化时代&#xff0c;拥有一个高效的网站SEO优化策略至关重要。无论你是新手还是资深网站管理者&#xff0c;了解网站SEO优化的技巧都能帮助你在百度等搜索引擎上获得更高的排名&#xff0c;从而吸引更多的流量。本文将详细探讨网站SEO优化的一…...

Llama-3.2V-11B-cot参数详解:官方最优推理配置+冲突参数自动剔除机制说明

Llama-3.2V-11B-cot参数详解&#xff1a;官方最优推理配置冲突参数自动剔除机制说明 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具&#xff0c;专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新&#xff0c;解…...

放假给大家推荐一些孩子的资料,有了这些资源简直太好了!

&#x1f468;‍&#x1f469;‍&#x1f467;有娃家庭必收&#xff01;这批教育资源太香了数学思维 / 英语启蒙 / 亲子电影 / 绘画手工 / 睡前故事全部夸克网盘直取&#xff0c;保存即用阅读约 4 分钟 建议收藏备用家里有娃的&#xff0c;这批资源是真的用得上。 从英语…...

obsidian-skills培训管理:培训用户使用技能的方法

obsidian-skills培训管理&#xff1a;培训用户使用技能的方法 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Markdown, Bases, JSON Canvas, and use the CLI. 项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-skills …...

Java程序设计(第3版)第二章——变量的三种定义方式2和3

变量的第二种使用方式 在声明的同时并赋值 数据类型 变量名 &#xff1d; 数据; int b &#xff1d; 12; System.out.println(b); 输出为12变量的第三种使用方式 同时定义多个同类型变量 int c,d&#xff1d;1,e&#xff1d;11,f&#xff1d;23,g&#xff1d;32,h&#xff1d;0…...