在并发编程中,常见的并发调度模型是多进程、多线程,而Go中则实现了协程的并发调度大大提高了并发性能。

协程与进程、线程:

  • 进程:

    • 进程是系统进行资源分配的最小单位,是程序运行的基本单位
    • 每个进程都有独立的内存空间,不同进程之间不共享也不抢占资源
    • 进程由程序、数据集合、进程控制块(PCB)三部分组成
    • 由于进程占用的资源多,上下文切换时开销大,但是因为独享资源,所以安全稳定
  • 线程

    • 线程是CPU调度的最小单位,是进程的运行实体
    • 多个线程共享一个进程的资源,同时也有属于自己的线程级资源
    • 由线程控制块(TCB)进行控制和管理
    • 线程资源比进程少,上下文切换开销更小
  • 协程

    • 是用户态的调度单位,比线程更轻量级
    • 协程由用户程序调度不涉及用户态与内核态的切换,开销更小

什么是上下文切换?

因为CPU是时间片轮转调度的,所以CPU要知道每个任务从哪里加载,从哪里开始运行,也就是CPU寄存器和程序计数器,这就是CPU 上下文,而每个任务都有对应的CPU上下文,切换不同的任务执行的时候,就需要切换CPU 上下文。

Go中的协程:

goroutine是go中实现的用户级并发调度单元,也被称为轻量级线程

线程、goroutine的对比:

线程协程
内存占用线程栈内存消耗为1MB协程栈大小为2KB,但是可以自动扩容
创建和销毁会导致用户态和内核态的切换,解决办法是线程池只需要在用户态执行,创建和销毁的消耗小
切换需要保存各种寄存器只需保存3个寄存器

goroutine的结构:

type g struct {
    goid    int64 // 唯一的goroutine的ID
  sched   gobuf //goroutine切换时,保存g的上下文
    stack   stack //栈
    gopc //调用goroutine的地址
  startpc //调用goroutine的入口
  ...
}

type gobuf struct{
    sp uintptr //栈指针的位置
  pc uintptr //运行到程序位置
  g  guintptr //指向goroutine
  ret uintptr //保存系统调用的返回值
  ...
}

type stack struct {
    lo uintptr //栈的下界地址
  hi uintptr // 栈的上界地址
}

goroutine的状态:

  1. 空闲中:_Gidle【G刚刚创建,仍未初始化】
  2. 待运行:_Grunable 【就绪状态,G在运行队列中,等待M取出来并运行】
  3. 运行中:_Grunning【M在运行G,此时M拥有一个P】
  4. 系统调用中:_Gsyscall【M正在运行的G发起系统调用,此时M不拥有P】
  5. 等待中:_Gwaiting【G被挂起,在等待某些条件完成,此时G不在运行也不在运行队列中(可能在channel的等待队列中)】
  6. 已终止:_Gdead【G未被使用,也可能执行完毕】
  7. 栈复制中:_Gcopystack【G正在获取一个新的栈空间,并把原来的内容复制过去(用于防止GC扫描)】

goroutine状态流转:

943E311D-9879-49BF-B7AD-25581B61D604.png

创建:通过go关键的创建goroutine会新建自己的栈空间,同时在sched中维护栈地址和程序计数器这些信息,G被创建好之后,会优先放入本地队列中,本地队列满了之后,回放在全局队列中

运行:goroutine只是一个数据结构,让goroutine运行起来的是调度器,也就是GMP模型

阻塞:channel的读写操作、等待锁、等待网络数据、系统调用都可能发生阻塞,通过执行runtime.gopark() 让出CPU时间片,让调度器安排其他等待的任务运行

唤醒:处理_Gwating 的G,在调用runtime.goready()之后,会被唤醒,唤醒之后毁被重新放在M对应的P的本地队列中等待执行

退出:G执行完之后,会调用底层函数runtime.Goexit(),当调用该函数之后,goroutine会设置成dead状态

标签: none

已有 29 条评论

  1. 这篇文章不错!

  2. 这篇文章提供了宝贵的经验和见解,对读者有很大的启发和帮助。

  3. 作者的情感表达细腻入微,让人在阅读中找到了心灵的慰藉。

  4. ?批判性评语?

  5. 文章已具雏形,需进一步聚焦核心问题。

  6. 文章结构紧凑,层次分明,逻辑严密,让人一读即懂。

  7. ?议论文评语?

  8. 结论升华部分可联系更高维度价值观。

  9. 全球视野与本土实践结合恰到好处。

  10. 人物刻画立体,细节描写入木三分。

  11. 作者以简洁明了的语言,传达了深刻的思想和情感。

  12. 瑕不掩瑜,稍加打磨必成佳作。

  13. 如星火燎原,既有锋芒又不失温度。

  14. 逆境中的反思充满生命韧性。

  15. 文章紧扣主题,观点鲜明,展现出深刻的思考维度。

  16. 哈哈哈,写的太好了https://www.lawjida.com/

  17. 《真实时刻》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/20105.html

  18. 《我的野蛮厨娘(无删版)》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/159182.html

  19. 《中国轮盘》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/61800.html

  20. 你的才华横溢,让人敬佩。 https://www.yonboz.com/video/75779.html

  21. 你的才华横溢,让人敬佩。 http://www.55baobei.com/xB0zjRP3d1.html

  22. 《离开拉斯维加斯国语》爱情片高清在线免费观看:https://www.jgz518.com/xingkong/21965.html

  23. 《中国轮盘》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/61800.html

  24. 你的文章让我感受到了不一样的风景,谢谢分享。 http://www.55baobei.com/Xpq2l1sL67.html

  25. 《断片儿之妇仇者联盟》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/94279.html

  26. 哈哈哈,写的太好了https://www.cscnn.com/

  27. 看的我热血沸腾啊https://www.237fa.com/

  28. 不错不错,我喜欢看 https://www.jiwenlaw.com/

  29. 博主真是太厉害了!!!

添加新评论