发布时间:2013-01-04 14:07:01
延迟可以分为长延迟和短延迟,但其划分界限并不是很清晰,一般把涉及多个时钟滴答的延迟称为长延迟;在内核中有很多方法实现延迟操作,但有些方法并不可取,像忙等待;所以这里只记录那些不错的方案。 1 长延迟 对于长延迟,可以使用等待队列机制来实现,内核提供的接口如下: #include <linux/wait.h> long wait_event_timeout(wait_queue_head_t, condition, long timeout); /* 休眠时不可中断 */ long wait_event_interrupti......【阅读全文】
发布时间:2013-01-04 14:06:41
1 定时器用途 内核定时器用于在未来的指定时间点上执行某个函数;如果添加定时器时,指定的时间比系统时间要早,那么,系统将会在下一个"滴答“启动该定时器。 2 使用定时器注意事项 内核定时器基本上会在"软件中断"上下文中运行,所以定时器函数要注意以原子地运行;且定时器始终会在调度它的同一CPU上运行。另外需要遵守以下规则:* 不允许访问用户空间;* 不允许访问current指针;* 不能执行休眠或调度。 所有处于进程上下文之外的程序都要遵守这些规则。 3 内核环境判断 内核提供两个API来判断中断......【阅读全文】
发布时间:2013-01-04 14:00:16
1 "工作队列"用途 工作队列用途跟tasklet相似,在中断处理时将一些非紧急的任务留到工作队列中完成,而紧急的任务则在硬中断服务程序中完成。 但工作队列与tasklet还是有很大的区别: 1)工作队列函数在一个特殊内核进程的上下文中运行; 2)tasklet会在很短的时间段内很快执行,且以原子模式执行; 而工作队列函数具有更长的延迟并且不需要原子模式; 3)工作队列函数可以休眠;2 "工作队列"结构 注意:在2.6.20之后,工作队列的数据结构发生了不少变化,这里列出的接口与数据结构是基于3.......【阅读全文】