Go 语言学习笔记-并发编程

Go 并发编程

概述

简而言之,所谓并发编程是指在一台处理器上“同时”处理多个任务。

  • 宏观的并发:是指在一段时间内,有多个程序在同时运行。

  • 微观的并发:是指在同一时刻只能有一条指令执行,但多个程序指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但是在微观上并不是同时执行的,只是把时间分为若干段,使多个程序快速交替的执行。

并行和并发

  • 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行
并行.jpg
  • 并发(concurrency):通过 cpu 时间片轮转使多个进程快速交替的执行。
并发.jpg
  • 以咖啡机的例子来解释并行和并发的区别:
并行与并发.jpg
  • 并行是两个队列同时使用两台咖啡机(真正的多任务)
  • 并发是两个队列交替使用一台咖啡机(假的多任务)

常见的并发编程技术

进程并发

程序与进程

  • 程序:是指编译好的二进制文件,在磁盘上,占用磁盘空间,不占用系统资源(cpu、锁…)。

  • 进程:运行起来的程序。占用系统资源。

把程序比作剧本,进程比作戏(舞台、演员…),同一个剧本可以在多个舞台同时上演。同样,同一个程序也可以加载为不同的进程(彼此之间互不影响)。

如:同时开两个终端。各自都有一个 bash 但彼此 ID 不同。

在 windows 系统下,通过查看“任务管理器”,可以查看相应的进程。运行起来的程序就是一个进程。

进程状态

进程基本的状态有 5 种:初始态、就绪态、运行态、挂起态与终止态。其中初始态为进程准备阶段,常与就绪态结合来看

进程状态.jpg

进程并发会出现的问题

  1. 系统开销比较大,占用资源比较多,开启进程数量比较少。
  2. 在 unix/linux 系统下,还会产生孤儿进程僵尸进程

在 unix/linux 系统中,正常情况下,子进程是通过父进程 fork 创建的,子进程再创建新的进程。并且父进程永远无法预测子进程到底什么时候结束。当一个进程完成他的工作终止之后,它的父进程需要调用系统调用子进程的终止状态。

windows 下的进程和 Linux 下的进程是不一样的,它比较懒惰,从来不执行任何东西,只是为线程提供执行环境。然后由线程负责执行包含在进程的地址空间中的代码。当创建一个进程的时候,操作系统会自动创建这个进程的第一个线程,成为主线程。

  • 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,自进程的父进程成为 init 进程,称为init 进程领养孤儿进程。

  • 僵尸进程:进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。

线程并发

什么是线程

  • LWP:light weight process 轻量级的进程,本质仍是进程(Linux下)
  • 进程:独立地址空间,拥有 PCB
  • 线程:有独立的 PCB,但没有独立的地址空间(共享)
  • 区别:在于是否共享地址空间。独居(进程);合租(线程)
    • 线程:最小的执行单位
    • 进程:最小的分配资源单位,可看成是一个现成的进程。
进程和线程.png

在 Windows 系统下,可以直接忽略进程的概念,只谈线程。因为线程是最小的执行单位,是被系统独立调度和分派的基本单位。而进程只是给线程提供执行环境。

线程同步

同步即协同步调,按预约的先后次序运行。

线程同步,只一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其他线程为保证数据一致性,不能调用该功能。

  • 举例1:银行存款 5000。同一时刻,柜台存折取3000,提款机用卡取3000.剩余:2000。

产生的现象叫做“与时间有关的错误”(time related)。为了避免这种数据混乱,线程需要同步。

同步的目的是为了避免数据混乱,解决与时间有关的错误。实际上,不仅线程间需要同步,进程间、信号间等等都需要同步机制。

因此,所有多个控制流,共同操作一个共享资源的情况,都需要同步

线程同步机制 - 锁的应用

  • 互斥锁 mutex(也称之为互斥量)。每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。但是同一时刻,只能有一个线程持有该锁,没有拿到锁的线程,阻塞等待。等到拿到锁的线程释放锁。
互斥锁.png
  • 读写锁:与互斥锁类似,但读写锁允许更高的并行性。其特征为:写独占,读共享。读锁、写锁并行阻塞,写锁优先级高

    • 读写锁也叫共享-独占锁。当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁住时,它是以独占模式锁住的。写独占,读共享

协程并发

协程:coroutine。也叫轻量级线程。

一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源

在协程中,调用一个任务就像调用一个函数一样,消耗的系统资源最少,但能达到进程、线程并发相同的结果。

在一次并发任务中,进程、线程、协程可以实现。从系统资源消耗的角度出发来看,进程相当多,线程次之,协程最少

比较

进程、线程、协程都可以完成并发。进程稳定性强、线程节省资源、协程效率高

Go 并发

Go 在语言级别支持协程,叫 goroutine。Go语言标准库提供的所有系统调用操作(包括所有同步的 IO 操作),都会出让 CPU 给其他 goroutine。这让轻量级线程的切换管理不依赖于系统的线程和进程,也不需要依赖于 CPU 的核心数量。

Go 从语言层面就支持并行。同时,并发程序的内存管理有时候是非常复杂的,而 Go 语言提供了自动垃圾回收机制。

Go 语言为并发编程而内置的上层 API 基于顺序通信进程模型 CSP(communicating sequential process)。这就意味着显示锁是都可以避免的,因为 Go 通过相对安全的通道发送和接收数据以实现同步,这大大的简化了并发程序的编写。

Go 语言中的并发程序主要使用两种手段来实现:goroutinechannel

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容