linux kthread任务管理

news2024/10/6 2:46:25

目录

  • 一、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_struct
    my_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.coloradmin.cn/o/1903919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python遥感开发之批量对TIF数据合并

Python遥感开发之批量对TIF数据合并 1 原始数据展示2 按照年份合成春夏秋冬季节数据3 完整代码实现 前言&#xff1a;通常对遥感数据按照月和年或者季节进行分析&#xff0c;我们需要对我们下载的8天或者16天数据按照需求进行合并&#xff0c;对数据的合并一般可以采取均值法、…

移动校园(5):课程表数据获取及展示

首先写下静态页面&#xff0c;起初打算做成一周的课表&#xff0c;由于是以小程序的形式展现&#xff0c;所以显示一周的话会很拥挤&#xff0c;所以放弃下面的方案&#xff0c;改作一次显示一天 改后结果如下&#xff0c;后期还会进行外观优化 真正困难的部分是数据获取 大家大…

高德地图 key 和安全密钥使用

参考高德地图&#xff1a;JS API 安全密钥使用 高德地图 key 和安全密钥使用 一、通过明文方式设置参数查看如下成功后返回的信息 二、通过代理服务器转发实验&#xff1a;通过本地地址转发返回错的错误信息&#xff0c;如下通过正确的项目的的服务地址&#xff0c;返回正常参数…

Flink,spark对比

三&#xff1a;az 如何调度Spark、Flink&#xff0c;MR 任务 首先&#xff0c;使用java编写一个spark任务&#xff0c;定义一个类&#xff0c;它有main方法&#xff0c;里面写好逻辑&#xff0c;sparkConf 和JavaSparkContext 获取上下文&#xff0c;然后打成一个jar包&#xf…

深度学习之网络构建

目标 选择合适的神经网络 卷积神经网络&#xff08;CNN&#xff09;&#xff1a;我们处理图片、视频一般选择CNN 循环神经网络&#xff08;RNN&#xff09;&#xff1a;我们处理时序数据一般选择RNN 超参数的设置 为什么训练的模型的错误率居高不下 如何调测出最优的超参数 …

Node.js介绍 , 安装与使用

1.Node.js 1 什么是Node.js 官网&#xff1a;https://nodejs.org/zh-cn/ 中文学习网&#xff1a;http://nodejs.cn/learn1.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 2.前端的底层 html…

C++、QT企业管理系统

目录 一、项目介绍 二、项目展示 三、源码获取 一、项目介绍 人事端&#xff1a; 1、【产品中心】产品案列、新闻动态的发布&#xff1b; 2、【员工管理】新增、修改、删除、搜索功能&#xff1b;合同以图片的方式上传 3、【考勤总览】根据日期显示所有员工上班、下班时间…

下载nvm 管理多个node版本并切换

nvm管理多个node版本并切换 安装nvm时不能安装任何node版本&#xff08;先删除node再安装nvm&#xff09;&#xff0c;保证系统无任何node.js残留 1. 卸载node 控制面板中卸载nodejs 删除以下文件夹&#xff1a; C:\Program Files (x86)\Nodejs C:\Program Files\Nodejs C…

聚类分析方法(一)

目录 一、聚类分析原理&#xff08;一&#xff09;聚类分析概述&#xff08;二&#xff09;聚类的数学定义&#xff08;三&#xff09;簇的常见类型&#xff08;四&#xff09;聚类框架及性能要求&#xff08;五&#xff09;簇的距离 二、划分聚类算法&#xff08;一&#xff0…

【matlab】状态空间模型与传递函数模型的建立与转换

目录 SISO系统 MIMO系统 状态空间模型 状态空间模型到传递函数模型的转换 传递函数模型到状态空间模型的转换 (1) 转换函数ss() (2) 规范形转换函数canon() (3) 常微分方程(传递函数)转换为状态空间模型函数dif2ss() 状态空间模型的变换 特征值、特征向量与广义特征向量的计算…

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用&#xff1a; 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态&#xff08;退出原因&#xff09; pid_t wait(int *wstatus); 返回值&#xff1a; ‐1 : 回收失败&#xff0c;已经没有子进程了 >0 : 回收子进程对应的…

线上问题---反思与回顾

线上问题一&#xff1a;麦哲伦2.0 人群配置不生效 发现背景&#xff1a;产品发现三层模型部分计划个别测试计划圈选人群特征与数仓统计数据的人群不一致&#xff0c;向值班人员反馈 根因定位&#xff1a; &#xff08;1&#xff09;用户配置三层模型计划时&#xff0c;配置单…

文心一言 VS 讯飞星火 VS chatgpt (297)-- 算法导论22.1 1题

一、给定有向图的邻接链表&#xff0c;需要多长时间才能计算出每个结点的出度(发出的边的条数)&#xff1f;多长时间才能计算出每个结点的入度(进入的边的条数)&#xff1f;如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 计算出度 对于有向图的邻接链表表示&a…

rufus-4.5 制作 Clonezilla(再生龙)启动盘报syslinux-6.04下载错误

1、官网下载rufus 官网下载rufus-4.5&#xff0c;下载地址&#xff1a;https://rufus.ie/downloads/ 2、下载再生龙&#xff08;Clonezilla&#xff09; 下载最新版本&#xff1a; Clonezilla live 版本: 3.1.2-22&#xff1a;https://sourceforge.net/projects/clonezill…

在 Docker 容器中运行 Vite 开发环境,有这两个问题要注意

容器化开发给我们带来了很多便捷&#xff0c;但是在开发环境下也有一些问题要注意&#xff0c;如果不解决这些问题&#xff0c;你的开发体验不会很好。 容器启动正常&#xff0c;却无法访问 我们用 Docker 启动一个 Vite Vue3 项目的开发环境后&#xff0c;发现端口日志一切…

Springboot使用WebSocket发送消息

1. 创建springboot项目&#xff0c;引入spring-boot-starter-websocket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>完整项目依赖 <?xml ver…

【游戏客户端】大话版本slg玩法正式上线~~

【游戏客户端】制作率土之滨Like玩法 大家好&#xff0c;我是Lampard家杰~~ 好久好久没有更新博客了&#xff0c;有不少大佬都在后台私信我催更&#xff0c;但是很悲伤这段时间都忙的不行QAQ 那在忙什么呢&#xff1f;就是在制作一个SLG类的玩法【帮派纷争】啦 &#xff0c;布…

RNN、LSTM与GRU循环神经网络的深度探索与实战

循环神经网络RNN、LSTM、GRU 一、引言1.1 序列数据的迷宫探索者&#xff1a;循环神经网络&#xff08;RNN&#xff09;概览1.2 深度探索的阶梯&#xff1a;LSTM与GRU的崛起1.3 撰写本博客的目的与意义 二、循环神经网络&#xff08;RNN&#xff09;基础2.1 定义与原理2.1.1 RNN…

java 闭锁(CountDownLatch)

闭锁&#xff08;CountDownLatch&#xff09;是Java中的一个同步辅助类&#xff0c;用于协调多个线程之间的协作。它允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成。闭锁非常适用于需要等待一组事件发生之后再执行某些操作的场景。 import java.uti…

【Java】垃圾回收学习笔记(二):分代假说与垃圾回收算法

文章目录 0. 分代收集理论分代假说分代GC定义 1. 垃圾回收算法1.1 标记清除&#xff08;Mark-Sweep&#xff09;算法优点缺点 1.2 标记复制算法优点缺点为什么是8:1:1&#xff1f; 1.3 标记整理算法优点缺点 2. 是否移动&#xff1f; 0. 分代收集理论 分代假说 现在多数JVM G…