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

一台虚拟主机能建设几个网站龙口建网站首选公司

一台虚拟主机能建设几个网站,龙口建网站首选公司,做网站的图片尺寸怎么设定,网站开发需要什么费用文章系列 1.linux工作队列 - workqueue总览 2.linux工作队列 - workqueue_struct创建 3.linux工作队列 - 把work_struct加入工作队列 4.linux工作队列 - work_struct被调用过程 把work_struct加入工作队列 把work_struct加入到工作队列workqueue的API在系列文章1有介绍&a…

文章系列

1.linux工作队列 - workqueue总览
2.linux工作队列 - workqueue_struct创建
3.linux工作队列 - 把work_struct加入工作队列
4.linux工作队列 - work_struct被调用过程

把work_struct加入工作队列

把work_struct加入到工作队列workqueue的API在系列文章1有介绍,这些API虽然用法不一,但是最终都会调用__queue_work()函数来进行实际加入操作,比如API:queue_work_on:

bool queue_work_on(int cpu, struct workqueue_struct *wq,struct work_struct *work)
{bool ret = false;unsigned long flags;local_irq_save(flags);if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) {__queue_work(cpu, wq, work);------调用到__queue_workret = true;}local_irq_restore(flags);return ret;
}

下面分析__queue_work的代码,如下:

static void __queue_work(int cpu, struct workqueue_struct *wq,struct work_struct *work)
{struct pool_workqueue *pwq;struct worker_pool *last_pool;struct list_head *worklist;unsigned int work_flags;unsigned int req_cpu = cpu;/** While a work item is PENDING && off queue, a task trying to* steal the PENDING will busy-loop waiting for it to either get* queued or lose PENDING.  Grabbing PENDING and queueing should* happen with IRQ disabled.*/WARN_ON_ONCE(!irqs_disabled());debug_work_activate(work);/* if draining, only works from the same workqueue are allowed */if (unlikely(wq->flags & __WQ_DRAINING) &&WARN_ON_ONCE(!is_chained_work(wq)))return;
retry:if (req_cpu == WORK_CPU_UNBOUND)cpu = wq_select_unbound_cpu(raw_smp_processor_id());//根据传入的参数struct workqueue_struct *wq来选择需要的类型/* pwq which will be used unless @work is executing elsewhere */if (!(wq->flags & WQ_UNBOUND))pwq = per_cpu_ptr(wq->cpu_pwqs, cpu);----------------得到bound类型的pool_workqueue elsepwq = unbound_pwq_by_node(wq, cpu_to_node(cpu));-----得到unbound类型的pool_workqueue /** If @work was previously on a different pool, it might still be* running there, in which case the work needs to be queued on that* pool to guarantee non-reentrancy.*///work有可能已经存在另一个不同的work pool中,它可能仍旧在运行,为了避免重入,work仍然要加入到原来的work poollast_pool = get_work_pool(work);if (last_pool && last_pool != pwq->pool) {struct worker *worker;spin_lock(&last_pool->lock);worker = find_worker_executing_work(last_pool, work);if (worker && worker->current_pwq->wq == wq) {pwq = worker->current_pwq;----------------------得到last的pool_workqueue} else {/* meh... not running there, queue here */spin_unlock(&last_pool->lock);spin_lock(&pwq->pool->lock);}} else {spin_lock(&pwq->pool->lock);}/** pwq is determined and locked.  For unbound pools, we could have* raced with pwq release and it could already be dead.  If its* refcnt is zero, repeat pwq selection.  Note that pwqs never die* without another pwq replacing it in the numa_pwq_tbl or while* work items are executing on it, so the retrying is guaranteed to* make forward-progress.*/if (unlikely(!pwq->refcnt)) {if (wq->flags & WQ_UNBOUND) {spin_unlock(&pwq->pool->lock);cpu_relax();goto retry;}/* oops */WARN_ONCE(true, "workqueue: per-cpu pwq for %s on cpu%d has 0 refcnt",wq->name, cpu);}/* pwq determined, queue */trace_workqueue_queue_work(req_cpu, pwq, work);if (WARN_ON(!list_empty(&work->entry))) {spin_unlock(&pwq->pool->lock);return;}pwq->nr_in_flight[pwq->work_color]++;work_flags = work_color_to_flags(pwq->work_color);if (likely(pwq->nr_active < pwq->max_active)) {trace_workqueue_activate_work(work);pwq->nr_active++;worklist = &pwq->pool->worklist;----------------得到pool_workqueue的worker_pool的worklistif (list_empty(worklist))pwq->pool->watchdog_ts = jiffies;} else {work_flags |= WORK_STRUCT_DELAYED;worklist = &pwq->delayed_works;}insert_work(pwq, work, worklist, work_flags);-----把work加入到worklist,并唤醒spin_unlock(&pwq->pool->lock);
}

看函数insert_work代码:

static void insert_work(struct pool_workqueue *pwq, struct work_struct *work,struct list_head *head, unsigned int extra_flags)
{struct worker_pool *pool = pwq->pool;/* we own @work, set data and link */set_work_pwq(work, pwq, extra_flags);list_add_tail(&work->entry, head);---------------加入work pool的链表get_pwq(pwq);/** Ensure either wq_worker_sleeping() sees the above* list_add_tail() or we see zero nr_running to avoid workers lying* around lazily while there are works to be processed.*/smp_mb();if (__need_more_worker(pool))wake_up_worker(pool);----------------------唤醒work pool
}
http://www.yayakq.cn/news/689855/

相关文章:

  • 江苏省城乡建设厅网站淘宝网站怎么建设
  • python个人网站开发信息流优化师工作内容
  • 做网站对企业有什么好处河南网络洛阳网站建设河南网站建设
  • 襄阳专业网站建设广州白云做网站的公司
  • 单位网站建设费算无形资产吗网站建设 步骤
  • 机械行业营销型网站网站建立价格
  • 腾讯官方网站建设广州网站建设制作价格
  • 三网合一网站汕头网站专业制作
  • 南宁网站建设业务员wordpress权限ip
  • 可以用腾讯企业邮箱域名做网站便宜的营销型网站建设
  • 茂名企业网站建设开发安徽做网站电话
  • 做头像的网站深圳营销型网站建设推广服务
  • 哪个网站可以做加工网站建设引擎
  • 唐山做网站企业网络营销常用工具有哪些?
  • 北京做企业网站多少钱wordpress4.9安装出错
  • 毕业设计(论文)-基于cms的校园网站建设js获取网站html
  • win7建网站教程vue做门户网站
  • 双德网站建设外贸网站建设谷歌推广
  • 建一个资源网站赚钱吗外国网站在中国做推广
  • 网站是先解析后备案wordpress 过滤get值
  • 网站内页制作做网站需要什么系统
  • 专门做男装的网站wordpress 不同文章不同模板
  • 学做网站看那个网内江网站建设
  • 中小型网站建设哪家好服务哪家好中医小程序定制
  • wordpress 头部引入jswordpress seo什么意思
  • 长沙天津网站建设移动网站开发与维护
  • 郧阳网站建设百度资源搜索平台官网
  • 网站动态添加广告怎么做的福州有网站建设的公司
  • 南昌有做网站的吗可以免费建设网站吗
  • 重庆建网站 私单巢湖市建设工程网站