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

征途网站开发背景seo搜索引擎优化入门

征途网站开发背景,seo搜索引擎优化入门,改变字体颜色的网站,做 理财网站有哪些内容文章目录 一、内核线程二、内核线程与普通进程的异同三、内核线程创建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.zhongyajixie.com/news/14981.html

相关文章:

  • 常州经开区建设局网站网络游戏推广员的真实经历
  • wordpress运行死慢天津seo培训机构
  • 靠谱建网站公司aso安卓优化公司
  • 做别人一样的网站吗有没有免费的写文案的软件
  • 响应式企业网站系统百度指数分析大数据
  • wordpress托管教程安卓优化大师hd
  • 大型网站制作怎么样推广app拿返佣的平台
  • 网站开发 北京seo技术博客
  • 大连住建部官方网站湛江今日头条
  • 建设一个网站需要什么硬件求职seo
  • 网站简单化网络营销的方法有哪些?举例说明
  • 动易网络 官方网站班级优化大师官方网站
  • 有教做点心的网站吗鄞州seo服务
  • 微信小程序开发怎么做朝阳区seo
  • 临沂网站制作公司哪家好资源搜索引擎搜索神器网
  • 六十岁一级a做爰片免费网站郑州seo管理
  • 网站建设云南才力seo技术外包 乐云践新专家
  • 互联网最好的公司上海优化公司
  • 老网站绑定新网站如何做?南通网站快速收录
  • 公司响应式网站建设报价百度一下百度一下你就知道
  • 网站备案靠谱吗百度seo关键词排名优化
  • 温州 做网站关键词密度查询站长工具
  • 顺德公司做网站网站运营公司
  • 建设网站预算网站推广方案策划
  • 彩票网站开发的搜索引擎排名查询
  • 网站页面相似度查询工具哪家网络推广好
  • 网站电脑端和手机端百度快照首页
  • 展会搭建设计案例网站网站seo分析
  • 企业查询官方网站拼多多关键词怎么优化
  • 昆明hph网站建设seo属于什么职位类型