3.x 内核新工作队列kworker/n ;current头文件,unrecognized ELF data encoding 0:

今天在linux-3.9.5上想用current ->comm,current->pid时,编译不通过,

需添加:

 #include <linux/kthread.h>

#include<asm/current.h>


之后可以正常编译通过,但是重复多次编译时,会出下如下错误:

unrecognized ELF data encoding 0: 

这是编译器cache的问题:

需执行:

ccache -c 


工作队列:

虽然自从2.6.0之后,Linux对work queue进行了优化,但是kernel用到create_workqueue的模块越来越多,而调用create_workqueue会在每个cpu上都创建一个work_thread, 每个cpu都分配一个cpu_workqueue_struct以及workqueue_struct,而如果没被queue_work的话根本没机会工作,这样仍然相当浪费内存资源,而且加重了cpu loading。另外,同一个work queue上的每个work都是按照串行执行的,假如其中一个work的调度程序睡眠了,那么后面的work也将无法工作。

自从2.6.36以后,work queue的机制发生了很大变化,所有的work queue都被合并成

一个work queue,work thread也不是和work queue一一关联,work何时工作紧紧按照工作的重要性以及时间紧迫性来划分。也就是说新机制是按照cpu数量来创建work thread,而不是work queue。


例:工作队列(打印默认工作队列)--linux-3.9上默认工作线程名是kworker/n ,不再是2.6系列上的 event/

 #include <linux/init.h>   

#include <linux/module.h>  
#include <linux/fs.h>  
#include <linux/kernel.h>  
#include <linux/slab.h>  
#include <linux/workqueue.h>  
#include <asm/current.h>  
#include <linux/kthread.h>  
#include <linux/sched.h>  
static void do_declarework(struct work_struct *work){  
  printk(KERN_EMERG "declarework: [%s:%d]\n",current->comm,current->pid);  
//打印执行这个工作work的线程名和pid
}  
static void do_work(struct work_struct *work){  
  printk(KERN_EMERG "init_work: [%s:%d]\n",current->comm,current->pid);  
   //打印执行这个工作work的线程名和pid
}  
static void do_delaywork(struct work_struct *work){  
  printk(KERN_EMERG "delaywork: [%s:%d]\n",current->comm,current->pid);  
    //打印执行这个工作work的线程名和pid
}  
struct work_struct my-work;  
struct delayed_work my-delaywork;  
struct workqueue_struct *mywq;  
static int __init kerneladdr(void){  
        DECLARE_WORK(my-declarework,do_declarework);  / /声明并初始化一个工作
  
        INIT_WORK(&my-work,do_work);    //初始化一下工作my-work
  
        INIT_DELAYED_WORK(&my-delaywork,do_delaywork);  //初始化一个延时工作my-delaywork
  
        schedule_work(&my-declarework);  
        schedule_work(&my-work);  
        schedule_delayed_work(&my-delaywork,5);  
        flush_scheduled_work();  //flush_workqueue(keventd_wq);
//插入一个work,并等待这个work执行完成。
  
    mywq=alloc_workqueue("mywq",0,0);  //旧版为create_workqueue("mywq");
//创建一个工作队列,旧版会给每个CPU都创建一下线程. 新的cmwq不会创建线程.
    queue_work(mywq,&my-work);  
    flush_workqueue(mywq);  
        return 0;  
}  
  
static void __exit kerneladdr_exit(void){  
    printk(KERN_ALERT"Entry kerneladdr_exit!\n");  
    destroy_workqueue(mywq);  
}  
MODULE_LICENSE("GPL");  
module_init(kerneladdr);  

module_exit(kerneladdr_exit);  


旧版wq原理如下:


新版cmwq原理:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值