Go 1.4 runtime.pdf

上传人:yyf 文档编号:3330205 上传时间:2019-08-13 格式:PDF 页数:29 大小:608.57KB
返回 下载 相关 举报
Go 1.4 runtime.pdf_第1页
第1页 / 共29页
Go 1.4 runtime.pdf_第2页
第2页 / 共29页
Go 1.4 runtime.pdf_第3页
第3页 / 共29页
Go 1.4 runtime.pdf_第4页
第4页 / 共29页
Go 1.4 runtime.pdf_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Go 1.4 runtime.pdf》由会员分享,可在线阅读,更多相关《Go 1.4 runtime.pdf(29页珍藏版)》请在三一文库上搜索。

1、Go 1.4 runtime Gopher China 2015 1. Memory Allocator 2. Garbage Collector 3. Goroutine Scheduler 1. Memory Allocator 内存分配器 base on tcmalloc. 基于成熟方案,性能优秀。随着版本升级, 针对性改进,以期与垃圾回收器更好协作。 核心:自主管理,缓存复用,无锁分配。 page, span. 内存管理以页为基本单位,多个地址连续 页构成内存块。 VA 8K8K8K8K8K span1span2 small, large. 以 32KB 为界,将对象分成大小两类。 s

2、pan page object object object small large object 切分 管理 分配 size class. 按 8 倍数,将小对象分成多种大小规格。 8 16 . span 3 等长切分 6 8 1 size 1 2 . class heap, central, cache. 三级管理机构。 heap central1 cachecache 向 OS 申请内存。 管理空闲 span。 每个对应一种 sizeclass。 从 heap 获取 span,切分。 管理未全部回收的 span。 从 central 获取 span。 与线程绑定,无锁分配。 . . cen

3、traln lock lock lock free init. 算法依赖连续地址,预留较大地址空间。 VA128GB arena 用户内存分配区域 8GB bitmap 垃圾回收标记区域 128MB spans 块记录区域 - 按页保存 span 指针。 反查 object 所属 span。 检查相邻 span 是否可合并。 AMD64: RESERVE RANGE0xC000000000 malloc. 快速分配,按需扩张。 heapcentral malloc 64K, 1MBspan span (objects)grow small object large object span OS

4、 cache sweep. 垃圾回收器引发回收操作。 GC heap large central small cache span/objects span ref != 0 ref = 0 相邻合并 OS X fi xalloc. 为管理对象分配内存,不占用预留地址。 arena mem cache span span. span: 管理内存块的元数据。 allspans: 垃圾回收遍历。 2. Garbage Collector 垃圾回收器 gc. 阈值触发,并行标记,并发清理。 定期强制回收,释放物理内存。 版本升级,垃圾回收效率总是核心问题。 gogc. 阈值检查,或强制回收。 mal

5、locnext_gc 0 gogc runtime.gc() stopstartmarksweep stopstartmark sweep 0 2 2 1 forcegc 2m 1 mark. 暂停用户逻辑,并行标记。 stoptheworld starttheworld? cache stack databssfinalizer spanspan cache stack GG mark mark mark markroot scanblock heap.bitmap Go 1.5: concurrent pauseless collector. sweep. 串行,或与用户逻辑并发执行。 g

6、ceagersweep concurrent goroutine bgsweep starttheworldmem allocatorsweepone all spans sysmon. 如阈值过大,可能会导致长时间无法触发 垃圾回收。因此,每 2 分钟强制检查回收 是非常必要的。 每 5 分钟,释放堆中长时间闲置块的物理 内存。 在系统初始化时,使用专门的线程在后台运行监控循环。 madvise. 在类 UNIX 系统,通过建议操作系统内核 解除内存映射的方式释放物理内存,但不 回收虚拟内存。 再次使用时,因缺页异常,由内核重新分 配物理内存。 Microsoft Windows 系统不支持

7、 madvise。 3. Goroutine Scheduler 并发调度器 goroutine. 轻量级实现,支持创建成千上万并发任务。 线程多路复用。 极小自定义初始栈。 任务在多个线程间切换。 scheduler. 三种抽象模型协作。 M G P thread CPU core VM task scheduler thread processor goroutine max. 系统限制,允许调整。 runtime.GOMAXPROCS 调整 P 数量,会导致 G 任务队列重新分布。 M G P scheduler max = 10000 max = 256 runtime/debug.S

8、etMaxThreads 超出限制,会导致进程崩溃。 newproc. 创建新并发任务。 go func() G newproc P queue M weakup batch move global queue fget malg stack newm. 创建系统线程执行任务。 M newm g0 stack newosproc(g0) system thread checkmcount sched.midlemget execute. 并发任务调度执行。 M P schedule localexecute mstart netpollsteal batch move global 61 G gogo func goexit weakup copystack. 连续栈替代分段栈。 morestack shrinkstack systemtopstacksystemtopstack memmove segmented stack guardfixed/min stack contiguous stack guardcopy stack 2X ? 4. channel, defer. 请参考拙作学习笔记 https:/ 谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/环境 > 装饰装潢


经营许可证编号:宁ICP备18001539号-1