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

莒县网站制作网站备案 新增接入

莒县网站制作,网站备案 新增接入,伪原创对网站的影响,沈阳营销型网站建设引用preempt宋宝华#xff1a; 是谁关闭了Linux抢占#xff0c;而抢占又关闭了谁#xff1f;Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十#xff09;内核抢占实现(preempt)Linux中的preempt_count - 知乎 (zhihu.com)linux 中断子系统… 引用preempt宋宝华 是谁关闭了Linux抢占而抢占又关闭了谁Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十内核抢占实现(preempt)Linux中的preempt_count - 知乎 (zhihu.com)linux 中断子系统 - linux 内核中的上下文判断 - 知乎 (zhihu.com)softirqlinux kernel的中断子系统之八softirqLinux Interrupt - 魅族内核团队sofirq和tasklet - LoyenWangtaskletlinux kernel的中断子系统之九tasklet高并发的中断下半部tasklet实例解析workqueueLinux Workqueue- 魅族内核团队Concurrency Managed Workqueue - wowoLinux中断子系统四-Workqueue - LoyenWang任务工厂 - Linux 中的 workqueue 机制 [一] - 知乎 (zhihu.com)Linux Workqueue 机制分析 - 博客 - binsite (binss.me)Linux中断管理 (3)workqueue工作队列 - ArnoldLu - 博客园 (cnblogs.com)timerLinux时间子系统之二软件架构Linux kernel之内核定时器Linux内核定时器和工作队列的总结和实例Linux内核高精度定时器hrtimer的使用Linux 应用层的时间编程硬件和 GLibC 库的细节Linux 内核的工作 - timerLinux 内核的工作-hrtimer一. 为什么要有上下半部中断分成上下半部处理可以提高中断的响应能力在上半部处理完成后便将cpu中断打开通常上半部处理越快越好这样就可以响应其他中断了等到中断退出的时候再进行下半部的处理。二. preempt_counttask_struct结构体中的thread_info.preempt_count用于记录当前任务所处的context状态PREEMPT_BITS用于记录禁止抢占的次数禁止抢占一次该值就加1使能抢占该值就减1SOFTIRQ_BITS用于同步处理关掉下半部的时候加1打开下半部的时候减1HARDIRQ_BITS用于表示处于硬件中断上下文中in_softirq和in_serving_softirq都表示处于softirq上下文但并不意味着程序正在执行软中断区别是 in_serving_softirq表示 当前一定有软中断处于执行状态。(bit8 - SOFTIRQ_OFFSET)in_softirq 除了可以表示当前有软中断处于执行状态还有可能表示当前的context只是disable软中断的thread上下文。(例如local_bh_disable()下的context)中断上下文 - interrupt context我们将 NMI, HARDIRQ, SOFTIRQ 上下文 统称为中断上下文。可用 in_interrupt() 判断进程上下文 - process context与中断上下文相对应。可用 in_task() 判断原子上下文 - atomic context不能发生进程睡眠或者调度的上下文。处于中断上下文或者显示地禁止了调度preempt_count()的值都不为0都不允许睡眠/调度的发生这两种场景被统称为atomic上下文。可用 in_atomic() 来判断当前cpu是否处于atomic上下文。也就是非 preempt_count 非 0 时都属于 atomic 上下文其中包括中断、软中断等中断上下文还包括进程或者内核线程运行时关中断或者关抢占。由于该接口在有些场景下不能精确检测所以 不推荐在driver中使用。三种上下文的关系三. softirqsoftirq是静态的不支持动态分配。相关数据结构/* 支持的软中断类型可以认为是软中断号 其中从上到下优先级递减 */ enum {HI_SOFTIRQ0, /* 最高优先级软中断 */TIMER_SOFTIRQ, /* Timer定时器软中断 */NET_TX_SOFTIRQ, /* 发送网络数据包软中断 */NET_RX_SOFTIRQ, /* 接收网络数据包软中断 */BLOCK_SOFTIRQ, /* 块设备软中断 */IRQ_POLL_SOFTIRQ, /* 块设备软中断 */TASKLET_SOFTIRQ, /* tasklet软中断 */SCHED_SOFTIRQ, /* 进程调度及负载均衡的软中断 */HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on thenumbering. Sigh! */RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq RCU相关的软中断 */NR_SOFTIRQS };/* 软件中断描述符只包含一个handler函数指针 */ struct softirq_action {void (*action)(struct softirq_action *); };/* 软中断描述符表实际上就是一个全局的数组 */ static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;/* CPU软中断状态描述当某个软中断触发时__softirq_pending会置位对应的bit */ typedef struct {unsigned int __softirq_pending;unsigned int ipi_irqs[NR_IPI]; } ____cacheline_aligned irq_cpustat_t;/* 每个CPU都会维护一个状态信息结构 */ irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;/* 内核为每个CPU都创建了一个软中断处理内核线程 */ DEFINE_PER_CPU(struct task_struct *, ksoftirqd);数据结构关系图softirq_vec[]数组类比硬件中断描述符表irq_desc[]通过软中断号可以找到对应的handler进行处理比如图中的tasklet_action就是一个实际的handler函数软中断可以在不同的CPU上并行运行在同一个CPU上只能串行执行即软中断不保证重入问题每个CPU维护irq_cpustat_t状态结构当某个软中断需要进行处理时会将该结构体中的__softirq_pending字段或上1UL XXX_SOFTIRQ软中断的触发点raise_softirq()/raise_softirq_irqoff() 会设置当前本地cpu的irq_stat中的 __softirq_pending字段并将相应的软中断号置位即表明该软中断有处理请求。软中断执行点中断处理后bottom-half enable后思考为什么在使能Bottom-half时要进行软中断处理呢》在并发处理时可能已经把Bottom-half进行关闭了如果此时中断来了后软中断不会被处理在进程上下文中打开Bottom-half时这时候就会检查是否有软中断处理请求了四. tasklettasklet是软中断的一种类型那么两者有啥区别呢软中断类型内核中都是静态分配不支持动态分配而tasklet支持动态和静态分配也就是驱动程序中能比较方便的进行扩展软中断可以在多个CPU上并行运行因此需要考虑可重入问题而tasklet会绑定在某个CPU上运行运行完后再解绑不要求重入问题当然它的性能也就会下降一些DEFINE_PER_CPU(struct tasklet_head, tasklet_vec)为每个CPU都分配了tasklet_head结构该结构用来维护struct tasklet_struct链表需要放到该CPU上运行的tasklet将会添加到该结构的链表中内核中为每个CPU维护了两个链表tasklet_vec和tasklet_vec_hi对应两个不同的优先级本文以tasklet_vec为例struct tasklet_struct为tasklet的抽象几个关键字段如图所示通过next来链接成链表通过state字段来标识不同的状态以确保能在CPU上串行执行func函数指针在调用task_init()接口时进行初始化并在最终触发软中断时执行接口/* 静态分配tasklet */ DECLARE_TASKLET(name, func, data)/* 动态分配tasklet */ void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);/* 禁止tasklet被执行本质上是增加tasklet_struct-count值以便在调度时不满足执行条件 */ void tasklet_disable(struct tasklet_struct *t);/* 使能tasklet与tasklet_diable对应 */ void tasklet_enable(struct tasklet_struct *t);/* 调度tasklet通常在设备驱动的中断函数里调用 */ void tasklet_schedule(struct tasklet_struct *t);/* 杀死tasklet确保不被调度和执行 主要是设置state状态位 */ void tasklet_kill(struct tasklet_struct *t)五. workqueue/delay wrokqueuelinux workqueue机制有多个woker 线程有多个worker_pool管理多个worker。针对bound绑定类型的工作队列worker_pool是Per-CPU创建每个CPU都有两个worker_pool对应不同的优先级nice值分别为0和-20针对un-bound非绑定类型的工作队列worker_pool创建后会添加到unbound_pool_hash哈希表中每个worker_pool至少有一个worker。worker内核线程是在每个worker_pool中由一个初始的空闲工作线程创建的并根据需要动态创建和销毁;create_worker函数中创建的内核线程名字为kworker/XX:YY或者kworker/uXX:YY其中XX表示worker_pool的编号YY表示worker的编号u表示unboundbound和un-bound workqueue的区别bound绑定处理器的工作队列其会被bound的worker_pool服务该worker_pool创建的worker内核线程会被绑定到特定的CPU上运行unbound不绑定处理器的工作队列其会被un-bound的worker_pool服务创建的时候需要指定WQ_UNBOUND标志内核线程可以在处理器间迁移何时创建更多的worker内核线程执行worker_thread函数时如果没有空闲的worker会调用manage_workers接口来创建更多的worker来处理工作何时销毁多余的worker一个worker被创建后首先进入worker_enter_idle()里面启动了pool-idle_timer定时IDLE_WORKER_TIMEOUT即300HZ。如果一个worker进入idle超过300HZ即会执行idle_worker_timeout()会根据情况进行销毁多余的worker。如何解决一个work阻塞或者死锁了导致其他的work得不到执行即各种work之间的互相影响在worker线程执行时会尝试进行worker_pool管理工作即会检查worker_pool中是否有至少一个idle状态的worker如果没有则创建一个新的worker。系统每100ms启动pool-mayday_timer定时器检查当前workerpool中是否存在allocation deadlock异常如果指定了WQ_MEM_RECLAIM则会启动rescuer worker 进行处理。管理worker_pool的内核线程池时如果有PENDING状态的work并且发现没有正在运行的工作线程(worker_pool-nr_running 0)唤醒空闲状态的内核线程或者动态创建内核线程如果work已经在同一个worker_pool的其他worker中执行不再对该work进行处理防重入处理schedule_work 是如何工作的schedule_work完成的工作是将work添加到对应的链表中而在添加的过程中首先是需要确定pool_workqueuepool_workqueue对应一个worker_pool因此确定了pool_workqueue也就确定了worker_pool进而可以将work添加到工作链表中pool_workqueue的确定分为三种情况bound类型的工作队列直接根据CPU号获取可指定cpu如果没有指定则用当前cpu。unbound类型的工作队列根据node号获取针对unbound类型工作队列pool_workqueue的释放是异步执行的需要判断refcnt的计数值因此在获取pool_workqueue时可能要多次retry根据缓存热度优先选择正在被执行的worker_pool所以指定了cpu也不一定生效WORK_STRUCT_PENDING_BIT何时被设置以及被清0?当一个work已经加入到workqueue队列中schedule_work()-queue_work()-queue_work_on()时被设置。当一个work在工作线程里马上要执行(即执行work之前)worker_thread()-process_on_work()-set_work_pool_and_clear_pend是清0。上述设置和清0都是在关闭本地中断情况下执行的。如何判断一个workqueue中的work已经全部执行完成添加一个flush work到对应的workqueue中如果该flush work都已经被执行了那它之前的work也应该被执行完成了。如何指定一个work跑到特定的cpu上寻找合适的pool_workqueue优先选择本地CPU对应的pool_workqueue如果该work正在另一个CPU工作线程池中运行则优先选择此工作线程池。如果一个work正在上一次的worker_pool中执行则本次work也会被放到上次执行的worker_pool中是为了利用缓存提高效率。 (即work_queue_on() 不一定能够指定运行的cpu。)如何指定一个workqueue中不同work被同时执行的个数判断当前pool_workqueue的work活跃数量如果少于最高限值就加入pending状态链表worker_pool-worklist,否则加入delayed_works链表中。如果一个worker_pool中的worker要进入睡眠了如何保证其余的work能够被执行在__schedule() 函数中会进行处理。当一个工作线程要被调度器换出时调用wq_worker_sleeping()看看是否需要唤醒同一个线程池中的其它内核线程。workqueue lockup机制是怎么样的会用一个timer 检查一个work执行了 30s都没有退出就会大于warning log。WQ_MEM_RECLAIM 标志表示什么意思创建工作队列时如果设置了WQ_MEM_RECLAIM标志则会新建rescuer worker对应rescuer_thread内核线程。目的是当内存紧张时新创建worker可能会失败这时候由rescuer来处理这种情况数据结构work_struct工作队列调度的最小单位work itemworkqueue_struct工作队列work item都挂入到工作队列中workerwork item的处理者每个worker对应一个内核线程worker_poolworker池内核线程池是一个共享资源池提供不同的worker来对work item进行处理pool_workqueue充当桥梁纽带的作用用于连接workqueue和worker_pool建立链接关系六. timer
http://www.w-s-a.com/news/883530/

相关文章:

  • 如何设计网站logohtml5开发
  • 金坛建设银行总行网站网站开发费用如何记账
  • 贵阳企业网站设计制作湛江知名网站建设电话
  • 网站建设安全性高清效果图网站
  • 上海网站排名推广黄山公司做网站
  • 全国网站建设公司实力排名单页面网站建设
  • 网站建设方案 规划wordpress 要备案吗
  • 一个完整的网站 技术网站建设中 敬请期待.
  • 如何建一个公司的网站网上怎么推广公司产品
  • 十大旅游电子商务网站影楼网站制作
  • 深圳网站建设代理商网业打开慢的原因
  • 旅游网站经营模式在屈臣氏做网站运营
  • 做管理信息的网站com域名查询
  • 免费推广网站推荐外贸推广平台哪个好
  • 腾宁科技做网站399元全包企业校园网站建设
  • 海外医疗兼职网站建设公司取名字大全免费
  • 龙口市规划建设局网站vi设计和品牌设计的区别
  • 企业网站的总体设计网站建设评审验收会议主持词
  • 网站建设完成推广响应式网站设计开发
  • 电商网站用php做的吗网站开发流程可规划为那三个阶段
  • flash网站怎么做音乐停止深圳网站建设金瓷网络
  • 哪个网站可以做房产信息群发怎么做国内网站吗
  • 微商城网站建设公司的价格卖磁铁的网站怎么做的
  • 免费做做网站手机平台软件开发
  • 网站单页做301徐州百度网站快速优化
  • 织梦怎么制作手机网站漳州专业网站建设公司
  • 邓州做网站网络优化概念
  • 查看网站开发phonegap wordpress
  • 网站建设和维护待遇怎样c 做的网站又哪些
  • 淮南网站推广网站开发行业前景