【GOLANG】goroutine原理

一.  同步并发的原理:进程或线程,系统调度

       异步并发的原理:DMA,不经过CPU直接把IO COPY到MEMORY

 

1. GO并发模型的实现原理

      操作系统层面,一定是以线程的形态存在的。而操作系统根据资源访问权限的不同,体系架构可分为用户空间和内核空间;内核空间主要操作访问CPU资源、I/O资源、内存资源等硬件资源

      用户空间不可以直接访问资源,必须通过系统调用、库函数或Shell脚本来调用内核空间提供的资源

    

1.1 用户及线程模型

     多个用户态的线程对应着一个内核线程,程序线程的创建、终止、切换或者同步等线程工作必须自身来完成。它可以做快速的上下文切换。

     缺点是不能有效利用多核CPU

1.2 内核级线程模型

     一个用户态的线程对应一个系统线程,它可以利用多核机制,但上下文切换需要消耗额外的资源

1.3 两级线程模型

      M个用户线程对应N个系统线程,缺点增加了调度器的实现难度。

      Go语言的线程模型就是一种特殊的两级线程模型(GPM调度模型)

 

  Go 语言中支撑整个 scheduler 实现的主要有 4 个重要结构,分别是 M G P Sched,前三个定义在 runtime.h 中,Sched 定义在 proc.h 中

  Sched,调度器,维护存储 M 和 G 队列以及调度器的一些状态信息

  M (Machine),系统线程由操作系统管理。 goroutine 运行在 M 之上,M 数据结构维护 小对象内存 Cache,当前执行的 goroutine,随机数发生器等

  P(Processor),作用就是用来执行 goroutine 的,维护了 goroutine 队列,runqueue,

  G(goroutine),包含了栈,指令指针,channel 等

 

 

线程阻塞

      当正在运行的 goroutine 阻塞的时候,例如进行系统调用,会再创建一个系统线程 (M1),当前的 M 线程放弃了它的 goroutine, P 转到新的线程中去运行

     首先 M0 内核线程上运行,执行当前 G0,P 中有三个 G 等待,如果 G0 当前阻塞(比如读取文件,数据库),这时会创建 M1 内核线程,会把 P 上下文环境与 M1 进行关联

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值