goroutine

本文详细介绍了goroutine的概念,包括进程、线程和协程的对比,重点探讨了goroutine的调度机制,上下文切换以及与coroutine的区别。文章通过GPM模型解释了Go语言中goroutine的创建、执行和调度过程,强调了其轻量级特性,如内存消耗低、创建销毁开销小和高效的调度性能。
摘要由CSDN通过智能技术生成

目录

一:进程-线程-协程 简述

1、进程

2、线程

3、协程

调度

什么是上下文切换?

二:goroutine和coroutine的区别

三:goroutine的实现原理

GPM定义

GPM调度策略

GPM调用过程

Goroutine 小结

参考:


一:进程-线程-协程 简述

进程和线程的主要区别是:进程独享地址空间和资源,线程则共享地址空间和资源,多线程就是多栈。

1、进程

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

2、线程

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

3、协程

  协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

调度

进程调度,切换进程上下文,包括分配的内存,包括数据段,附加段,堆栈段,代码段,以及一些表格。

线程调度,切换线程上下文,主要切换堆栈,以及各寄存器,因为同一个进程里的线程除了堆栈不同。

协程又称为轻量级线程,每个协程都自带了一个栈,可以认为一个协程就是一个函数和这个存放这个函数运行时数据的栈,这个栈非常小,一般只有几十kb。

协程是一种编程组件,可以在不陷入内核的情况进行上下文切换。

什么是上下文切换?

CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。

任务从保存到再加载的过程就是一次上下文切换。

切出: 一个线程被剥夺处理器的使用权而被暂停运行 

切入: 一个线程被系统选中占用处理器开始或继续运行

上下文切换会产生开销

上下文切换的开销包括直接开销和间接开销。

直接开销有如下几点:

  • 操作系统保存回复上下文所需的开销

  • 线程调度器调度线程的开销

间接开销有如下几点:    

  • 处理器高速缓存重新加载的开销

  • 上下文切换可能导致整个一级高速缓存中的内容被冲刷,即被写入到下一级高速缓存或主存


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值