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

杭州网站建设 企业编程语言有哪些

杭州网站建设 企业,编程语言有哪些,2023北京又开始核酸了吗今天,知识库主题 wordpress注意#xff1a;jemalloc 的最新版本里没有所谓的 huge class#xff0c;bin 中slab外面也不再套一个run的概念了#xff0c;看其它人分享的文章时需要注意。 简述 用户侧通过 tcache 来访问#xff0c;tcache 是一个线程的申请又释放的对象的缓存#xff0c;它绑定了一… 注意jemalloc 的最新版本里没有所谓的 huge classbin 中slab外面也不再套一个run的概念了看其它人分享的文章时需要注意。 简述 用户侧通过 tcache 来访问tcache 是一个线程的申请又释放的对象的缓存它绑定了一个固定的arena分配大小超过8m的除外8m以上会选择huge arena 来分配有一个gc机制负责将不用的object 归还给 arena。 arena 分配对象时以8k为界限以上均为大对象以下均为小对象。小对象是按 slab 去管理的即每次从 huge page 或 page 分配一个大的 extent 作为 slab划分后将整个slab挂在bin的对应大小的组上然后标记一个返回给用户大对象则直接分配一个extent 放在arena 的large list上。 arena 是一个逻辑的概念它真实的数据分配是在shard上进行的各arena 有不同的shard内存之间不相交shard 有 hpahuge page和 pacpage两种分配器优先使用hpa来分配但hpa只能承担最多一个huge page 大小的内存再大就只能用pac去分配。 hpa 在分配前会先用base分配器申请128 个大页每次分配时从某个大页上切一块下来pac每次缓存的内存不够时会通过base分配器来分配。 base 分配器一次分配一个block并存在base 的 list 上。 pachpabase都有一个类型的缓存结构来维护退回来的内存ppset_tecache_tedata_avail_t。它们都是用bitmap 维护一个bin列表bin中的每个元素是符合这一组内存大小的pairing heap最小堆。 size 与 bin 中 index 的映射 每个bin index对应的大小可以直接查表。 从size 到bin index 的关系在k以下是可以查表的4k以上需要计算 group size / total_group / min_size group 内的 delta 1…(size / (total_group 1))个0 (size -1)去掉group的位 具体可以参考sz_size2index_compute 每个size class 的具体情况可以跑这个代码看下 scs [None] * 1024class SC:def __init__(self, lg_max_lookup, lg_page, lg_ngroup, index, lg_base, lg_delta, ndelta) - None:self.index indexself.lg_base lg_baseself.lg_delta lg_deltaself.ndelta ndeltaself.unit_size (1 self.lg_base) (ndelta self.lg_delta)# should from os, default 4096self.page_size (1 lg_page)# small or largeself.is_small (self.unit_size (1 (lg_page lg_ngroup)))self.pages self.get_slab_size() if self.is_small else 0# small or largeself.lg_delta_lookup lg_delta if (self.unit_size (1 lg_max_lookup)) else 0 def get_slab_size(self):# at most lg_group * 2 - 1 timesuse_size self.page_sizewhile (use_size % self.unit_size) ! 0:use_size self.page_sizereturn use_sizedef size_classes(lg_ptr_size, lg_quantum, lg_tiny_min, lg_max_lookup, lg_page, lg_ngroup):lg_base lg_tiny_minlg_delta lg_basengroup 1 lg_ngroupptr_bits (1 lg_ptr_size) * 8index 0ndelta 0nlbins 0 # max lookup table sizenbins 0ntiny 0lg_tiny_maxclass 0# tiny size is 2^n enlargingwhile lg_base lg_quantum:sc SC(index, lg_base, lg_delta, ndelta, lg_page, lg_ngroup, lg_max_lookup)scs[index] scif sc.lg_delta_lookup:nlbins index 1if sc.is_small:nbins 1ntiny 1lg_tiny_maxclass lg_baseindex 1lg_delta lg_baselg_base 1if ntiny ! 0:# first non tiny sc# use base/delta quatum-1 rather than base quatum and delta 0lg_base - 1first_non_tiny_sc SC(lg_max_lookup, lg_page, lg_ngroup, index, lg_base, lg_delta, 1)scs[index] first_non_tiny_sclg_base 1index 1lg_delta 1if sc.is_small:nbins 1while ndelta ngroup:sc SC(lg_max_lookup, lg_page, lg_ngroup, index, lg_base, lg_delta, ndelta)scs[index] scindex 1ndelta 1if sc.is_small:nbins 1# other groupslg_base lg_base lg_ngroupwhile lg_base ptr_bits - 1:ndelta 1ndelta_limit ngroup - 1 if lg_base (ptr_bits - 2) else ngroupwhile ndelta ndelta_limit:sc SC(lg_max_lookup, lg_page, lg_ngroup, index, lg_base, lg_delta, ndelta)scs[index] scif sc.lg_delta_lookup:nlbins index 1lookup_maxclass (1 lg_base) (ndelta lg_delta)if sc.is_small:nbins 1small_maxclass (1 lg_base) (ndelta lg_delta)lg_large_minclass lg_base 1 if lg_ngroup 0 else lg_base 2large_maxclass (1 lg_base) (ndelta lg_delta)print(large_maxclass:, lg_base, ndelta, lg_delta, large_maxclass)index 1ndelta 1lg_base 1lg_delta 1print(fntiny: {ntiny} nlbins: {nlbins} nbins: {nbins} n: {index} lg_tiny_maxclass: {lg_tiny_maxclass} lookup_maxclass: {lookup_maxclass} small_maxclass: {small_maxclass} lg_large_minclass: {lg_large_minclass} large_minclass: {1 lg_large_minclass} large_maxclass: {large_maxclass})indexs []bases []deltas []unit_sizes []is_small []pages []print(index\tbase\tdelta\tunit_size\tis_small\tpages)for i in range(1,1024):if scs[i] is None:breaksc scs[i]indexs.append(i)bases.append(sc.lg_base)deltas.append(sc.ndelta sc.lg_delta)unit_sizes.append(sc.unit_size)is_small.append(yes if sc.is_small else no)pages.append(sc.pages)print(f{i}\t{1 sc.lg_base}\t{sc.ndelta sc.lg_delta}\t{sc.unit_size}\t{yes if sc.is_small else no}\t{sc.pages})LG_SIZEOF_PTR 3 LG_QUANTUM 4 SC_LG_TINY_MIN 3 SC_LG_MAX_LOOKUP 12 LG_PAGE 12 SC_LG_NGROUP 2 size_classes(LG_SIZEOF_PTR, LG_QUANTUM, SC_LG_TINY_MIN, SC_LG_MAX_LOOKUP, LG_PAGE, SC_LG_NGROUP)SC_NTINY (LG_QUANTUM - SC_LG_TINY_MIN) SC_NGROUP (1 SC_LG_NGROUP) SC_NPSEUDO SC_NGROUP SC_LG_FIRST_REGULAR_BASE (LG_QUANTUM SC_LG_NGROUP) SC_NBINS SC_NTINY SC_NPSEUDO SC_NGROUP * (LG_PAGE SC_LG_NGROUP - SC_LG_FIRST_REGULAR_BASE) print(SC_NBINS is :, SC_NBINS)cache 的 gc tcache 大概是这样的 bound --------full---------waterline----empty |------------------|----------------|-------------| 其中当数量超过full时触发一次flush将一半的对象还回去剩余的数量称为waterline。除此之外好像在flush后又分配对象然后又释放对象重回到waterline 以后比waterline 多的对象作为detach 的对象也可以被flush 走但没看太懂不太确定 大小对象的分配与释放 无论大小对象都是先从tcache分配检查bitmap 看对应大小的对象有没有剩余如果有直接拿如果没有才去arena 分配。 小对象8k 小对象分配是在arena 的 bin 上每个大小的bin都对应着一系列的slab。分配时先从cur_slab分配如果cur_slab没有了就取一个nonfull list的slab放在cur_slab上 分配如果nonfull list 也没有了就去pac或hpa重新分配slab挂在cur_slab上分配。当cur_slab分配没了就会挂在full slab上在释放时发现它在full slab 上则放回到nonfull slab 上。分配的指针与 arena 还有 size 的映射存在arena_emap_global 上。 大对象8k 直接走 pac 或 hpa 分配和释放。分配后挂在arena-large_list 上。有arena_emap_global来维护指针到large_list上edata 元素的映射。释放时也是直接从 large list 上拿走。 internal 分配器 arena 有两种普通huge。大于 8moversize_threshold 的对象是在 huge arena 上分配的小于 8m 的在自己绑定的普通 arena 上分配除非是用户指定了arena这时才不会自动转到 huge arena 上分配。 无论哪种分配器在分配时都会先尝试用 hpahpa 最多 hold 一个大页以下的内存一般linux 配置是m如果超出 hpa 的能力才去普通 pac 分配。 hpa 分配器 hpa 在第一次分配时会申请 128 个 hugepage放在empty list 中。分配时先从 psset 缓存找对应大小的 bitmap看有没有空闲如果有就从这个大小的pairing heap上拿最小空闲的一个huge page 下来这个最小空闲指在这个huge page 上最大的一段连续内存的大小在所有同组huge page 中是最小的 如果没有空闲就找下一个更大大小的组直到找到一个 huge page。根据 huge page的bitmap找到对应的位置并更新这个 huge page 上最大的没分配范围。 分配出来的内存由edata来记录并放在shard-emap 上这是一个前缀树可以在释放时根据前缀树找到是否有相邻的释放内存并对它们做合并。 分配后的 huge page 会根据剩余的最大内存重新挂回到psset 上。 释放时内存先从emap 上摘下来然后在如果它的回归能够让huge page 的最大空闲更新则把huge page 插入到更合适的 bin 中。释放时如果发现一页完全空了则可以添加回到psset-empty list中。这些做完后还要标记这个范围到psset-to_purge会在合适的时间触发purge(实际是提示操作系统不再使用madvice(NONEED)) pac 分配器 pac 也有类似的缓存但过程不全相同。pac 的页合并不像huge page 那样用bitmap而是借助 shard_map 见上图 。pac 在分配时会先找完全满足的bin去分配如果配置的bin没有空闲它会找更大一点的bin来split但只会向上找最多opt_lg_extent_max_active_fit个bin。如果新分配出来的内存对extent 做了切割那么切割剩的extent 会加入到retained 缓存中。 pac 有三个缓存dirty / muzzy / retained。分配时先去 dirty cache 找匹配的或能切割的再去 muzzy 找如果都找不到会去 retained 中找retained 中找不到时才真正去 base 分配并在切割后将剩余的放到retained 中。 之所以新分配的内存还是有切割可能是因为pac 每次去 base 进货的单位内存是不断增加的进货的单位内存有一个 pac-exp_grow 来维护它有一个增长到的最大 limit值但应该不起作用因为limit 值设置为了最大object class size而这个值对于64位的指针来说就是2^63。 muzzy 与 dirty 内存的区别 muzzy 的 lazy purge 的时间会更久dirty 内存在 purge 时会检查一下可否转为 muzzy如果能转则它 purge 的时间会更 delay。这样可以避免频繁向操作系统申请和释放。 base 分配器 base 真正分配 block 时也像 pac 一样有一个申请内存的单位不断增长的机制由 base-pind_last记录上一次分配的大小级别下次分配只能比这个级别相等或更大 真实的分配是由sbrk(dss方式) 或 mmap 系统调用来分配的默认是先用 mmap 分配(DSS_DEFAULT “secondary”)用户可以调整。 dss 比 mmap 快但没有 mmap 灵活。 bitmap 为了加速查找bitmap 采用的是多层的形式对当于一个bit-skip-list。
http://www.pierceye.com/news/392527/

相关文章:

  • 祥云县住房和城乡建设网站百度热议排名软件
  • 网站开发攻克时间网站模版制作教程
  • 遵义一般做一个网站需要多少钱菲斯曼售后服务中心
  • 教务系统网站建设模板下载东莞企业高端网站建设
  • 淮南建设公司网站网站建设对教育解决方案
  • 泰兴建设局网站wordpress资料图片不显示
  • 外贸推广免费网站图片 网站源码
  • 博客推广那个网站列好邢台网红桥
  • 艺之都网站建设微信app开发腾讯视频分享到wordpress
  • 洛阳最好的做网站的公司哪家好建网站需要哪些文件夹
  • 舟山企业网站建设导出wordpress用户
  • 肇庆新农村建设内容在哪个网站有关天猫网站开发的论文
  • 网站建设代码生成器php网站开发专员招聘
  • 视频教学网站cms陕西网站备案查询
  • 湖州网站设计浙北数据wordpress自定义搜索页面
  • 昆明公司网站开发流线型的网站建设
  • 南京建设网站企业泊头市建设网站
  • 前端跟后端哪个就业难北京网站建设seo优化
  • 简述网站开发建设的基本流程做一个京东这样的网站需要多少钱
  • 与通信工程专业做项目的网站微信开发显示wordpress
  • 自己做链接网站萍乡做网站哪家好
  • 做网站最适合用多大的图片医院 网站建设 新闻
  • 网站开发职业分析产品展示的手机网站
  • 精通网站建设pdf网上自学电脑课程
  • 一站式网站建设业务沈阳网站建设 熊掌号
  • 58同城网站建设目的劳务公司怎么注册需要什么要求
  • 龙华网站建设设计公司国家中小学智慧教育平台
  • 摄影网站采用照片做宣传_版权费是多少?pythom+网站开发规范
  • 免费制作一个自己的网站吗达内教育口碑怎么样
  • 2015做那个网站能致富网站建设模板ppt模板