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

征途网站开发背景企业seo顾问服务

征途网站开发背景,企业seo顾问服务,app仿制,前端开发是青春饭吗文章目录 一、内核线程二、内核线程与普通进程的异同三、内核线程创建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.dt0577.cn/news/14552.html

相关文章:

  • 色和尙做爰网站新发布的新闻
  • 网站建设与实训网站做优化一开始怎么做
  • 东莞市火速网络科技有限公司seo培训学校
  • 织梦学校网站源码百度小说风云榜排行榜官网
  • 九台市做网站的公司网络域名综合查询
  • 郑州市做网站公司a汉狮软件排名工具
  • 自媒体运营怎么学seo群发软件
  • 个人电脑做网站服务器网站搜索引擎收录入口
  • 可以做渗透测试的网站西安seo优化
  • 如何做网站品类网站超级外链
  • 网站制作公司 云南文娱热搜榜
  • 2o18江苏建设网站施工员模试卷网站流量统计分析工具
  • 网站建设分辨率简单的网页设计作品
  • 做qq阅读网站介绍佛山网站排名提升
  • 怎么评价网站做的好坏个人网站制作流程
  • 网站建设创新自助建站的优势
  • 旅游网站的建设现状微信朋友圈推广
  • 网站站做地图软件网页推广怎么做
  • 我自己做个网站怎么做软件开发公司经营范围
  • 大型网站一般用什么语言做的青岛网站快速排名优化
  • 17网站一起做网店广州新塘百度网站权重查询
  • 网站搭建是什么专业学的seo是做什么工作的
  • 怎么做网站弹幕app开发软件
  • 网站开发制作包括哪些的基本流程四川seo快速排名
  • 云南网站建设首选才力网站建设是干嘛的
  • 网站建设发票热点新闻事件今日最新
  • 手机兼职快递录单员aso优化服务平台
  • 优质的常州网站建设怎样建立自己的网站平台
  • 怎么自己做视频网站廊坊关键词优化报价
  • 如何做一个网站网络营销与直播电商是干什么的