Go的机理- Green Thread模型、work stealing调度算法、非阻塞式IO

Goroutine使用Green Thread模型(N:M 多个green threads运行在多个kernel threads ),既可以快速的进行context switch,又可以很好的利用多核,使用work stealing算法进行调度

Go的机理- Green Thread模型、work stealing调度算法、非阻塞式IO_第1张图片

模型:MPG三个角色,分别代表kernel threads,processor和goroutine。

调度:P负责完成对G和M的调度
1、P维护一个deque来存放可执行的G,进行调度时切换当前执行的G,从deque顶部取出下一个G继续执行;
2、当G进行syscall阻塞时,不仅需要切换G,M也需要进行切换来保证P能够继续执行后面的G,当阻塞的G-M对就绪时会被重新调度执行。
3、同时当P维护的所有的G执行结束后,会从别的P的deque的steal一半的G放入自己的deque中执行

非阻塞式IO:
1、当goroutine尝试进行I/O操作而IO未就绪时,当前执行的G设置为阻塞,而M可以被调度继续执行其他的G;
2、Go实现netpoller来进行I/O的多路复用,当G阻塞到I/O时,将fd注册到epoll实例中进行epoll_wait,就绪的fd回调通知给阻塞的G,G重新设置为就绪状态等待调度继续执行,减少context switch开销,处理更大并发量级

你可能感兴趣的:(Go的机理- Green Thread模型、work stealing调度算法、非阻塞式IO)