USTACK系统的ATCPZONE设计

不能不学习啊

Posted by 大狗 on January 7, 2021

USTACK系统的ATCPZONE设计

前言

简单看看ATCP ZONE怎么做的

分类流程

分配流程有限从per cpu cache取出来。

  • atcp_zalloc函数,会将当前当前ATCP进程的ID保存到atcpid
  • 每个ATCP线程都会首先尝试从自己的per atcp cache也就是一个长长的链表中取出来数据:这个链表每个元素的第一个字节位置存储的是下个元素的位置cache->zc_items[j] = ((void **) item)[MM_NEXT_ADDR_POSITION];。取成功就返回,取失败就找缓存池申请atcp_zpool_alloc(j, zzone->zpool, flags | M_DOMAIN);。然后再次尝试分配。
  • 缓存池申请函数atcp_zpool_alloc首先判断分配多少数量为佳,以cache->zc_batchalloc为上限。然后锁住每个zpool对应的锁,然后每次从per zpool的空闲数据链表里拆出来一个item,然后把新的item放到每个atcp cache的链表头部。如果满足直接释放锁返回,反之调用atcp_zpool_slab函数给zpool申请新元素
  • 函数atcp_zpool_slab函数就开始干脏活累活了,还是要锁住ZP_LOCK(zpool, domain) (&(zpool)->zp_lock[domain]),然后按照part_slab, free_slab的顺序尝试分配结构,成功的话,while (slab->us_freecount > 0 && ZP_FREECNT(zpool, domain) <= zpool->zp_freemin)通过位图计算出part_slab上的第一个空闲目标直接放到zpool上,失败就调用atcp_slab_alloc分配新的slab,直接插入到part_slab上。上面无论失败还是成功如果发现alloc一个slab不够满足ZP_FREECNT(zpool, domain) < zpool->zp_freemin都会继续循环。
  • 函数atcp_slab_alloc是向huge page申请内存的操作。这部分就不赘述了,下面是调用流程。

ZTCP_ZONE的初始化

这部分主要看怎么计算出来的着色操作,

结尾

唉,尴尬

狗头的赞赏码.jpg