goroutine 调度器原理详解 - 进程 线程 协程 之 go语言篇

2023-05-16

 一 先理解一下  进程和线程通俗易懂文章:

(1122条消息) 线程与进程,你真得理解了吗_进程和线程_云深i不知处的博客-CSDN博客

什么是进程

先给一个定义:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。

进程有哪些特征?

进程依赖于程序运行而存在,进程是动态的,程序是静态的;
进程是操作系统进行资源分配和调度的一个独立单位(CPU除外,线程是处理器任务调度和执行的基本单位);
每个进程拥有独立的地址空间,地址空间包括代码区、数据区和堆栈区,进程之间的地址空间是隔离的,互不影响。

在这里插入图片描述

二   理解 线程和协程

原文:(1122条消息) goroutine 调度器原理详解_SilvermingX的博客-CSDN博客_goroutine原理

线程分为内核态线程和用户态线程,用户态线程需要绑定内核态线程,CPU 并不能感知用户态线程的存在,它只知道它在运行1个线程,这个线程实际是内核态线程。

用户态线程实际有个名字叫协程(co-routine),为了容易区分,使用协程指用户态线程,使用线程指内核态线程。

协程跟线程是有区别的,线程由CPU调度是抢占式的,协程由用户态调度是协作式的,一个协程让出 CPU 后,才执行下一个协程。 

Go中,协程被称为 goroutine(但其实并不完全是协程,还做了其他方面的优化),它非常轻量,一个 goroutine 只占几 KB,并且这几 KB 就足够 goroutine 运行完,这就能在有限的内存空间内支持大量 goroutine,支持了更多的并发。虽然一个 goroutine 的栈只占几 KB,但实际是可伸缩的,如果需要更多内容,runtime会自动为 goroutine 分配。
————————————————
版权声明:本文为CSDN博主「SilvermingX」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42767757/article/details/110848798

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

goroutine 调度器原理详解 - 进程 线程 协程 之 go语言篇 的相关文章

  • goroutine 调度器原理详解 - 进程 线程 协程 之 go语言篇

    一 先理解一下 进程和线程通俗易懂文章 xff1a 1122条消息 线程与进程 xff0c 你真得理解了吗 进程和线程 云深i不知处的博客 CSDN博客 什么是进程 先给一个定义 xff1a 进程是一个具有一定独立功能的程序在一个数据集合上
  • Go_Goroutine和channel的使用、定时器、runtime、select、条件变量

    程序 程序是指编译好的二进制文件 存放在磁盘上不占用系统资源 cpu 内存 当程序在计算机上运行时 它就变成了一个进程 包括程序 数据和状态信息 程序是静态的 而进程是动态的 进程 进程是程序的实例 是资源分配的最小单位 当一个程序开始运行
  • 多个 goroutine 监听一个通道

    我有多个 goroutine 尝试同时在同一通道上接收数据 看起来最后一个在通道上开始接收的 Goroutine 获得了该值 这是语言规范中的某个地方还是未定义的行为 c make chan string for i 0 i lt 5 i
  • 最大 goroutine 数量

    我可以无痛地使用多少个 goroutine 例如维基百科说 在 Erlang 中可以创建 2000 万个进程而不会降低性能 Update 我刚刚研究 goroutine 性能一点点 得到了这样的结果 看起来 goroutine 的生命周期比
  • 通道发送是否是 goroutine 调度的抢占点?

    从我对Go调度器的理解来看 Go调度算法是部分先发制人 当 goroutine 调用函数或阻塞 I O 时 会发生 goroutine 切换 向通道发送消息时是否会发生 goroutine 切换 goroutine A ch lt mess
  • 为什么此代码会导致数据争用?

    1 package main 2 3 import time 4 5 func main 6 m1 make map string int 7 m1 hello 1 8 m1 world 2 9 go func 10 for i 0 i l
  • 解决 goroutine 死锁

    我一直在尝试解决我在Golang并发中遇到的这个简单问题 我一直在搜索所有可能的解决方案 但没有发现任何特定于我的问题的解决方案 或者我可能会错过一个 这是我的代码 package main import fmt time func pro
  • 如何杀死 goroutine? [复制]

    这个问题在这里已经有答案了 我想知道如何杀死 停止 goroutine 所有示例都基于通道和选择 这似乎只有在 goroutine 包含一些可以在通道上监听的重复任务时才有效 有没有办法在下面的 goroutine 返回之前停止它 pack
  • golang http超时和goroutines累积

    我使用goroutines实现http Get超时 然后我发现goroutines的数量一直在稳步上升 当达到1000个左右时 程序就会退出 Code package main import errors io ioutil log net
  • 从 goroutine 获取值并取消另一个 goroutine

    我有一种情况 我正在从 2 个不同的位置 ES 和 REDIS 读取数据 我需要从最快的源读取单个值 因此我触发 2 个 goroutine 一个从 ES 获取数据 另一个获取来自 REDIS 一旦从其中一个 Goroutine 获取数据
  • 关闭从 TCP 连接读取的 goroutine,而不关闭连接

    我喜欢 Go 在内部处理 I O 多路复用的方式epoll还有另一种机制并自行调度绿色线程 此处为 go routine 从而可以自由地编写同步代码 我知道 TCP 套接字是non blocking and read会给EAGAIN当没有可
  • 为什么不读/写其内容的结构体的方法仍然会导致竞争情况?

    From 戴夫 切尼博客 http dave cheney net 2015 11 18 wednesday pop quiz spot the race 以下代码显然会导致竞争情况 只需更改即可解决func RPC version int
  • Goroutine 没有输出

    While SayHello 按预期执行 goroutine 不打印任何内容 package main import fmt func SayHello for i 0 i lt 10 i fmt Print i func main Say
  • 在单独的进程上运行 Goroutines(多处理)

    我目前有一个 MQTT 代码 可以订阅主题 打印收到的消息 然后向新主题发布进一步的指令 这订阅 打印在一个 Goroutine 中完成 并且出版是在另一个 Goroutine 中完成的 这是我的代码 var wg pg sync Wait
  • 如何设计goroutines程序来处理api限制错误

    刚刚开始了解 goroutine 的强大功能 我有大约 100 个帐户和大约 10 个区域 循环它们以使用 golang 创建大约 1000 个 goroutine 以提高读取速度 它运行速度太快 以至于达到了 20 秒的 API 返回限制
  • 强制 goroutine 进入同一线程

    有没有办法确保 goroutine 只在特定的操作系统线程中运行 例如 当 GUI 操作必须在 GUI 线程中运行 但可能有多个 goroutine 运行 GUI 代码时 GOMAXPROCS 1 从技术上讲可以完成这项工作 但这违背了多线
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • select 语句是否保证通道选择的顺序?

    继从这个答案 https stackoverflow com a 25795236 274460 如果一个 goroutine 在两个通道上进行选择 是否保证通道的选择顺序与其发送的顺序相同 我对发送者是单线程的情况特别感兴趣 例如 是否保
  • 我们如何在 Go 中使用通道来代替互斥锁?

    通道将通信 值的交换 与同步相结合 保证两个计算 goroutine 处于已知状态 如何使用 Google Go 中的通道来执行互斥量的功能 package main import sync var global int 0 var m s
  • Goroutine 是如何工作的? (或者:goroutines 和操作系统线程的关系)

    其他 goroutine 如何在调用系统调用时继续执行 当使用 GOMAXPROCS 1 时 据我所知 当调用系统调用时 线程会放弃控制权 直到系统调用返回 Go 如何在不为每个阻塞系统调用 goroutine 创建系统线程的情况下实现这种

随机推荐