进程、线程、协程

线程是个重量级的对象,不能频繁的创建,销毁,而且线程的切换成本也很高。
协程可以理解为一种轻量级的线程,从操作系统的角度来看,线程实在内核态中调度的,而协程是在用户态调度的,所以相对线程来说,协程的切换成本更低,协程也有自己的栈,但是比线程的栈要小得多,典型线程栈大约为1M,而协程的大小往往只有几k或者几十k。
利用协程实现同步
Golang是如何解决协作问题
Golang 提供了两种不同的方案:
1、支持协程之间以共享内存的方式通信,Golang提供了管程和原子类对协程进行同步控制,这个方案与JAVA有些类似。
2、支持协程之间以消息传递的方式通信,本质是避免共享,这个方案是基于CSP模型(顺序通信模型)实现的,Golang比较推荐的方案是2
附链接: https://studygolang.com/articles/22499

进程、线程、协程的区别?

一、概念:

1、进程

具有一定独立功能的程序关于某个数据集合上的一次运行活动 ,进程是系统进行资源分配和调度的一个独立单位,每个进程都有自己独立的内存空间,不同进程通过进程间通信来通信。由于进程比较大,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但是相对比较稳定和安全

2、线程

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它与同属一个进程的其他的线程共享进程所拥有的全部资源。线程上的通信主要是通过共享内存,上下文切换很快,资源开销较少,但相对进程不够稳定,容易丢失数据。

3、 协程

协程是一种用户态的轻量级的线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量。

二、 区别

1、 进程和线程比较
线程是进程的一个执行单元,也是进程内的可调度实体。进程和线程的区别:
1)地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间
2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的所有线程共享进程的资源
3) 线程是处理器丢掉的基本单位,进程不是
4)二者均可并发执行
5)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中

2、线程与协程的区别
1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程
2) 进程线程都是同步机制,协程是异步机制
3)协程只能保留上一次调用时的状态,每次 过程冲入时,就相当于进入上一次调用的状态

在内存消耗方面
每个goroutine 默认占用内存远比Java、C的线程少。goroutine 2kB,线程8MB
切换调度开销方面
goroutine:只需要三个寄存器的值修改-PC/SP/DX
线程:涉及模式切换(从用户态切换到内核态)、16个寄存器、PC、SP等寄存器的刷新等

协程底层实现原理

Golang是基于线程。内部实现上,维护了一组数据结构和n个线程,真正的执行还是线程,协程执行的代码被扔进一个待执行队列中,由n个线程从队列中拉出来执行。这就解决了协程的执行问题。那么协程是怎么切换的?答案是:Golang对各种io函数进行了封装。这些封装的函数提供给应用程序使用,而其内部调用了操作系统的异步IO函数,当这些一步函数返回busy和Blocking时,Golang利用这个实际将现有的执行序列压栈,让线程去拉另一个协程代码来执行,基本原理就是这样,利用并封装了操作系统的异步函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值