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

原创 2013年12月04日 10:31:02

今天在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原理:


kworker内核工作队列详解

工作队列是另一种将工作推后执行的形式,它可以把工作交给一个内核线程去执行,这个下半部是在进程上下文中执行的,因此,它可以重新调度还有睡眠。     区分使用软中断/tasklet还是工作队列比较简单...
  • wh8_2011
  • wh8_2011
  • 2015年11月10日 21:52
  • 3379

关于kworker

1    请问什么所 kworker 进程  清理旧版本的软件缓存:  sudo apt-get autoclean 这个进程是干什么的?  我的机器刚装11.04 ...
  • pointfish
  • pointfish
  • 2012年08月05日 18:55
  • 29312

Linux内核架构: workqueue

http://lwn.net/Articles/403891/linux内核中断处理的工作队列workqueue机制工作队列(workqueue)是另外一种将工作推后执行的形式。工作队列可以把工作推后...
  • hongzg1982
  • hongzg1982
  • 2017年02月05日 15:10
  • 359

Linux进程管理之内核线程

内核源码:linux-2.6.38.8.tar.bz2     目标平台:ARM体系结构       在Linux系统中,进程和线程都使用task_struct结构体来表示,线程只不过是一种特殊...
  • npy_lp
  • npy_lp
  • 2012年03月29日 21:57
  • 6518

初探Linux进程——僵尸进程和父子关系

第三列是PPID,即使不是很清楚这里边的内涵,闭着眼猜也能猜出个一二来了。可以看到僵尸进程13962确实是由父进程13961(我的可执行文件叫zombie)创造的,而13961是2427bash创造的...
  • huqinweI987
  • huqinweI987
  • 2013年11月12日 17:11
  • 3863

记一次在linux 平台上的优化调试

Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 测试平台:AM335X ...
  • peng654321
  • peng654321
  • 2014年05月22日 23:17
  • 872

linux kernel scheduler -- 进程优先级

1. task_struct 中标示linux 进程优先级的几个重要变量 linux kernel 进程描述符task_struct中有几个成员标识 linux 进程的优先级,prio, static...
  • chenqiang0721
  • chenqiang0721
  • 2015年07月17日 15:03
  • 1664

linux ps 查看进程命令

linux 中ps命令是Process Status的缩写。ps命令可以列出系统中当前运行的进程,所列出的进程是在执行ps命令这个时刻正在运行的进程。 如果要动态显示进程信息,需要使用top命令。通过...
  • fdipzone
  • fdipzone
  • 2015年02月28日 23:26
  • 22932

kworker内核工作队列详解

工作队列是另一种将工作推后执行的形式,它可以把工作交给一个内核线程去执行,这个下半部是在进程上下文中执行的,因此,它可以重新调度还有睡眠。     区分使用软中断/tasklet还是工作队列比较简单...
  • wh8_2011
  • wh8_2011
  • 2015年11月10日 21:52
  • 3379

Linux内核线程列表

使用ps aux命令查看到的内核线程列表   USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND r...
  • zahuopuboss
  • zahuopuboss
  • 2013年07月01日 16:25
  • 1135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3.x 内核新工作队列kworker/n ;current头文件,unrecognized ELF data encoding 0:
举报原因:
原因补充:

(最多只允许输入30个字)