进程、线程和go协程

单核心和多核心:

摩尔定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。

早期 CPU 工艺的发展,基本上是通过提高电子元器件的密集程度实现的;但是电子元器件大小总归有个极限,不可能无限小下去。单核心的速度总会遇到一个瓶颈,为了解决这种性能瓶颈,多核心就应运而生。

执行体

从 CPU 的角度,执行程序主要依赖的是内置存储:寄存器和内存(RAM),它们构成执行体的上下文。
执行体的上下文,就是一堆寄存器的值。要切换执行体,只需要保存和恢复一堆寄存器的值即可

切换执行体所产生的开销:
时间成本:

  1. 执行体切换本身的开销,它主要是寄存器保存和恢复的成本,可腾挪的余地非常有限;
  2. 执行体的调度开销,它主要是如何在大量已准备好的执行体中选出谁获得执行权;
  3. 执行体之间的同步与互斥成本

空间成本:

  1. 执行体的执行状态;TLS(线程局部存储);
  2. 执行体的堆栈。

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

  1. 进程是OS进行资源分配的基本单位。
  2. 进程是程序运行的实例。
  3. 进程的调度由操作系统进行调度

多进程:
1. 各进程之间的资源相互独立,不能共享
2. 占用资源多

线程

  1. 线程是调用CPU运算的最小单元
  2. 线程的调度由操作系统进行调度

多线程:
1. 充分利用多核心
2. 降低阻塞造成的CPU资源闲置
3. 同一个进程中的多个线程,共享进程的资源
4. 典型的线程栈大小差不多有 1M,

使用多线程的场景:
1. 多核CPU——计算密集型任务。此时要尽量使用多线程,可以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。
2. 单核CPU——计算密集型任务。此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率了;相反,如果要做人机交互,最好还是要用多线程,避免用户没法对计算机进行操作。
3. 单核CPU——IO密集型任务,使用多线程还是为了人机交互方便,
4. 多核CPU——IO密集型任务,这就更不用说了,跟单核时候原因一样。

协程

  1. 轻量级线程(在用户态实现线程)
  2. 协程的调度由用户控制
  3. 协程栈的大小往往只有几 K 或者几十 K

协程就是为了这样两个目的而来:
1. 回归到同步 IO 的编程模式;
2. 降低执行体的空间成本和时间成本。

goroutine:
1. 堆栈开始很小(只有 4K),但可按需自动增长;
2. 坚决干掉了 “线程局部存储(TLS)” 特性的支持,让执行体更加精简;
3. 提供了同步、互斥和其他常规执行体间的通讯手段,包括大家非常喜欢的 channel;
4. 提供了几乎所有重要的系统调用(尤其是 IO 请求)的包装。
5. goroutine是可以并行的,coroutine原理是基于一个线程的协程,是不能并行的。
6. 基于CSP(Communicating Sequential Processes)模型实现
7. MPG模型
8. 工作窃取调度

Go的CSP并发模型实现:M, P, G
time.Timer源码阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值