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 运行
排队进程与任务进程异步执行
当任务队列处于进程上下文之外运行时:
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)
{
void (*routinue) (void *); 调用的函数
void *data;函数参数
}
需要初始化 函数和参数两个字段 ,然后设置 next, sync为NULL;
DECLARE_TASK_QUEUE(name) 申明一个任务队列初始化为空
int queue_task( struct tg_struct * task, task_queue *list);
将任务排入队列中
2 运行
排队进程与任务进程异步执行
当任务队列处于进程上下文之外运行时:
- 不允许访问用户空间,因为没有进程上下文,所以没有与某进程关联的用户空间路径信息
- current指针无效
- 不能执行睡眠或调度,(schedule,sleep on),也不能使用引起睡眠的函数(kmalloc, 信号量)
- 调度程序队列:它运行在进程上下文,该队列由keventd管理,schedule_task访问。
- tg_timer: 该队列有定时器处理程序运行,do_timer 和该任务都在中断期间运行
- tg_immediate:是系统调用返回时或者调度程序运行时立即得到处理的。中断期间运行
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:底半部处理程序的首选方法
中断期间运行,即使被调度多次,也只运行一次
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:底半部处理程序的首选方法
中断期间运行,即使被调度多次,也只运行一次