当前位置: 首页 > news >正文

go语言day15 goroutine

Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master · rubyhan1314/Golang-100-Days · GitHub

第2讲-调度器的由来和分析_哔哩哔哩_bilibili

一个进程最多可以创建多少个线程?-CSDN博客

          引入协程

        go语言中内置了协程goroutine;可以简单理解:协程是轻量级的线程,线程是轻量级的进程。

        在Linux的32位操作系统中,创建一个进程需要4G的虚拟内存,创建一个线程需要8MB的虚拟内存。频繁的创建线程会占用内存资源。

        如果是一个单核cpu,在多个线程中来回切换并不是无缝切换:首先cpu把线程A运行的数据从cpu寄存器移动到内存中,这个过程需要时间和内存资源,然后再运行线程B,同样的需要将运行的线程B数据移动到内存。这样的并发效率并不高。

        引入协程,就是为了提高并发效率,减少内存消耗。


         实现协程

                        1)线程绑定

        cpu处理内核空间中的线程,用户空间中的用户线程去绑定内核空间的内核线程。

         1个用户线程对应1个内核线程,线程是这样的1对1关系

         2)P调度器

        go语言初始的调度器实现的是n对1的关系,但是一个协程阻塞,其他协程无法运行。

         3)gmp模型思想

         go语言后来实现的是n:m的多对多关系,未被阻塞的协程可被切换绑定到cpu处理的内核空间的其他线程中处理。

         4)协程绑定

          为什么要去绑定协程和内核线程,内核线程直接由操作系统调度器执行分配给cpu处理,不去绑定的话还需要切换到用户态手动处理,比较麻烦,效率也比不上操作系统直接管理。  

 

         5)gmp模型思维导图

 

        P调用器策略

        work stealing

                空闲的本地队列优先从其他本地队列中偷取协程,如果偷取不到就从全局队列中获取协程。

         hand off

                协程阻塞时其他未阻塞的协程绑定到新线程中处理。

http://www.lryc.cn/news/408471.html

相关文章:

  • Mindspore框架循环神经网络RNN模型实现情感分类|(六)模型加载和推理(情感分类模型资源下载)
  • System类
  • 【前端 02】新浪新闻项目-初步使用CSS来排版
  • HarmonyOS和OpenHarmony区别联系
  • llama模型,nano
  • ElasticSearch的应用场景和优势
  • git 、shell脚本
  • 阿里云服务器 篇六:GitHub镜像网站
  • 强化学习学习(三)收敛性证明与DDPG
  • 培养前端工程化思维,不要让一行代码毁了整个程序
  • 电子文件怎么盖章?
  • IDEA在编译的时候报Error: java: 找不到符号符号: 变量 log lombok失效问题
  • 【Python】如何修改元组的值?
  • 【安卓】Android Studio简易计算器(实现加减乘除,整数小数运算,正数负数运算)
  • 一个vue mixin 小案例,实现等比例缩放
  • 【数据结构初阶】单链表经典算法题十二道——得道飞升(中篇)
  • CTF ssrf 基础入门 (一)
  • IP地址在后端怎么存才好?
  • 《通讯世界》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • go get的原理
  • jenkins替换配置文件
  • C# Web控件与数据感应之 填充 HtmlTable
  • HAL库源码移植与使用之SPI驱动VS1053音频解码
  • RK3568 Linux 平台开发系列讲解(内核入门篇):从内核的角度看外设芯片的驱动
  • 初识C++ · AVL树(2)
  • LLM:归一化 总结
  • 蓝桥杯 2024 年第十五届省赛真题 —— 最大异或结点
  • AV1技术学习:Loop Restoration Filter
  • 如何使用python实现自动化办公?干货满满!
  • QT Creator下载安装详细教程(保姆级教程)