进程、线程以及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⼯作池的设计原理

 

posted @ 2020-09-24 22:49  Mr.peter  阅读(384)  评论(0编辑  收藏  举报