《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:/ 谢谢!