乐趣区

关于golang:Go并发编程之并发模型1概念

前言

在开始学习 Go 个性的并发编程之前,先来简略理解一些根底概念,这对了解学习 Go 并发模型会有一些帮忙。

概念

内核态

也被称为内核空间,是零碎内核的运行空间,与用户空间隔离。管制计算机的硬件资源。

用户态

也被称为用户空间,代码运行在较低的特权级别上,不能间接拜访内核空间和硬件设施。

零碎调用

用户空间不能间接调用系统资源,必须通过调用零碎接口,由内核实现相干指令。

过程

过程是操作系统分配资源的最小单元。

线程

有时也被称为轻量级过程(LWP),是被零碎独立调度和分派的根本单位,线程本人不领有系统资源,只领有一点儿在运行中必不可少的资源,但它可与同属一个过程的其它线程共享过程所领有的全副资源。

KSE

实践上说 Linux 内核是没有线程这个概念的,只有内核调度实体(Kernal Scheduling Entry)这个概念。

协程

有时也被称为微线程(Coroutine),只不过这个线程是用户态的,不须要操作系统参加。

调度过程示例:

  1. coroutine A 进行 网络 I /O,应用 write() 发送数据后调用 read() 期待数据的返回,然而不肯定什么时候可能读到数据,所以将 Socket Fd 放入 EventLoop 中。
  2. coroutine A 让出 CPU 给 其它 coroutine 应用 —— 挂起(yield)
  3. 待 read() 有返回数据后,继续执行 coroutine A —— 复原(resume)

EventLoop:有限循环着的事件散发器,一旦有事件产生,它就会回调事后定义好的回调函数,实现事件的解决。

线程模型

用户级线程

M:1 多个用户空间的线程,对应一个内核空间的 KSE。

零碎级线程

1:1 1 个用户空间的线程,对应 1 个内核空间的 KSE。

两级线程模型(混合式线程模型)

M:N 多个用户空间的线程,对应多个内核空间的 KSE。

并发模型

并发模型指定了零碎中的线程如何通过合作来实现调配给它们的作业。不同的并发模型采纳不同的形式拆分作业,同时线程间的合作和交互方式也不雷同。

常见的有:

  • 线程 & 锁
  • Actor
  • CSP
  • Lambda 架构

并发模型—CSP

Communicating Sequential Processes 通信顺序进程。

看这个名字就能晓得,在 CSP 模型中配角是 通信

channel:进行通信的并发模型。
worker:channel 两端的发送者 / 接收者。

worker 之间不间接彼此分割,而是通过 channel 进行音讯发送和接管。

在并发模型中,常常和 CSP 一起探讨的是 Actor 模型。

GO 线程模型

Go 参考了 两级线程模型,设计出了 MPG 线程模型。

M

machine

用户空间内的线程,与 KSE 一一对应,能够了解为 M 代表了 内核线程。

P

processor

能够了解为用户代码逻辑的处理器,Go 代码片段所必须的上下文环境。

G

goroutine

Go 代码片段的封装。

go function (){//  ...}()

GO 并发模型

channel

参考了 CSP 并发模型

扩大

goroutine 与 coroutine 的区别

coroutine

运行机制属于合作式工作解决,始终程序执行。

goroutine

运行机制属于抢占式工作解决,可能产生并行执行。

总结

  1. Go 的并发模型参考了 CSP 并发模型,采纳 channel 进行通信。
  2. Go 的线程模型参考了两级线程模型,设计出了 MPG 模型。
  3. goroutine 与 coroutine 的区别就是前者可能产生并行执行,后者始终程序执行。

Sown 专栏地址:https://segmentfault.com/blog/sown

退出移动版