当前位置: 首页 > 图文教程 > 操作系统 > Unix/Linux > Linux操作系统内核中工作队列的操作

Unix/Linux
PostgreSQL Hardware Performance Tuning
Firefox 1.0.6简体中文版发布,提供下载
包过滤防火墙配置实例.
linux中的时间流
Rsync Server +Rsync client 配置完全实践笔记
mysql数据库root口令忘记自动恢复脚本
自动修改linux下的网卡ip和掩码脚本
将指定文件列表中的文件内容逐个替换成想要的内容的小脚本
用nmap扫描端口并写到一个静态网页脚本(转贴)
配置xdm远程连接
解决如何修改mysql服务器监听端口的问题。
CC2001关于计算机科学的教学大纲
Linux命令Man解释:losetup:设定与控制loopdevices
Linux网管123---第6章.一般系统管理问题-2.建立使用者帐号
汉化你的RedHat全攻略(4)-FAQ和一些总结
"/dev/tty0"不见了怎麽救回来?
/dev下cua*被删除,该如何恢复?
Linux网管123---第7章.自订的组态及管理内容-1.HTTP
vi介绍编(2)参数简介
Linux命令Man解释:mkfs:建立linux文件系统

Unix/Linux 中的 Linux操作系统内核中工作队列的操作


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 111 ::
收藏到网摘: n/a

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,严禁用于任何商业用途。

msn: [email protected]

来源:http://yfydz.cublog.cn

1. 前言

工作队列(workqueue)的Linux内核中的定义的用来处理不是很紧急事件的回调方式处理方法.

以下代码的linux内核版本为2.6.19.2, 源代码文件主要为kernel/workqueue.c.

2. 数据结构

/* include/linux/workqueue.h */

// 工作节点结构

struct work_struct {

// 等待时间

unsigned long pending;

// 链表节点

struct list_head entry;

// workqueue回调函数

void (*func)(void *);

// 回调函数func的数据

void *data;

// 指向CPU相关数据, 一般指向struct cpu_workqueue_struct结构

void *wq_data;

// 定时器

struct timer_list timer;

};

struct execute_work {

struct work_struct work;

};

/* kernel/workqueue.c */

/*

* The per-CPU workqueue (if single thread, we always use the first

* possible cpu).

*

* The sequence counters are for flush_scheduled_work(). It wants to wait

* until all currently-scheduled works are completed, but it doesn't

* want to be livelocked by new, incoming ones. So it waits until

* remove_sequence is >= the insert_sequence which pertained when

* flush_scheduled_work() was called.

*/

// 这个结构是针对每个CPU的

struct cpu_workqueue_struct {

// 结构锁

spinlock_t lock;

// 下一个要执行的节点序号

long remove_sequence; /* Least-recently added (next to run) */

// 下一个要插入节点的序号

long insert_sequence; /* Next to add */

// 工作机构链表节点

struct list_head worklist;

// 要进行处理的等待队列

wait_queue_head_t more_work;

// 处理完的等待队列

wait_queue_head_t work_done;

// 工作队列节点

struct workqueue_struct *wq;

// 进程指针

struct task_struct *thread;

int run_depth; /* Detect run_workqueue() recursion depth */

} ____cacheline_aligned;

/*

* The externally visible workqueue abstraction is an array of

* per-CPU workqueues:

*/

// 工作队列结构

struct workqueue_struct {

struct cpu_workqueue_struct *cpu_wq;

const char *name;

struct list_head list; /* Empty if single thread */

};

kernel/workqueue.c中定义了一个工作队列链表,