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

Unix/Linux
Linux关机命令详解
如何在Linux中访问硬盘DOS分区、软盘和光盘
在 RedHat 环境如何手工建立tunnel(IPV6)?
Linux下新手装网卡指南
为Linux操作系统安装第2个硬盘
在Linux操作系统中使用手写板
Linux内核初始化过程简要介绍
Linux磁盘存储区管理原理与技巧
Linux操作系统中备份恢复技术的应用
浅谈linux操作系统的优化及安全配置
Linux操作系统定时任务系统Cron入门
主流嵌入式Linux动态扩展技术比较分析
让关闭的Linux操作系统实现防火墙功能
运用更方便 Linux操作系统三则应用技巧
一个Linux爱好者的2.6.11内核编译过程
用Linux的dd命令简单破解加密软盘
如何共享两台Linux操作系统的根目录
Linux操作操作两种常见启动故障解决方法
Linux内核源代码的阅读及相关工具介绍
Linux 关机重启流程分析

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-01   浏览: 63 ::
收藏到网摘: 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中定义了一个工作队列链表,