共计 1838 个字符,预计需要花费 5 分钟才能阅读完成。
大家好,明天将梳理出的 Go 语言并发常识内容,分享给大家。请多多指教,谢谢。
本次《Go 语言并发常识》内容共分为三个章节,本文为第一章节。
- Golang 根底之并发常识 (一)
- Golang 根底之并发常识 (二)
- Golang 根底之并发常识 (三)
本章节内容
- 什么是并发、并行?
- 什么是原子操作?
- 什么是并发锁?
- 什么是通道?
本章节将以上 4 个问题,开展介绍。
什么是并发、并行?
首先,我先介绍操作系统中几个相干的知识点:过程、线程、协程。
过程:过程是程序在操作系统中的一次执行过程,零碎进行资源分配和调度的一个独立单位。(在 Linux 零碎中能够通过 ps -ef
命令查问)
线程:线程是过程的一个执行实体, 是 CPU 调度和分派的根本单位, 它是比过程更小的能独立运行的根本单位。(在 Linux 零碎中能够通过 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…