0%

GPM

单进程时代

特点

  • 串行:one by one

缺点

  • 进程阻塞后,CPU空转

多进程/线程时代

特点

  • 并发
  • 调度

缺点

  • 进程/线程切换代价大

  • 内存占用大

    • 进程:GB
    • 线程:MB

协程

特点

  • 非抢占式

协程和线程对应关系

  • 1:1

  • 1:N

    • 协程阻塞问题
  • M:N

    • 协程调度器

Goroutine

特点

  • 内存小

    • KB级别
  • 调度灵活

    • runtime调度

      • 协程阻塞后,其它协程可以被其它线程调用

调度器

  • GM

    • 组成

      • G

        • 全局的Goroutine队列
      • M

        • 一组Thread
    • 调度过程

      • 线程互斥的去访问G

        • 创建新Goroutine
        • 销毁Goroutine
        • 调度Goroutine
    • 缺点

      • 互斥访问效率低

      • 不满足局部性原理

        • Goroutine中创建的其它Goroutine由另一个线程负责
      • M之间切换频繁

  • GPM

    • 组成

      • G

        • 全局Goroutine队列
      • P

        • 持有一个本地Goroutine队列
        • 数量:$GOMAXPROCS
      • M

        • Thread
    • 调度过程

      • M访问P中的Goroutine

        • P不为空

          • P满了

            • 将本地一半Goroutine移动到全局G队列中
        • P为空

          • 从其它P中偷取Goroutine加入到P
          • 从全局队列G中获取Goroutine加入到P
      • M因G阻塞

        • 释放绑定的P
        • 创建新的M