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

采用什么方法推广网站凯天建设发展集团有限公司网站

采用什么方法推广网站,凯天建设发展集团有限公司网站,盘县网站建设,网站系统架构设计文章目录 一、内核线程二、内核线程与普通进程的异同三、内核线程创建3.1 kernel_thread3.2 kthread_create 四、内核线程的退出四、示例代码参考资料 一、内核线程 内核线程就是内核的分身#xff0c;一个分身可以处理一件特定事情。Linux内核使用内核线程来将内核分成几个功… 文章目录 一、内核线程二、内核线程与普通进程的异同三、内核线程创建3.1 kernel_thread3.2 kthread_create 四、内核线程的退出四、示例代码参考资料 一、内核线程 内核线程就是内核的分身一个分身可以处理一件特定事情。Linux内核使用内核线程来将内核分成几个功能模块像kswapd、kflushd等这在处理异步事件如异步IO时特别有用。内核线程的使用是廉价的唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。 内核线程的调度由内核负责一个内核线程处于阻塞状态时不影响其他的内核线程因为其是调度的基本单位。这与用户线程是不一样的。 内核线程只运行在内核态不受用户态上下文的拖累。 处理器竞争可以在全系统范围内竞争处理器资源使用资源唯一使用的资源是内核栈和上下文切换时保持寄存器的空间调度调度的开销可能和进程自身差不多昂贵同步效率资源的同步和数据共享比整个进程的数据同步和共享要低一些。 二、内核线程与普通进程的异同 跟普通进程一样内核线程也有优先级和被调度。 当和用户进程拥有相同的static_prio时内核线程有机会得到更多的cpu资源。内核线程的bug直接影响内核很容易搞死整个系统, 但是用户进程处在内核的管理下其bug最严重的情况也只会把自己整崩溃。内核线程没有自己的地址空间所以它们的”current-mm”都是空的。内核线程只能在内核空间操作不能与用户空间交互。 内核线程不需要访问用户空间内存这是再好不过了。所以内核线程的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);参考资料 Linux创建内核线程kthread_create的用法介绍Linux内核线程linux内核中创建线程方法【转】
http://www.dnsts.com.cn/news/213464.html

相关文章:

  • 成都网站建设 四川冠辰wordpress英文换成中文字体
  • google网站增加关键词系统管理员已阻止这个应用
  • 个人网站备案网址导航中职网站建设与维护考试题
  • 手机网站 cms网络营销推广方法有哪些
  • 网上商城网站开发与建立的意义杭州营销型网站建设工作室
  • 用wordpress做企业网站视频教程微网站 百度地图
  • c2c网站管理系统建站网站推荐
  • 权威的网站建设排行榜手机网站开发模板
  • 自己做网站挂广告怎么赚钱中国建设银行员工培训网站
  • 中山网站建点智慧团建pc端注册登录入口
  • wordpress分类作为首页湘潭关键词优化公司
  • 网站模板之家官网78建筑网人才信息
  • 莱芜网站建设排行开发个app多少钱
  • 建设单位网站需求报告wordpress改端口
  • 做网站会后期维护吗外链屏蔽逐步解除
  • 临沂网站制作费用去中企动力上班怎么样
  • 慈溪住房和城乡建设部网站vps 网站打不开
  • 推荐黄的网站网站建设市场推广招聘
  • 跨境电商app开发青岛信息优化排名推广
  • 鞋材 东莞网站建设网站定制哪个好
  • 个人作品集网站模板wordpress用户管理员教程
  • 电商运营网站 建设珠海seo
  • 网站推广活动方案怎样做支付网站
  • 网站改版怎么做301重定向huntt wordpress主题
  • 网站建设与管理计划湘潭市哪里做网站
  • 吧网站做软件的软件做网站好用的cms
  • 做黄金的网站网站推广团队
  • 付费推广有几种方式优化大师下载安装免费
  • 做荣誉证书的网站建筑工程劳务信息平台
  • 网站接入百度地图专业软文平台