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

微信公众号做的网站专业构建网站的公司

微信公众号做的网站,专业构建网站的公司,外贸优化网站制作,顶尖的赣州网站建设文章目录 一、内核线程二、内核线程与普通进程的异同三、内核线程创建3.1 kernel_thread3.2 kthread_create 四、内核线程的退出四、示例代码参考资料 一、内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情。Linux内核使用内核线程来将内核分成几个功…

文章目录

  • 一、内核线程
  • 二、内核线程与普通进程的异同
  • 三、内核线程创建
    • 3.1 kernel_thread
    • 3.2 kthread_create
  • 四、内核线程的退出
  • 四、示例代码
    • 参考资料

一、内核线程

内核线程就是内核的分身,一个分身可以处理一件特定事情。Linux内核使用内核线程来将内核分成几个功能模块,像kswapd、kflushd等,这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。

内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。这与用户线程是不一样的。

内核线程只运行在内核态,不受用户态上下文的拖累。

  • 处理器竞争:可以在全系统范围内竞争处理器资源;
  • 使用资源:唯一使用的资源是内核栈和上下文切换时保持寄存器的空间
  • 调度:调度的开销可能和进程自身差不多昂贵
  • 同步效率:资源的同步和数据共享比整个进程的数据同步和共享要低一些。

二、内核线程与普通进程的异同

  1. 跟普通进程一样,内核线程也有优先级和被调度。 当和用户进程拥有相同的static_prio时,内核线程有机会得到更多的cpu资源。
  2. 内核线程的bug直接影响内核,很容易搞死整个系统, 但是用户进程处在内核的管理下,其bug最严重的情况也只会把自己整崩溃。
  3. 内核线程没有自己的地址空间,所以它们的”current->mm”都是空的。
  4. 内核线程只能在内核空间操作,不能与用户空间交互。

内核线程不需要访问用户空间内存,这是再好不过了。所以内核线程的task_struct的mm域为空.但是刚才说过,内核线程还有核心堆栈,没有mm怎么访问它的核心堆栈呢?这个核心堆栈跟task_struct的thread_info共享8k的空间,所以不用mm描述。

但是内核线程总要访问内核空间的其他内核啊,没有mm域毕竟是不行的。所以内核线程被调用时, 内核会将其task_strcut的active_mm指向前一个被调度出的进程的mm域, 在需要的时候,内核线程可以使用前一个进程的内存描述符。

因为内核线程不访问用户空间,只操作内核空间内存,而所有进程的内核空间都是一样的。这样就省下了一个mm域的内存。

三、内核线程创建

在内核中,有两种方法可以生成内核线程

3.1 kernel_thread

kernel_thread是最基础的创建内核线程的接口, 它通过将一个函数直接传递给内核来创建一个进程, 创建的进程运行在内核空间, 并且与其他进程线程共享内核虚拟地址空间。

init/main.c文件中可以看到使用kernel_thread创建了负责内核初始化的进程。

noinline void __ref rest_init(void)
{struct task_struct *tsk;int pid;rcu_scheduler_starting();/** We need to spawn init first so that it obtains pid 1, however* the init task will end up wanting to create kthreads, which, if* we schedule it before we create kthreadd, will OOPS.*/pid = kernel_thread(kernel_init, NULL, CLONE_FS);...
}

3.2 kthread_create

kthread_create接口,则是标准的内核线程创建接口,也是最常用的方法。

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

struct task_struct *kthread_create(int (*threadfn)(void *data),void *data,const char namefmt[], ...);
  • threadfn为线程函数;
  • data为线程函数参数;
  • namefmt为线程名称,可被格式化的, 类似printk一样传入某种格式的线程名

此外内核还提供了kthread_run宏定义,它将kthread_create和wake_up_process结合起来,帮助开发者快速创建并启动线程的函数。

// include/linux/kthread.h
#define kthread_run(threadfn, data, namefmt, ...)			   \
({									   \struct task_struct *__k						   \= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \if (!IS_ERR(__k))						   \wake_up_process(__k);					   \__k;								   \
})

四、内核线程的退出

线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数(当线程执行到函数末尾时也会自动调用内核中do_exit()函数),或者其他的进程调用kthread_stop函数,结束线程的运行。

int kthread_stop(struct task_struct *thread);

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

在执行kthread_stop的时候,目标线程必须没有退出,否则会Oops。原因很容易理解,当目标线程退出的时候,其对应的task结构也变得无效,kthread_stop引用该无效task结构就会出错。

为了避免这种情况,需要确保线程没有退出,其方法如代码中所示:

thread_func()
{// do your work here// wait to exitwhile(!thread_could_stop()){wait();}
}exit_code()
{kthread_stop(_task);   //发信号给task,通知其可以退出了
}

四、示例代码

#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/delay.h>#define ENTER() printk(KERN_DEBUG "%s() Enter", __func__)
#define EXIT() printk(KERN_DEBUG "%s() Exit", __func__)
#define ERR(fmt, args...) printk(KERN_ERR "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)
#define DBG(fmt, args...) printk(KERN_DEBUG "%s()-%d: " fmt "\n", __func__, __LINE__, ##args)static struct task_struct *test_kthread = NULL;    //定义一个task_struct结构体指针,赋值为NULLstatic int kthread_test_func(void)   //定义一个内核线程要执行的函数
{ENTER();while (!kthread_should_stop()) {DBG("kthread is running");msleep(5000);}EXIT();return 0;
}static __init int kthread_test_init(void)
{ENTER();test_kthread = kthread_run(kthread_test_func, NULL, "kthread-test");  //创建线程kthread-test,并且运行if (!test_kthread) {ERR("kthread_run fail");return -ECHILD;}EXIT();return 0;
}static __exit void kthread_test_exit(void)
{ENTER();if (test_kthread) {DBG("kthread_stop");kthread_stop(test_kthread); //停止内核线程test_kthread = NULL;}EXIT();
}
module_init(kthread_test_init);
module_exit(kthread_test_exit);MODULE_DESCRIPTION("Device_create Driver");
MODULE_LICENSE("GPL");

参考资料

  1. Linux创建内核线程kthread_create的用法介绍
  2. Linux内核线程
  3. linux内核中创建线程方法【转】
http://www.yayakq.cn/news/973795/

相关文章:

  • 厦门微信网站做的比较好的官方网站
  • 可视化网站建设怎么删除wordpress插件
  • 查询网站备案时间查询wordpress5.0代码执行
  • 企业建设网站是网络营销吗免费推广网站58
  • 风向 网站有没有给人做简历的网站
  • 哪里卖网站模板wordpress 企业插件
  • 建站视频网站分析论文
  • 广州 网站设计公司排名免费设计素材
  • 网站开发用哪种语言上海工商企业查询网
  • 抚州购物网站开发设计信阳网站建设策划方案
  • 培训机构网站设计中宁网站建设
  • 怎么看网站的外链网站建设美化
  • 东营网站建设制作网站的运营
  • 餐饮行业网站建设风格拱墅区建设局网站
  • 永康市住房和城乡建设局网站ftp更换网站
  • 神华集团两学一做网站网站安全建设管理制度
  • 浅蓝色.net企业网站源码带后台毕业设计ppt答辩模板
  • 网站管理基本内容网站建设公司的方案
  • 西安网站搜索引擎优化简约大气网站设计欣赏
  • 北京网站手机站建设公司电话号码seo排名需要多少钱
  • 网站建设 项目背景wordpress 2019主题谷歌字体
  • 塘厦仿做网站个人网页模板王
  • 网站建设哪家好网站建设哪家好网站建设哪家wordpress 中文 seo 插件
  • 长兴建设局网站公司网站建设的目的好处
  • 哈尔滨做网站找哪家好wordpress wti like post
  • 中山移动网站建设多少钱h5 技术做健康类网站
  • 网站建设 高端 北京建设淘宝网站的目的
  • 网站建设一次sdk广告平台
  • 石家庄教育平台网站建设淮北信息网官方
  • 免费做全网解析电影网站赚钱做好网站建设通知