当前位置: 首页 > news >正文

福建做网站的公司wordpress标签订阅

福建做网站的公司,wordpress标签订阅,哪里有服务好的深圳网站建设,注册分公司流程及所需资料tasklet#xff08;tasklet#xff0c;有的书中翻译为“任务蕾”#xff09;是基于软中断实现的。为什么要提供tasklet#xff1f;因为tasklet相对软中断有以下优势。 #xff08;1#xff09;软中断的种类是编译时静态定义的#xff0c;在运行时不能添加或删除#x…tasklettasklet有的书中翻译为“任务蕾”是基于软中断实现的。为什么要提供tasklet因为tasklet相对软中断有以下优势。 1软中断的种类是编译时静态定义的在运行时不能添加或删除tasklet可以在运行时添加或删除。 2同一种软中断的处理函数可以在多个处理器上同时执行处理函数必须是可以重入的需要使用锁保护临界区一个tasklet同一时刻只能在一个处理器上执行不要求处理函数是可以重入的。 tasklet根据优先级分为两种低优先级tasklet和高优先级tasklet。tasklet是通过软中断HI_SOFTIRQ和TASKLET_SOFTIRQ实现的所以它们本身也是软中断存放在两个单处理器数据结构tasklet_vec和tasklet_hi_vec会在两个软中断中分别处理。 数据结构 tasklet的数据结构如下 include/linux/interrupt.h struct tasklet_struct {     struct tasklet_struct *next;    //链表中的下一个tasklet     unsigned long state;        //tasklet的状态     atomic_t count;         //禁止计数器     void (*func)(unsigned long);//tasklet处理函数     unsigned long data;     //给tasklet处理函数的参数 }; 成员 next 用来把tasklet添加到单向链表中。 成员 state 是tasklet的状态取值如下。 1 0tasklet没有被调度。 2 (1 TASKLET_STATE_SCHED)tasklet被调度即将被执行。 3 (1 TASKLET_STATE_RUN)只在多处理器系统中使用表示tasklet正在执行。成员 count 是计数 0 表示允许tasklet被执行非零值表示禁止tasklet被执行。成员 func 是处理函数成员 data 是传给处理函数的参数。 每个处理器有两条单向链表低优先级tasklet链表和高优先级tasklet链表。 kernel/softirq.c struct tasklet_head {     struct tasklet_struct *head;     struct tasklet_struct **tail; }; static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec); static DEFINE_PER_CPU(struct tasklet_head, tasklet_hi_vec); 编程接口 定义一个静态的tasklet并且允许tasklet被执行方法如下 DECLARE_TASKLET(name, func, data) 定义一个静态的tasklet并且禁止tasklet被执行方法如下 DECLARE_TASKLET_DISABLED(name, func, data) 在运行时动态初始化tasklet并且允许tasklet被执行方法如下 void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data); 函数 tasklet_disable()用来禁止tasklet被执行如果tasklet正在被执行该函数等待tasklet执行完。 void tasklet_disable(struct tasklet_struct *t); 函数 tasklet_disable_nosync()用来禁止tasklet被执行如果tasklet正在被执行该函数不会等待tasklet执行完。 void tasklet_disable_nosync(struct tasklet_struct *t); 函数 tasklet_enable()用来允许tasklet被执行。 void tasklet_enable(struct tasklet_struct *t); 函数 tasklet_schedule()用来调度低优先级tasklet 把tasklet添加到当前处理器的低优先级tasklet链表中并且触发低优先级tasklet软中断。 void tasklet_schedule(struct tasklet_struct *t); 函数 tasklet_hi_schedule()用来调度高优先级tasklet把tasklet添加到当前处理器的高优先级tasklet链表的尾部并且触发高优先级tasklet软中断。 void tasklet_hi_schedule(struct tasklet_struct *t); 函数 tasklet_hi_schedule_first()用来调度高优先级tasklet把tasklet添加到当前处理器的高优先级tasklet链表的首部并且触发高优先级tasklet软中断。 void tasklet_hi_schedule_first(struct tasklet_struct *t); 函数 tasklet_kill()用来杀死tasklet确保tasklet不会被调度和执行。如果tasklet正在被执行该函数等待tasklet执行完。通常在卸载内核模块的时候调用该函数。 void tasklet_kill(struct tasklet_struct *t); 技术原理 tasklet是基于软中断实现的根据优先级分为两种低优先级tasklet和高优先级tasklet。软中断 HI_SOFTIRQ 执行高优先级tasklet软中断 TASKLET_SOFTIRQ 执行低优先级tasklet。 1调度tasklet。 函数 tasklet_schedule()用来调度低优先级tasklet函数 tasklet_hi_schedule()用来调度高优先级tasklet。以函数 tasklet_schedule()为例说明其代码如下 include/linux/interrupt.h static inline void tasklet_schedule(struct tasklet_struct *t) {     if (!test_and_set_bit(TASKLET_STATE_SCHED, t-state))     __tasklet_schedule(t); } kernel/softirq.c void __tasklet_schedule(struct tasklet_struct *t) {     unsigned long flags;     local_irq_save(flags);     t-next NULL;     *__this_cpu_read(tasklet_vec.tail) t;     __this_cpu_write(tasklet_vec.tail, (t-next));     raise_softirq_irqoff(TASKLET_SOFTIRQ);     local_irq_restore(flags); } 如果tasklet没有被调度过那么首先设置调度标志位然后把tasklet添加到当前处理器的低优先级tasklet链表的尾部最后触发软中断 TASKLET_SOFTIRQ。 2执行tasklet。 初始化的时候把软中断 TASKLET_SOFTIRQ 的处理函数注册为函数 tasklet_action把软中断 HI_SOFTIRQ 的处理函数注册为函数 tasklet_hi_action。 kernel/softirq.c void __init softirq_init(void) {     …     open_softirq(TASKLET_SOFTIRQ, tasklet_action);     open_softirq(HI_SOFTIRQ, tasklet_hi_action); } 以函数 tasklet_action()为例说明其代码如下 kernel/softirq.c 1 static __latent_entropy void tasklet_action(struct softirq_action *a) 2 { 3   struct tasklet_struct *list; 4    5   local_irq_disable(); 6   list __this_cpu_read(tasklet_vec.head); 7   __this_cpu_write(tasklet_vec.head, NULL); 8   __this_cpu_write(tasklet_vec.tail, this_cpu_ptr(tasklet_vec.head)); 9   local_irq_enable(); 10   11   while (list) { 12      struct tasklet_struct *t list; 13       14      list list-next; 15       16      if (tasklet_trylock(t)) { 17          if (!atomic_read(t-count)) { 18              if (!test_and_clear_bit(TASKLET_STATE_SCHED, 19                  t-state)) 20                  BUG(); 21                  t-func(t-data); 22                  tasklet_unlock(t); 23                  continue; 24          } 25          tasklet_unlock(t); 26      } 27       28      local_irq_disable(); 29      t-next NULL; 30      *__this_cpu_read(tasklet_vec.tail) t; 31      __this_cpu_write(tasklet_vec.tail, (t-next)); 32      __raise_softirq_irqoff(TASKLET_SOFTIRQ); 33      local_irq_enable(); 34      } 35 } 第 68 行代码把当前处理器的低优先级tasklet链表中的所有tasklet移到临时链表list 中。 第 11 行代码遍历临时链表 list依次处理每个tasklet如下。 1第 16 行代码尝试锁住tasklet确保一个tasklet同一时刻只在一个处理器上执行。 2第 17 行代码如果tasklet的计数为 0表示允许tasklet被执行。 3第 18 行代码清除tasklet的调度标志位其他处理器可以调度这个tasklet但是不能执行这个tasklet。 4第 21 行代码执行tasklet的处理函数。 5第 22 行代码释放tasklet的锁其他处理器就可以执行这个tasklet了。 6第 2932 行代码如果尝试锁住tasklet失败表示tasklet正在其他处理器上执行或者禁止tasklet被执行那么把tasklet重新添加到当前处理器的低优先级tasklet链表的尾部然后触发软中断 TASKLET_SOFTIRQ。 tasklet的简单用法 下面是tasklet的一个简单应用, 以模块的形成加载。 #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/kdev_t.h #include linux/cdev.h #include linux/kernel.h #include linux/interrupt.h static struct tasklet_struct my_tasklet; static void tasklet_handler (unsigned long data) {     printk(KERN_ALERT tasklet_handler is running.\n); } static int __init test_init(void) {     tasklet_init(my_tasklet, tasklet_handler, 0);     tasklet_schedule(my_tasklet);     return 0; } static void __exit test_exit(void) {     tasklet_kill(my_tasklet);     printk(KERN_ALERT test_exit running.\n); } MODULE_LICENSE(GPL); module_init(test_init); module_exit(test_exit); 从这个例子可以看出所谓的tasklet机制是为下半部函数的执行提供了一种执行机制也就是说推迟处理的事情是由tasklet_handler实现何时执行经由tasklet机制封装后交给内核去处理。
http://www.pierceye.com/news/806110/

相关文章:

  • 花店网站模板免费下载9个做简历的网站
  • 东港区网站制作seo推广模式是什么
  • 用织梦做网站能练技术吗广州专业网络推广公司
  • 下载ppt模板免费的网站在线做头像网站
  • 网络推广怎么免费做网站内部优化的方法
  • 沧州wap网站制作哈尔滨建设网证件查询
  • 一键查询注册过的网站快速排名教程
  • 响应式模板网站泰安招聘信息最新招聘2021
  • 信阳市住房和城乡建设厅网站wordpress加载速度
  • 建设本地网站 配置iis百度h5在线制作免费
  • 网站托管服务器做外贸去哪些网站找老外
  • 一个空间可以做几个网站微信公众号 做不了微网站
  • 嘉兴seo外包公司黄骅seo
  • 做网站录入和查询需求网络推广公司口碑
  • 招远专业做网站公司wordpress获取qq昵称 头像
  • 河北网站建设业务服务称赞的项目管理平台
  • 用jsp做的网站首页如何建立一个网站来卖东西
  • 外贸型网站建设的基本流程宣传型网站建设
  • 济南手机网站开发公司贵阳网络推广公司
  • 网站开发需求模板找网络公司做推广费用
  • 网站推广工具推荐广州公关公司招聘
  • 网站搭建平台源码做健身网站开题报告
  • 大芬网站建设樟树网站开发
  • 北京通州个人网站建设哈尔滨建设工程招投标办公室
  • 怎样开个人网站如何做百度免费推广
  • 深圳成品网站超市佛山网站建设机构
  • 江苏 网站建设第一次做网站做后感
  • wordpress翻译公司网站没事网站建设项目规划书
  • 东莞建设年审网站我的世界充钱网站怎么做
  • 太原网站排名系统电子商务市场营销