任务队列


1 任务队列定义

任务队列其实时一个任务链表:

struct tg_struct{

struct tg_struct *next;

int sync;
void (*routinue) (void *); 调用的函数
void *data;函数参数
}

需要初始化 函数和参数两个字段 ,然后设置 next, sync为NULL;

DECLARE_TASK_QUEUE(name) 申明一个任务队列初始化为空
int queue_task( struct tg_struct * task, task_queue *list);
将任务排入队列中




2 运行
排队进程与任务进程异步执行

当任务队列处于进程上下文之外运行时:
  1. 不允许访问用户空间,因为没有进程上下文,所以没有与某进程关联的用户空间路径信息
  2. current指针无效
  3. 不能执行睡眠或调度,(schedule,sleep on),也不能使用引起睡眠的函数(kmalloc, 信号量)
3 预定义任务队列
  1. 调度程序队列:它运行在进程上下文,该队列由keventd管理,schedule_task访问。
  2. tg_timer: 该队列有定时器处理程序运行,do_timer 和该任务都在中断期间运行
  3. tg_immediate:是系统调用返回时或者调度程序运行时立即得到处理的。中断期间运行
DECLARE_TASK_QUEUE_HEAD(jiq_wait);
struct tg_struct jiq_task;
jiq_task.routine = jiq_print_tq;
jiq_task.data = (void*) &jiq_data;

int jia_read_sched( char *buf, char **start, off_t offset, int len, int *eof, void *data)
{
jiq_data.len = 0;
jiq_data.buf = buf;
jiq_data.jiffies = jiffies;;

jiq_data.queue = SCHEDULE_QUEUE;

schedule_task(&jiq_task);
intteruptible_sleep_on( &jiq_wait);

*eof = 1;
return jiq_data.len;


}









运行自己的任务队列
任务队列需要程序员自己维护,并且决定什么时候运行


tasklet:底半部处理程序的首选方法
中断期间运行,即使被调度多次,也只运行一次


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值