进程、线程以及Goroutine的区别
进程、线程、协程
内存
进程:
(1)操作系统会以进程为单位,分配系统资源 (CPU时间⽚、内存等资源),进程是资 源分配的最⼩单位。
(2)进程的安全性⽐较⾼
(3)通信成本就⽐较⼤
IPC 信号 |管道| 共享内存| socket⽹络通信| 共享⽂件
线程:
(1)操作系统调度(CPU调度)执⾏ 的最⼩单位。
(2)共享资源,隔离性差
(3)通信成本⽐较⼩ 通过同步机制访问共享资源即可 完成通信
(4)线程是寄⽣在进程之上的
执⾏单元
操作系统并不区分进程和线程区别
对于同⼀个操作系统⽽⾔,如果⼀个进程开辟的线程多,那么 抢占到cpu的资源就越多。
切换成本
开销
线程切换 保存寄存器中的内容 CPU⾼速缓存失效
协程切换 ⽤户态下的切换,实际上就是⼀ 个寄存器的加载
(1)协程切换完全在⽤户空间进⾏,线程切换涉及特权模式切换,需要在内核空间完成
(2)协程切换相⽐线程切换做的事情更少,线程需要有内核和⽤户态的切换,系统调⽤过程
(3)⼀般⼀个协程切换的时间在⼏⼗ns(纳秒量级),⼀个线程切换时间在⼏⼗~千μs(微秒量级)
⼤⼩
进程 GB量级
线程 MB量级
协程 KB量级(协程比线程还要轻量级)
不控制goroutine数量引发的问题
Goroutine 体积轻量 优质的GMP调度
⽆限开辟goroutine :(1)CPU的使⽤率上升 (2)Memory占⽤不断上升 (3)主进程崩溃(被强制杀死)
限制goroutine数量的⽅法
⽅法⼀: 只使⽤buffer和channel来限制
弊端:如果task任务少,main先 退出,由于没有同步机制,main 会导致进程退出,很多在跑的go 就会强制退出,任务执⾏不全
⽅法⼆: 只使⽤ sync同步机制 来限制
单纯使⽤sync的waitGroup是⽆法限制go的数量的
⽅法三: channel和sync的组合⽅式来限制
⽅法四:⽆缓冲channel和任务发送/执⾏分离来限制(⼯作池)
将任务的发送和执⾏做了业务上的分离 输⼊SendTask的频率可以设置 输出执⾏task的Goroutins是数量 也是可以设置
worker⼯作池的设计原理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2018-09-24 谷歌浏览器:audio如何隐藏下载按钮