我们经常会遇到一些情况,需要内核在后台执行某些操作,这时我们可以使用kernel threads来实现,kernel threads也是standard processes,但是它们仅仅存在于内核空间。Kernelthreads与normal processes的重要区别就是kernelthreads没有地址空间,因此它们的mm指针就是NULL。Kernel threads仅仅在内核空间中活动,不会切换到用户空间。但是,kernelthreads也与normal processes一样,也是schedulable和preemptable(可调度并且可抢占的)。

Linux系统也有一些tasks会委托给kernel threads去处理,最明显的就是flush task和ksoftirqd task,在我们的Linux系统中运行ps –ef命令就可以看到这些内核线程了:

其实并不止这两个,如上图显示的一样,还有很多kernel threads执行的tasks。

Kernelthreads是在系统启动时由其它的kernel threads创建。的确,一个kernel thread只能由其它的kernel thread创建。内核会自动进行处理,通过挖走kthreadd kernel process的所有新的kernel threads进行处理。

从已存在的kernel thread孵化出新的kernel thread的接口在<linux/kthread.h>中进行了声明:

struct task_struct *kthread_create(int (*threadfn)(void*data),

void *data,

const char namefmt[], ...)

__attribute__((format(printf,3, 4)));

新task是由kthread kernel process通过clone()系统调用创建的。新的process将运行threadfn函数,这个函数是通过data参数传递的。这个process将被命名为namefmt,变量参数列表中的namefmt采用的是printf-style formatting 的参数。这个process在创建后,处于unrunnable的状态,直到显示的调用wake_up_process()函数后,它才开始运行(或者runnable)。

也可以通过一个函数创建一个process并且让它变成runnable:kthread_run()

#define kthread_run(threadfn, data, namefmt, ...)                            \

({                                                                                    \

structtask_struct *__k                                                          \

=kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \

if(!IS_ERR(__k))                                                         \

wake_up_process(__k);                                             \

__k;                                                                       \

})

这个例程是一个宏,同时调用了kthread_create()和wake_up_process()。

一旦开始,kernel thread就会一直存在直到 它自己调用do_exit()函数或者内核的其它部分调用kthread_stop()函数并且将kthread_create()返回的task_struct结构的地址传递给kthread_stop():

int kthread_stop(struct task_struct *k);

Linux内核线程(一)相关推荐

  1. linux内核线程创建销毁机制

    这个话题乍一听貌似比较大,其实线程创建本身就是一件很平常的事情. 下面将要介绍的是,新版linux中创建内核线程的机制做了一些变化(其实本质没变,最终还是调用do_fork()来实现),和控制线程的时 ...

  2. linux 内核线程与普通进程的区别

    linux 内核通过内核线程这种方式来实现在后台运行一些操作. 内核线程是在内核空间中单独存在的标准进程.内核线程与普通进程最大的不同在于: 内核线程没有地址空间.内核线程只能工作于内核空间,不能上下 ...

  3. java线程和linux线程,Java线程与Linux内核线程的映射关系

    Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上仍是轻量级进程(LWP). Java里的线程是由JVM来管理的,它如何对应到操做 ...

  4. Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】

    转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...

  5. Java线程与Linux内核线程的映射关系

    http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL (Native POSIX Thread Librar ...

  6. linux内核线程socket,从Linux源码看Socket(TCP)的accept

    从Linux源码看Socket(TCP)的accept 前言 笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...

  7. Linux内核线程kernel thread详解--Linux进程的管理与调度

    内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...

  8. linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上

    基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...

  9. Linux内核信号杀死内核线程,linux内核线程对信号的处理过程.

    linux中的线程分为用户线程和内核线程,用户线程是规范的线程,全面的自主性,全面的抢占性:然而内核线程就不那么好了,某种含义上未曾用户线程那么安逸,这个怎么会意呢?用户线程的编写者只必需告终利用逻辑 ...

  10. linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改

    Linux c 线程属性,线程优先级的修改 发布时间:2018-07-19 10:24, 浏览次数:1290 , 标签: Linux 线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看 ...

最新文章

  1. QQ验证码识别源代码(C#/NET1.1)
  2. Airbnb改进部署管道安全性,规范部署顺序
  3. Network | UDP checksum
  4. 编写书籍《C语言嵌入式系统编程修炼之道》序言
  5. 2013届华为校园招聘机试题
  6. 可隐藏选项卡html,隐藏HTML中选定选项卡的底部边框
  7. 网络流专题(完结撒花)
  8. java pdf转为png_java-使用icepdf实现pdf转换成png
  9. 全手工制作arm-linux交叉编译工具链《一》-转
  10. css 百分比继承关系的探讨
  11. Mysql5.6 自动化部署
  12. 计算机管理设置透明,怎么让Win10任务栏全透明_win10系统让任务栏完全透明的设置步骤-win7之家...
  13. ODM、JDM、OEM概念
  14. 用Glide-图片的压缩-图片压缩原理
  15. PMP/高项 项目管理培训大纲
  16. uniapp修改文件名并保存到本地
  17. Spring学习-Spring核心技术(九)
  18. ARCGIS对不同值域的格栅影像用同一图例出图
  19. 倩女手游经验计算机,倩女幽魂手游升级攻略 如何保证每天获经验最大
  20. 伪原创文章生成器软件

热门文章

  1. 关于Oracle用sqlldr导入限制值长度大于255问题解决方法
  2. java学生管理系统oracle_基于Java的Oracle学生成绩管理系统
  3. 最小二乘法2阶拟合数据
  4. 浅谈JS中的原型对象和原型链
  5. 备忘录 | 当我每晚闲暇时我在干什么(1)
  6. 深入学习之mysql(二)表的操作
  7. Android Studio配置文件修改
  8. mysql修改有外键约束的表结构
  9. Linux tree 命令乱码
  10. C语言的标准内存分配函数