GMP 简介
G:goroutine 协程
P:processor 处理器
M:thread 内核线程
全局队列:存放等待运行的goroutine
P的本地队列:
- 存放等待运行的goroutine
- 数量限制:不超过256个
- 优先将新创建的goroutine放在P的本地队列中,如果满了会放在全局队列中
M列表:
- 当前操作系统分配到当前Go程序的内核线程数
- Go语言本身,限定M的最大量是10000
- 有一个M阻塞,会创建一个新的M
- 如果有M空闲,那么就会回收或睡眠
调度器的设计策略
- 复用线程(避免频繁的创建、销毁线程、而是对线程的复用)
- work stealing机制:当本线程无可运行的goroutine时,尝试从其他线程绑定的P偷取G,而不是销毁线程
- hand off机制:当本线程因为G进行系统调用阻塞时,线程释放绑定的P,把P转移给其他空闲的线程执行
- 利用并行 (GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时执行
- 抢占(在goroutine中要等待一个协程主动让出CPU才执行下一个协程,在Go中,一个goroutine最多占用CPU 10ms,防止其他goroutine被饿死)
- 全局G队列 (当M执行work stealing 从其他P偷不到G时,他可以从全局G队列获取G)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
本文分享自华为云社区《超越内存限制:深入探索内存池的工作原理与实现》,作者:Lion Long。 一、引言 为什么需要内存池? 在系统应用层面,程序开发使用的都是虚拟内存。物理内存是底层的,只有底层程序(比如驱动、固件等)可以接触到。 程序通常能管理的内存主要…