登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 年度开源项目评选中~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
进程、线程、协程之间的区别
待办的
#IAJKUK
陌生人
拥有者
创建于
2024-08-13 10:08
<p>两两区分:进程与线程、线程与协程。</p><h3>进程:</h3><p>进程是资源分配的最小单位。</p><p>进程有自己的独立地址空间、代码、数据和系统资源。每启动一个进程,系统就会为它分配地址空间等资源,所以创建和销毁进程会产生较大的开销。</p><p>因为进程有自己独立的地址空间和资源,所以多进程程序间的错误不会相互影响,也就是一个进程死掉并不会对另外一个进程造成影响。多线程程序因为共享进程的资源,只要有一个线程死掉,整个进程可能也会死掉。</p><h3>线程:</h3><p>线程程序执行的最小单位(资源调度的最小单位)。</p><p>线程是共享进程中的地址空间和资源,但每个线程有自己的栈空间和寄存器,因此CPU切换一个线程的开销远比进程要小很多,同时创建一个线程的开销也比进程要小很多。</p><p>线程之间因为共享同一个进程的资源,所以通信更方便,而进程因为拥有独立的地址空间和资源,所以进程之间的通信需要使用特定的机制,如管道、消息队列、共享内存等。</p><h4>进程和线程的关系:</h4><p>一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。</p><p>资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。</p><p>处理机分给线程,即真正在处理机上运行的是线程。</p><p>线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。</p><h3>协程:</h3><p>内存占用</p><p>创建一个协程的栈内存消耗默认为2KB。创建一个线程则需要消耗MB级别以上的栈内存。</p><p>创建和销毁</p><p>(1)线程创建和销毀都会有巨大的消耗,因为线程是由操作系统管理的,创建和销毁线程涉及到内核的调度和资源分配,是内核级的,相对较重量级,通常解决的办法就是线程池。</p><p>(2)协程因为是由 Go 运行时(runtime)使用了自己的调度器管理的,创建和销毁的消耗非常小,是用户级。因此在Go语言中可以轻松创建成千上万个协程而不会导致资源耗尽。这种特性使得Go语言在并发编程中非常高效,可以充分利用多核处理器的能力,实现高性能的并发程序。</p><h4>通信</h4><p>(1)Go协程之间通过通道(Channel)进行通信,从而实现数据传递和同步操作。</p><p>(2)线程之间的通信通常需要使用操作系统提供的同步原语,如锁、信号量等,较为繁琐。</p><h4>切换</h4><p>当线程切换时,需要保存各种寄存器,以便将来恢复,而 goroutines 切换只需保存三个寄存器。</p><p>一般而言,线程切换会消耗 1000-1500 纳秒,一个纳秒平均可以执行 12-18 条指令。所以由于线程切换,执行指令的条数会减少 12000-18000。协程的切换约为 200ns,相当于 2400-3600 条指令。因此,协程切换成本比线程要小得多。</p><p><br></p>
<p>两两区分:进程与线程、线程与协程。</p><h3>进程:</h3><p>进程是资源分配的最小单位。</p><p>进程有自己的独立地址空间、代码、数据和系统资源。每启动一个进程,系统就会为它分配地址空间等资源,所以创建和销毁进程会产生较大的开销。</p><p>因为进程有自己独立的地址空间和资源,所以多进程程序间的错误不会相互影响,也就是一个进程死掉并不会对另外一个进程造成影响。多线程程序因为共享进程的资源,只要有一个线程死掉,整个进程可能也会死掉。</p><h3>线程:</h3><p>线程程序执行的最小单位(资源调度的最小单位)。</p><p>线程是共享进程中的地址空间和资源,但每个线程有自己的栈空间和寄存器,因此CPU切换一个线程的开销远比进程要小很多,同时创建一个线程的开销也比进程要小很多。</p><p>线程之间因为共享同一个进程的资源,所以通信更方便,而进程因为拥有独立的地址空间和资源,所以进程之间的通信需要使用特定的机制,如管道、消息队列、共享内存等。</p><h4>进程和线程的关系:</h4><p>一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。</p><p>资源分配给进程,同一进程的所有线程共享该进程的所有资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。</p><p>处理机分给线程,即真正在处理机上运行的是线程。</p><p>线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。</p><h3>协程:</h3><p>内存占用</p><p>创建一个协程的栈内存消耗默认为2KB。创建一个线程则需要消耗MB级别以上的栈内存。</p><p>创建和销毁</p><p>(1)线程创建和销毀都会有巨大的消耗,因为线程是由操作系统管理的,创建和销毁线程涉及到内核的调度和资源分配,是内核级的,相对较重量级,通常解决的办法就是线程池。</p><p>(2)协程因为是由 Go 运行时(runtime)使用了自己的调度器管理的,创建和销毁的消耗非常小,是用户级。因此在Go语言中可以轻松创建成千上万个协程而不会导致资源耗尽。这种特性使得Go语言在并发编程中非常高效,可以充分利用多核处理器的能力,实现高性能的并发程序。</p><h4>通信</h4><p>(1)Go协程之间通过通道(Channel)进行通信,从而实现数据传递和同步操作。</p><p>(2)线程之间的通信通常需要使用操作系统提供的同步原语,如锁、信号量等,较为繁琐。</p><h4>切换</h4><p>当线程切换时,需要保存各种寄存器,以便将来恢复,而 goroutines 切换只需保存三个寄存器。</p><p>一般而言,线程切换会消耗 1000-1500 纳秒,一个纳秒平均可以执行 12-18 条指令。所以由于线程切换,执行指令的条数会减少 12000-18000。协程的切换约为 200ns,相当于 2400-3600 条指令。因此,协程切换成本比线程要小得多。</p><p><br></p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Golang
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册