学习
实践
活动
专区
工具
TVP
写文章
  • 广告
    关闭

    618夏日盛惠

    2核2G云服务器首年95元,GPU云服务器低至9.93元/天,还有更多云产品低至0.1折…

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解Go调度原理和实现

    该函数主要有以下步骤: 计算当前真正p的数量nprocs,初始化保存所有p的全局变量allp,allp为一个切片,它里面保存的对象为*p类型,利用make初始化allp. 将m0和allp[0]互相绑定,并将allp[0]状态设置为_Prunning 将allp[1:nprocs]中的p放入到全局变量sched的pidle空闲队列中 上述步骤描述的是最基本的情况,即没有通过 ) if nprocs <= int32(cap(allp)) { // 调整allp的len为nprocs, allp的cap不变 allp = allp[:nprocs] } else copy(nallp, allp[:cap(allp)]) // 将allp替换为新创建的切片nallp allp = nallp } unlock(&allpLock) } allp[0](与m0绑定的p)之外的所有的p放入到空闲链表中 for i := nprocs - 1; i >= 0; i-- { p := allp[i] // 如果当前的p是allp[0

    37210

    详解Go语言调度循环源码实现

    )) { lock(&allpLock) if nprocs <= int32(cap(allp)) { allp = allp[:nprocs] } else { nallp := make([]*p, nprocs) copy(nallp, allp[:cap(allp)]) allp = nallp } unlock(&allpLock) } () // 不能释放 p 本身,因为他可能在 m 进入系统调用时被引用 } // 释放完 P 之后重置allp的长度 if int32(len(allp)) ! P 状态设置为 _Pdead; 通过截断改变全局变量 allp 的长度保证与期望处理器数量相等; 遍历 allp 检查 P 的是否处于空闲状态,是的话放入到空闲列表中; P.init func (pp 需要注意的是,遍历 allp 时是从随机位置上的 P 开始,防止每次遍历时使用同样的顺序访问allp中的元素; 所有的可能性都尝试过了,在准备休眠 M 之前,还要进行额外的检查; 首先检查此时是否是 GC

    84320

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注腾讯云开发者

      领取腾讯云代金券