首页 > 系统相关 >linux内核态线程详解

linux内核态线程详解

时间:2025-01-17 16:01:31浏览次数:3  
标签:kthread 睡眠 函数 线程 内核 timeout linux struct

头文件:

#include <linux/sched.h>          //wake_up_process()    

#include <linux/kthread.h>      //kthread_create()、kthread_run()  

#include <err.h>                      //IS_ERR()、PTR_ERR()

1.创建并启动一个内核线程:

方式一:

struct task_struct  *

kthread_create( int  (*threadfn(void  *data),void  *data,const  char  *namefmt,  ... );

线程创建后,不会马上运行,而是需要将kthread_create()  返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。

方式二:

kthread_run  :创建并启动线程的函数:

struct  task_struct  *

kthread_run(int  (*threadfn)(void  *data),void  *data,const  char  *namefmt,  ...);

2.停止线程:

kthread_stop:通过发送信号给线程,使之退出。

int  kthread_stop(struct  task_struct  *thread);

线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。

但如果线程函数正在处理一个非常重要的任务,它不会被中断的。当然如果线程函数永远不返回并且不检查信号,它将永远都不会停止

kthread_should_stop函数,我们需要在开启的线程中嵌入该函数并检查此函数的返回值,否则kthread_stop是不起作用的

msleep_interruptible()     //延时函数

Schedule_timeout_interruptible

Schedule_timeout_uninterruptible

Schedule_timeout_killable

Schedule_timeout

更理想的延迟执行方法是使用schedule_timeout()函数,该方法会让需要延迟的任务睡眠到指定的延迟时间耗尽后再重新运行。但该方法也不能保证睡眠时间正好等于指定的延迟时间,只能尽量使睡眠时间接近指定的延迟时间。当指定的时间到期后,内核唤醒被延迟的任务并将其重新放回运行队列,用法如下:

set_current_state(TASK_INTERRUPTIBLE);

schedule_timeout(s*hz);

唯一的参数是延迟的相对时间,单位为jiffies,上列中将相应的任务推入可中断睡眠队列,睡眠s秒。因为任务处于可中断状态,所以如果任务收到信号将被唤醒。如果睡眠任务不想接受信号,可以将任务状态设置为TASK_UNINTERRUPTIBLE,然后睡眠。注意,在调用schedule_timeout()函数前必须首先将任务设置成上面两种状态之一,否则任务不会睡眠。

注意,由于schedule_timeout()函数需要调度程序,所以调用它的代码必须保证能够睡眠。简而言之,调用代码必须处于进程上下文中,并且不能持有锁

标签:kthread,睡眠,函数,线程,内核,timeout,linux,struct
From: https://blog.csdn.net/ghx19940812/article/details/145209253

相关文章

  • Linux认证 | RHCE到底值不值得考?
    Linux认证里头,RHCE到底是中级水平还是高级水平呢?看完下面这些,你就能清楚它到底值不值得去考啦!RHCE(也就是RedHatCertifiedEngineer,红帽认证工程师),在Linux这个领域里,那可是相当有名的认证,好多做运维工作的人、网络工程师都没法避开这一证书。虽说名字里带着“工程师......
  • CentOS等各类Linux系统安装配置Docker详细教程(全网最详细,步骤简洁,看完包懂)
    文章目录前言详细步骤1.安装相关依赖2.安装阿里云的DockerGPG密钥3.设置stable仓库4.安装Docker5.启动服务6.验证测试常见问题及对应解决方案补充1.Ubuntu等系统配置Docker详细教程CentOS9配置Docker-速通版前言Docker是一个非常常用的工具,但是由于其涉及......
  • linux usb 驱动 - hcd 驱动框架
    linuxusbhcd驱动框架一、USB描述符1.数据结构1.1设备描述符1.2配置描述符1.3接口描述符1.4端点描述符1.5usb_hub_descriptor1.5usb_host_config1.6usb_interface_cache1.7usb_host_interface1.8usb_host_endpoint2.描述符的构建二、usb设备驱动管理1.......
  • libcurl多线程下载,支持断点续传
    libcurl多线程下载一步步实现创建时间:2024年12月1日17:35标签:libcurl,linux,下载,多线程最后编辑:2025年1月16日23:43平台是WSL的Ubuntu22,使用Gcc编译。单线程下载编译命令gcc-otranstrans.c-lcurl/*trans.c*/#include<curl/curl.h>#include<stdio.h>......
  • 一文搞懂 systemd 服务管理:Linux 服务自动启动与重启完整教程
    言简意赅的讲解systemd服务的自动启动与重启解决的痛点在Linux系统中,systemd是管理服务的核心工具。它不仅可以让服务在系统启动时自动运行,还能实现服务的监控和自动重启功能。本文将从基础知识出发,手把手教你如何用systemd配置一个Java服务(aps-0.0.1-SNAPSHOT.jar......
  • linux系统串口终端软件显示异常解决方法,触觉智能出品
    本文介绍linux系统串口终端软件显示异常解决方法,以xshell软件为例。使用触觉智能的PurplePiR1双网口开发板演示,内置双核A71.2Ghz处理器,支持WiFi与丰富GPIO拓展,是嵌入式新人入门学习的高性价比开发板!使用resize命令调整终端命令终端大小不对的情况如下图:使用resize命令调整......
  • Linux基础-指令篇01【入门级】
    工具安装需要用到VMware,大家自行安装,如果有需要后续会上传相关文件和详细安装步骤嵌入式系统专业定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,对功能,可靠性,成本,体积,功耗等严格要求的专用计算机系统。简单理解:除了pc和一些高级的控制台之外,绝大多数的控制类设备都是嵌......
  • Linux 查看目录下的文件夹命令与 find 查找某个目录但不包括该目录本身
    在Linux系统中,管理和查找文件及文件夹是日常运维和开发过程中常见的任务。本文将介绍如何查看目录下的文件夹,并使用 find 命令查找特定目录下的内容,但排除该目录本身。我们将详细讨论以下内容:使用 ls 命令查看目录下的文件夹。使用 find 命令查找特定目录内容并排除该......
  • Linux驱动开发:一文掌握 块设备VS字符设备开发流程全解!
    Linux驱动开发是嵌入式系统开发中的一个重要组成部分,它直接关系到硬件设备的功能实现和性能优化。在Linux系统中,驱动开发主要分为字符设备驱动、块设备驱动和网络设备驱动三大类。本文将重点介绍字符设备和块设备的基础知识,以及它们在驱动开发中的差异和开发流程。一、字符设......
  • Linux进程概念-进程状态
    在上一篇已经了解了在进程中的基本概念,现在我来了解一下进程的相关状态;对于进程的状态,在详细了解之前我们可以来一个粗略的理解:进程的状态可以理解为就是一个整数,用宏定义实现R,S等状态;也就是进程状态就是take_struck内的一个整数;如果不理解也没关系,下面来看看对进程状......