易截截图软件、单文件、免安装、纯绿色、仅160KB

Linux中的工作队列 (2.6.0~2.6.19 and 2.6.20 ~ now)

http://blog.chinaunix.net/u2/69889/showart_971040.html
Linux中的工作队列
[前记]Linux自从2.6.20之后,工作队列发生了一些变化,目前从网络上搜索的资料一般都是介绍老版本的工作队列,很少见到对新版本的介绍。本文对新老版本都做了简要概述,并分别提供了简单的实作案例。
*******************************************************************************************************************
工作队列
(work
queue)

Linux
kernel
中将工作推后执行的一种机制。这种机制和
BH

Tasklets
不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。
工作队列是
2.6
内核开始引入的机制,在
2.6.20
之后,工作队列的数据结构发生了一些变化,因此本文分成两个部分对
2.6.20
之前和之后的版本分别做介绍。
1

2.6.0~2.6.19
数据结构:
struct
work_struct {
    unsigned
long pending;
    struct
list_head entry;
    void
(*func)(void *);
    void
*data;
    void
*wq_data;
    struct
timer_list timer;
};
pending
是用来记录工作是否已经挂在队列上;
entry
是循环链表结构;
func
作为函数指针,由用户实现;
data
用来存储用户的私人数据,此数据即是
func
的参数;
wq_data
一般用来指向工作者线程(工作者线程参考下文);
timer
是推后执行的定时器。
work_struct
的这些变量里,
func

data
是用户使用的,其他是内部变量,我们可以不用太过关心。
 
API

1)
INIT_WORK(_work, _func, _data)
初始化指定工作,目的是把用户指定的函数
_func

_func
需要的参数
_data
赋给
work_struct

func

data
变量。
2)
int schedule_work(struct work_struct *work)
对工作进行调度,即把给定工作的处理函数提交给缺省的工作队列和工作者线程。工作者线程本质上是一个普通的内核线程,在默认情况下,每个
CPU
均有一个类型为“
events”
的工作者线程,当调用
schedule_work
时,这个工作者线程会被唤醒去执行工作链表上的所有工作。
3)
int schedule_delayed_work(struct work_struct *work, unsigned long
delay)
延迟执行工作,与
schedu


相关文档:

JPEG图形库:libjpeg,在LINUX下如何将jpg转换成bmp


    近来需要写一个在LINUX下的图形文件处理程序,最开始只支持BMP格式,后来要求也处理JPG。急得抓头啊,以前可没认真研究过JPG…………
    在网上找到了libjpeg,可以用这个库实现JPG图片的各种操作:
    下载:http://freeware.sgi.com/sou ......

linux tasklet 2

http://hi.baidu.com/j_fo/blog/item/7412bb018deab109728da572.html
Linux内核 irq/soft irq/tasklet/同步
2009-10-08 21:22
1.中断处理程序结束之前,不允许产生相同的中断事件;(禁用PIC上该中断,但可以产生其他中断)
2.中断处理程序、软中断、tasklet既不可被抢占也不能被阻塞,最多发生中断嵌套;
3.执行中断 ......

linux tasklet 3

http://hi.baidu.com/styl_007/blog/item/82b833f475036ce67609d7b6.html
中断处理的tasklet(小任务)机制-不过如此
2009-08-10 18:30
中断服务程序一般都是在中断请求关闭的条件下执行的
,
以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,
CPU
就不能及时响应其 ......

linux tasklet 4

引用 2 楼 cokeliu 的回复:
谢谢! 请问是否每调用一次tasklet_schedule(B task); B task任务被加到链表上只会被执行一次?
是的,只被加一次
第一次tasklet_schedule(B task)给他一个状态TASK_STATE_SCHED
作标记,以后的tasklet_schedule(B task)会检查这个标记
http://os.inf.tu-dresden.de/l4env/doc/html/dde_linux ......

Linux 设备驱动 Edition 3) workqueue


7.5. Tasklets 机制
上一页
 
第 7 章 时间, 延时, 和延后工作
 下一页
http://lsec.cc.ac.cn/~tengfei/doc/ldd3/index.html
Linux 设备驱动 Edition 3
7.5. Tasklets 机制
另一个有关于定时问题的内核设施是 tasklet 机制. 它大部分用在中断管理(我们将在第 10 章再次见到). ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号