Linux--workqueue之初始化

本文详细介绍了Linux工作队列的两步初始化过程:分配数据结构和系统工作队列,以及初始化worker_pool和worker。首先,通过workqueue_init_early函数设置CPU池,分配内存并创建默认的工作队列。然后,通过workqueue_init函数创建初始worker,绑定CPU,并唤醒工作线程以执行任务。整个过程确保了工作队列系统的正确启动和运行。
摘要由CSDN通过智能技术生成

1:初始化第一步:分配各项数据结构及系统workqueue
/**

  • workqueue_init_early - early init for workqueue subsystem

  • This is the first half of two-staged workqueue subsystem initialization

  • and invoked as soon as the bare basics - memory allocation, cpumasks and

  • idr are up. It sets up all the data structures and system workqueues

  • and allows early boot code to create workqueues and queue/cancel work

  • items. Actual work item execution starts only after kthreads can be

  • created and scheduled right before early initcalls.
    /
    int __init workqueue_init_early(void)
    /
    initialize CPU pools /
    for_each_possible_cpu(cpu) //每个cpu
    for_each_cpu_worker_pool(pool, cpu) //每个cpu的worker_pool
    init_worker_pool(pool)

    pool->flags |= POOL_DISASSOCIATED; //worker_pool未链接标记

    pool->refcnt = 1;
    /
    shouldn’t fail above this point */
    pool->attrs = alloc_workqueue_attrs(GFP_KERNEL);

     	pool->cpu = cpu;
     	cpumask_copy(pool->attrs->cpumask, cpumask_of(cpu));
     	pool->attrs->nice = std_nice[i++];
     	pool->node = cpu_to_node(cpu);
     	worker_pool_assign_id(pool)
     		ret = idr_alloc(&worker_pool_idr, pool, 0, WORK_OFFQ_POOL_NONE, GFP_KERNEL);
     		pool->id = ret
    

    /* create default unbound and ordered wq attrs */
    for (i = 0; i < NR_STD_WORKER_POOLS; i++) //system中各有2个,分普通级和优先级

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值