golang的GMP模型是指Go语言中的Goroutine(G)、Machine(M)和Parking Lot(P)的调度模型。这是一个轻量级的线程模型,适用于创建大量的并发任务。
- Goroutine(G):Goroutine是Go语言中轻量级的并发单位,类似于线程的概念。与线程不同,Goroutine由Go运行时环境(runtime)管理,可以更高效地切换,因此可以创建大量的Goroutine,而无需大量的系统资源。Goroutine的切换由编译器和运行时环境共同完成。
- Machine(M):Machine代表的是物理硬件核心,比如CPU。在GMP模型中,M是真正执行G的实体。每个M都绑定一个OS线程,因此,它可以执行G和进行系统调用。
- Parking Lot(P):P代表的是逻辑处理器。P是M的抽象,一个P可以绑定一个或多个M。P下面是M,因此,一个P可以处理一个或多个G。P的数量由GOMAXPROCS决定,该变量决定了同时可执行的G的最大数量。
在GMP模型中,调度器负责从全局队列中获取G并分配给空闲的M执行。当M执行完一个G后,它会从本地队列中获取下一个G执行,或者从全局队列中获取新的G。如果本地队列没有待执行的G,并且全局队列也空了,那么M会等待新的G被创建。
这个模型的目标是实现高效且公平的并发执行,通过记录每个P的G任务计数(schedtick),实现了抢占式调度。当检查到schedtick一直没有递增时,说明这个P一直在执行同一个G任务,如果超过10ms,就会在这个G任务的栈信息里面加一个标记,然后这个G任务在执行的时候,如果遇到非内联函数调用,就会检查这个标记,然后中断自己,把自己加到队列末尾,执行下一个G。
评论区