zoukankan      html  css  js  c++  java
  • 进程、线程以及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⼯作池的设计原理

  • 相关阅读:
    selenium测试(Java)-- 键盘事件(七)
    selenium测试(Java)--鼠标事件(六)
    selenium测试(Java)--元素操作(五)
    selenium测试(Java)--浏览器控制(四)
    selenium测试(Java)(三)
    selenium定位方法(java实例)(二)
    selenium测试环境搭建(一)
    HTML5前端(移动端网站)性能优化指南
    dede使用方法----如何调用最新文章,最热文章,友情链接
    dede使用方法---如何调用指定栏目
  • 原文地址:https://www.cnblogs.com/peteremperor/p/13727198.html
Copyright © 2011-2022 走看看