大家好,明天将梳理出的 Go语言并发常识内容,分享给大家。 请多多指教,谢谢。

本次《Go语言并发常识》内容共分为三个章节,本文为第一章节。

  • Golang 根底之并发常识 (一)
  • Golang 根底之并发常识 (二)
  • Golang 根底之并发常识 (三)

本章节内容

  • 什么是并发、并行?
  • 什么是原子操作?
  • 什么是并发锁?
  • 什么是通道?

本章节将以上4个问题,开展介绍。

什么是并发、并行?

首先,我先介绍操作系统中几个相干的知识点:过程、线程、协程

ps -ef
ps -efT

协程:独立的栈空间,共享堆空间,调度由用户本人管制,实质上有点相似于用户级线程,这些用户级线程的调度也是本人实现的。 (在零碎中无奈查看,只能从程序代码中查看)

一个过程能够创立和撤销多个线程。

一个线程上能够跑多个协程,协程是轻量级的线程。

并发介绍

并发次要体现在单核CPU上,以切换工夫片来实现 “同时” 运行。

这里的同时并不是真正的,因为单核CPU无奈做到让A、B、C三个线程在同时运行,只能通过来回切换形式运行。同一时刻只能运行一个实例。

并行介绍

并行次要体现在多核CPU上,则是利用多核实现同时运行。

当零碎有一个以上CPU时,A、B、C过程在不同CPU (逻辑核)调度,各过程互不抢占CPU资源,能够同时进行。

并发的多个工作之间是相互抢占资源的。

并行的多个工作之间是不相互抢占资源的.

什么是原子操作?

原子操作能够了解为:在进行过程中不能被中断的操作。也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不会再去进行其它的针对该值的操作。无论这些其它的操作是否为原子操作都会是这样。

为了实现这样的严谨性,原子操作仅会由一个独立的CPU指令代表和实现。只有这样才可能在并发环境下保障原子操作的相对平安。

Go语言提供的原子操作都是非侵入式的,它们由规范库代码包sync/atomic中的泛滥函数代表。

sync/atomic函数库的应用,将在后续go语言并发应用章节给大家介绍。

什么是并发锁?

举例

如果两个或者多个线程在没有相互同步状况下,拜访某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种状况被称作竞争状态 (race candition)。 竞争状态的存在是让并发程序变得复杂的中央,非常容易引起潜在问题。对一个共享资源的读和写操作必须是原子化,能够了解为,同一时刻只能有一个 线程 对共享资源进行读和写的操作。

一种避免竞争状态的办法:应用锁机制,锁住共享资源,从而保障线程的同步状态。

这里简略介绍下 互斥锁 概念,互斥锁这个名字来自互斥(mutual exclusion)的概念,互斥锁用于在代码上创立一个临界区,保障同一个工夫只有一个线程能够执行这个临界区代码。

扩大内容

死锁:能够了解为实现一项工作的资源被两个(或多个)不同的协程别离占用了,导致它们全都处于期待状态不能实现上来。

活锁:例如两个或多个协程在执行时别离占用了局部资源导致无奈执行。于是他们都开释资源并从新申请,可是仍旧碰撞,导致依然无奈执行。

饥饿:示意在任何状况下,并发线程都无奈取得执行所需的所有资源。

什么是通道?

channel的应用和介绍,曾经在 Golang 根底之根底语法梳理 (二) 文章中介绍了,不理解的小伙伴能够前去观看。

基于之前文章,我在进行几点补充:

Go提供了一种称为通道的机制,通道(chan)是goroutine之间传递特定值的通信机制,用于在goroutine之间共享数据。当作为goroutine执行并发流动时,须要在goroutine之间共享资源或数据,通道充当goroutine之间的管道并提供一种机制来保障同步替换。

它属于 通信顺序进程并发模式(Communicating sequential processes,CSP)

Go语言中还有另一种并发模式,即共享内存多线程的传统模型 MPG。

以通信的伎俩来共享内存 — 是Go的一种重要个性,也是特有的机制。

goroutine 、并发同步模型CSP 等内容知识点,下章节为大家介绍

技术文章继续更新,请大家多多关注呀~~

搜寻微信公众号【 帽儿山的枪手 】,关注我


参考资料

《Go语言实战》书籍
并发介绍 https://www.topgoer.cn/docs/g…