任务队列

本文深入探讨了任务队列的定义、初始化、运行机制及预定义任务队列的特点,包括调度程序队列、tg_timer 和 tg_immediate 等。详细解释了任务队列如何在不同上下文中的执行特性,以及如何通过特定函数实现任务的添加与调度。重点介绍了自定义任务队列的管理方式,以及任务队列在实际应用中的角色,特别强调了任务队列在中断期间运行的任务let的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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:底半部处理程序的首选方法
中断期间运行,即使被调度多次,也只运行一次


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值