Go语言协程

目录

前言

一、进程、线程、协程

1.进程

2.线程

3.协程

4.协程的优势

5.进程、线程、协程的对比

二、协程

1.协程数据结构

2.协程执行过程

3.GMP调度模型

4.调度策略

1.队列轮转

2.系统调用

3.工作量窃取

4.抢占式调度

总结


前言

最近发现go语言大火,越来越多的大厂都开始使用go语言,很多人也开启了学习Go语言,本文就介绍了Go语言中协程的基础内容以及协程的调度模型。


一、进程、线程、协程

1.进程

进程是应用程序的启动实例,是系统进行资源分配和调度的基本单位,每个进程都有独立的内存空间,不同进程通过进程间的通信方式来通信。

2.线程

线程从属于进程,是进程中的一个实体,线程是CPU调度的基本单位,一个线程由线程ID、当前指令指针、寄存器集合和堆栈组成。

线程不拥有自己的系统资源,它与同属于同一进程的其他线程共享进程所拥有的全部资源,多个线程之间通过共享内存等线程间的通信方式来通信,线程拥有自己独立的栈和共享的堆。

3.协程

协程可以理解为轻量级线程,一个线程可以拥有多个协程,与线程相比,协程不受操作系统调度,协程调度器按照调度策略把协程调度到线程中执行,协程调度器由应用程序的runtime包提供,用户使用go关键字即可创建协程,这也就是GO在语言层面直接支持协程的含义。

4.协程的优势

由于协程运行在用户态,能够大大减少上下文切换带来的开销,并且协程调度器把可运行的协程逐个调度到线程中执行,同时及时把阻塞的协程调度出线程,从而有效的避免了线程的频繁切换,达到了使用少量的线程实现高并发的效果,但是对于一个线程来说每一时刻只能运行一个协程。

5.进程、线程、协程的对比

  1. 协程既不是进程也不是线程,一个进程可以包含多个线程,一个线程可以包含多个协程,进程、线程、协程不是同一个维度的。
  2. 进程、线程的切换者都是操作系统,切换时机由操作系统的切换策略决定,而协程的切换者是用户,切换时机由用户自己的程序来决定。
  3. 进程的切换内容包含页全局目录、内核栈、硬件上下文,切换内容保存在内存中;
  4. 线程的切换内容包含内核栈、硬件上下文,切换内容保存在内核栈中;
  5. 协程切换内容是硬件上下文,切换内容保存在用户栈或堆中,由此可以看出协程切换的开销是要小于线程切换的开销的。
  6. 协程的切换过程只存在于用户态,因此切换效率高。

二、协程

你可能感兴趣的:(golang)