Linux内核线程(一)
我们经常会遇到一些情况,需要内核在后台执行某些操作,这时我们可以使用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内核线程(一)相关推荐
- linux内核线程创建销毁机制
这个话题乍一听貌似比较大,其实线程创建本身就是一件很平常的事情. 下面将要介绍的是,新版linux中创建内核线程的机制做了一些变化(其实本质没变,最终还是调用do_fork()来实现),和控制线程的时 ...
- linux 内核线程与普通进程的区别
linux 内核通过内核线程这种方式来实现在后台运行一些操作. 内核线程是在内核空间中单独存在的标准进程.内核线程与普通进程最大的不同在于: 内核线程没有地址空间.内核线程只能工作于内核空间,不能上下 ...
- java线程和linux线程,Java线程与Linux内核线程的映射关系
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上仍是轻量级进程(LWP). Java里的线程是由JVM来管理的,它如何对应到操做 ...
- Linux内核线程kernel thread详解--Linux进程的管理与调度(十)【转】
转自:https://blog.csdn.net/gatieme/article/details/51589205 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:/ ...
- Java线程与Linux内核线程的映射关系
http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL (Native POSIX Thread Librar ...
- linux内核线程socket,从Linux源码看Socket(TCP)的accept
从Linux源码看Socket(TCP)的accept 前言 笔者一直以为若是能知道从应用到框架再到操做系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...
- Linux内核线程kernel thread详解--Linux进程的管理与调度
内核线程 为什么需要内核线程 Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求). 内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的. 内核线程 ...
- linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上
基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...
- Linux内核信号杀死内核线程,linux内核线程对信号的处理过程.
linux中的线程分为用户线程和内核线程,用户线程是规范的线程,全面的自主性,全面的抢占性:然而内核线程就不那么好了,某种含义上未曾用户线程那么安逸,这个怎么会意呢?用户线程的编写者只必需告终利用逻辑 ...
- linux内核线程优先级设置,Linux c 线程属性,线程优先级的修改
Linux c 线程属性,线程优先级的修改 发布时间:2018-07-19 10:24, 浏览次数:1290 , 标签: Linux 线程属性的设置,网上找的文章总感觉不够全面,还是结合man手册查看 ...
最新文章
- QQ验证码识别源代码(C#/NET1.1)
- Airbnb改进部署管道安全性,规范部署顺序
- Network | UDP checksum
- 编写书籍《C语言嵌入式系统编程修炼之道》序言
- 2013届华为校园招聘机试题
- 可隐藏选项卡html,隐藏HTML中选定选项卡的底部边框
- 网络流专题(完结撒花)
- java pdf转为png_java-使用icepdf实现pdf转换成png
- 全手工制作arm-linux交叉编译工具链《一》-转
- css 百分比继承关系的探讨
- Mysql5.6 自动化部署
- 计算机管理设置透明,怎么让Win10任务栏全透明_win10系统让任务栏完全透明的设置步骤-win7之家...
- ODM、JDM、OEM概念
- 用Glide-图片的压缩-图片压缩原理
- PMP/高项 项目管理培训大纲
- uniapp修改文件名并保存到本地
- Spring学习-Spring核心技术(九)
- ARCGIS对不同值域的格栅影像用同一图例出图
- 倩女手游经验计算机,倩女幽魂手游升级攻略 如何保证每天获经验最大
- 伪原创文章生成器软件