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

360网站优化自微网站首页

360网站优化,自微网站首页,慈溪做网站公司哪家好,私密浏览器免费版在线看为什么要有下半部分 中断会打断其他程序#xff0c;为了打断其他程序时间短#xff0c;就需要中断处理程序快。执行中断处理程序后#xff0c;相同中断不会触发#xff0c;甚至所有中断都不能触发#xff08;设置IRQF_DISABLED#xff0c;其他硬件与操作系统无法通信)中…为什么要有下半部分 中断会打断其他程序为了打断其他程序时间短就需要中断处理程序快。执行中断处理程序后相同中断不会触发甚至所有中断都不能触发设置IRQF_DISABLED其他硬件与操作系统无法通信)中断上下文下不能阻塞 所以将中断分为上下部分上部分处理反应很快的部分下半部分处理对时间要求宽松的事件。 上半部分需要处理硬件比如将网卡接收的数据包复制到操作系统的缓存区。 上半部分保证不被中断。 其他所有都放在下部分。 下半部分的运行时机 通常下半部分在中断处理程序一返回就会马上运行下半部分执行的关键是它们运行时允许中断。 如果我们需要在一段时间后允许我们可以使用内核定时器实现下半部分的任务。 内核提供的下半部分的实现方式 现在能用的有软中断tasklet工作队列。 软中断 软中断使用较少相对于tasklet但是tasklet是基于软中断实现的。 软中断是在编译期间静态分配的不像tasklet那样能动态地注册或者注销。 内核可以注册32个软中断而当前内核版本只注册了9个。 软中断结构体 struct softirq_action{void (*action)(struct softirq_action*); }; 内核中的全局变量 static struct softirq_action softirq_vec[NR_SOFTIRQS];//32个软中断 软中断处理函数action函数原型 void softirq_handler(struct softirq_action *);当只有一个处理器上一个软中断不会抢占另一个软中断唯一可以抢占软中断的是中断处理程序。不过软中断可以在不同处理器上执行。 触发软中断 一个注册的软中断只有在标记后才会执行中断处理程序会在返回前标记它的软中断使其在稍后执行。 在下列地方会遍历寻找待处理的软中断并且执行 从中断处理程序返回后在ksoftirqd内核线程中在那些主动执行检查软中断的代码中 具体代码 u32 pending; pendinglocal_softirq_pending(); if(pending){ struct softirq_action *h; set_softirq_pending(0); hsoftirq_vec;do{if(pending 1)h-action(h);h;pending1;}while(pending); }是执行do_softirq()通过将宏local_softirq_pending()的返回值保存到局部变量pending它是一个32位的位图如果第n位设置为1则执行n位的软中断处理程序。重置宏为全0依次遍历位图遇到1则执行相应的软中断处理程序。 使用软中断 软中断保留给系统中对时间最敏感最严格的下半部分使用。目前只有两个子系统网络和SCSI直接使用软中断。此外内核定时器和tasklet都是建立在软中断上的。相比之下tasklet可以动态生成使用更方便。 分配索引 软中断有32位因为do_softirq()是从下到大的遍历位图所以小的索引会在大的索引之前执行索引具有优先级。 tasklet优先级软中断描述HI_SOFTIRQ0优先级高的taskletTIMER_SOFTIRQ1定时器的下半部NET_TX_SOFTIRQ2发送网络数据包NET_RX_SOFTIRQ3接收网络数据包BLOCK_SOFTIRQ4BLOCK装置TASKLET_SOFTIRQ5正常优先级的taskletSCHED_SOFTIRQ6调度程序HRTIMER_SOFTIRQ7高分辨率定时器RCU_SOFTIRQ8RCU锁定 注册软中断处理程序 open_softirq(NET_TX_SOFTIRQ,net_t_action);//网络子系统注册自己的软中断处理函数。 有两个参数第一个是索引号第二个是处理函数。 触发软中断 raise_softirq(NET_TX_SOFTIRQ);//将中断号为2的网络发送标志设置为1 在do_softirq()中会触发其函数net_t_action(); tasklet 只在高频率使用软中断大多数情况使用tasklet。 tasklet本质上也是软中断只不过同一个处理程序的多个实例不能在多处理器上同时运行。所以软中断需要考虑多个处理器同时运行软中断执行函数。而tasklet不需要考虑并发问题。 struct tasklet_struct {struct tasklet_struct *next; //链表下一个unsigned long state; //状态atomic_t count; //引用计数void (*func)(unsigned long); //核心处理函数unsigned long data; //给func的参数 }state状态有0,TASKLET_STATE_SCHED已被调度,TASKLET_STATE_RUN正在运行只在多处理器上使用 每个tasklet都存放在两个链表中的其一: tasklet_vec(普通tasklet),tasklet_hi_vec(高优先级tasklet). 创建tasklet 静态创建 DECLARE_TASKLET(tasklet_name,tasklet_func,tasklet_data); tasklet不能睡眠所以不能使用阻塞信号量等。 两个相同的tasklet绝不会在多个处理器上同时执行这点和软中断不同 tasklet的调度tasklet_schedule()或者tasklet_hi_schdule()高优先级tasklet; tasklet_schedule执行步骤 检查tasklet的状态如果不是0直接返回。调用_tasklet_schedule()将tasklet状态设置为scheduled。保存中断状态禁止本地中断。把需要调度的tasklet加到每个处理器的tasklet_vec链表表头。将软中断的TASKLET_SOFTIRQ(5)设置为1这样下次do_softirq()会执行这个tasklet。恢复中断中断返回会触发do_softirq() ) tasklet的执行 do_softirq()检测到位图的TASKLET_SOFTIRQ为1则执行tasklet_action(). tasklet_action(): 此时处于禁止中断的状态因为do_softirq()禁止中断并且为当前处理器检查tasklet_vec链表检索完后清楚tasklet_vec链表。允许中断执行下半部分执行每一个待处理的tasklet。如果是多处理器每个处理器都会检查tasklet是否为TASKLET_STATE_RUN状态其他处理器已经运行了如果正在其他处理器上运行那么就不运行了。将tasklet状态改为TASKLET_STATE_RUN.执行func函数tasklet数据结构中的清楚tasklet的状态。运行下一个tasklet直到结束。 工作队列 当需要睡眠时那么就使用工作队列。 将工作推后交由一个内核进程去执行在进程上下文中执行。
http://www.w-s-a.com/news/378295/

相关文章:

  • 营销型网站建设营销型网站建设手机网站设计需要学什么
  • 在线视频网站 一级做爰片南通网站建设找哪家
  • 网站优化文章东莞专业网站建设价钱
  • 哈尔滨网页设计网站模板泰兴建设局网站
  • 响应式网站设计公司报纸做垂直门户网站
  • 陕西旭泽建设有限公司网站企业网站建设软件需求分析
  • 上海公司网站建设方案中企动力西安分公司
  • dedecms网站后台怎样才能上百度
  • 云互联的网站名字亚马逊雨林生物
  • 电商网站功能企查查企业信息查询网
  • 特色网站建设中国住房和城乡建设局官网
  • 长春市住房城乡建设厅网站做白酒网站
  • 自己的网站怎么做的成品免费ppt网站
  • 番禺区网站建设哪里有泰安公司
  • 网站制作详细过程网站开发最强工具
  • 孟村县做网站长春城投建设投资有限公司网站
  • 国家重大建设项目库网站wordpress安装 var
  • 供求信息网站建设报价网站制作 苏州
  • 动漫建模代做网站百度一下wordpress nginx 固定链接
  • 广州网站开发网络公司网站建设的书
  • php手机网站开发教程家政网站怎么做
  • 视频网站的建设预算通信科技网站设计
  • 糖果网站建设策划书淘宝客网站开源
  • 建站公司还有前途吗cf网站编程
  • 网站建设需求确认表建站工具 比较
  • 刚建设的网站多久能在百度查到考试系统 微网站是什么样的
  • 商城网站建设高端企业网站建设劣势
  • 网站建设征集通讯员的通知seo推广外包
  • 微信公众号微网站建设专业网站建设出售
  • 怎么用wordpress建立自己的网站加强校园网站建设