免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1273 | 回复: 0
打印 上一主题 下一主题

7.4~7.6. 内核定时器、Tasklets 机制、工作队列 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-05 12:45 |只看该作者 |倒序浏览
7.4. 内核定时器

#include linux/timer.h>
struct timer_list
{
        /* ... */
        unsigned long expires;//期望运行的 jiffies 值
        void (*function)(unsigned long);
        unsigned long data;//传给function的参数
};//使用前必须初始化
void init_timer(struct timer_list *timer);
//初始化一个timer_list
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
//初始化一个静态的timer_list
void add_timer(struct timer_list * timer);
int mod_timer(struct timer_list *timer, unsigned long expires);
int del_timer(struct timer_list * timer);
int del_timer_sync(struct timer_list *timer);
//同 del_timer 一样,但保证函数返回时,定时器函数不在任何 CPU 上运行
//避免在SMP 系统上竞争
int timer_pending(const struct timer_list * timer);
//返回真或假来指示是否定时器已被调试运行

7.5. Tasklets 机制
#include linux/interrupt.h>
struct tasklet_struct {
/* ... */
void (*func)(unsigned long);
unsigned long data;
};
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data);
//将定义好的结构体初始化,才可用
DECLARE_TASKLET(name, func, data);
//直接申明就可用了
DECLARE_TASKLET_DISABLED(name, func, data);
void tasklet_disable(struct tasklet_struct *t);
void tasklet_disable_nosync(struct tasklet_struct *t);
//对正在运行的tasklet无效,当它返回时,这个 tasklt 被禁止并且不会在以后被调度,直到重新使能.
void tasklet_enable(struct tasklet_struct *t);
//如果这个 tasklet 已经被调度, 它会很快运行. 一个对 tasklet_enable 的调用必须匹配每个对 tasklet_disable 的调用, 因为内核跟踪每个 tasklet 的"禁止次数".
void tasklet_schedule(struct tasklet_struct *t);
//调度 tasklet 执行.一般只运行一次,但可在一个tasklet中再调用,到达多次运行的目的
void tasklet_hi_schedule(struct tasklet_struct *t);
//调度 tasklet 在更高优先级执行.高于一般的tasklet优先级
void tasklet_kill(struct tasklet_struct *t);
//当一个设备正被关闭或者模块卸载时,被调用。若tasklet被调度,则从激活的链表中去掉 tasklet.若tasklet在另一个 CPU 上运行,则阻塞等待tasklet终止.
注意:tasklet是不可中断的,一个tasklet只在一个CPU上运行

7.6. 工作队列
linux/workqueue.h
非共享队列
步骤:
1.创建工作队列
struct workqueue_struct *create_workqueue(const char *name);
struct workqueue_struct *create_singlethread_workqueue(const char *name);
2.创建工作
DECLARE_WORK(name, void (*function)(void *), void *data);
//一个函数搞定定义和初始化
INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);
PREPARE_WORK(struct work_struct *work, void (*function)(void *), void *data);
//要先定义work_struct,再调用这两个函数
//INIT_WORK做更全的初始化,若需要改变工作队列,则用PREPARE_WORK
3.提交工作给一个工作队列
int queue_work(struct workqueue_struct *queue, struct work_struct *work);
int queue_delayed_work(struct workqueue_struct *queue, struct work_struct *work, unsigned long delay);
//返回0,添加成功,非0表明已存在此工作
int cancel_delayed_work(struct work_struct *work);
//返回非0,取消成功,返回0,取消不成功,工作仍在运行
void flush_workqueue(struct workqueue_struct *queue);
//确保cancel_delayed_work调用返回0后,停止运行工作
4.
void destroy_workqueue(struct workqueue_struct *queue);
//用完后删掉工作队列
共享队列
1.创建工作
   同非共享
2.提交工作给一个工作队列
int schedule_work(struct work_struct *work);
int schedule_delayed_work(struct work_struct *work, unsigned long delay);
//
void flush_scheduled_work(void);
//刷新 同flush_workqueue一样

注意:工作队列可休眠


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86768/showart_1680864.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP