Go并发编程 | 青训营笔记

50 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第3天

Go并发编程

并发与并行

并发

把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。多线程程序在一个核的cpu上运行

并行

并行把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。多线程程序在多个核的cpu上运行

Go

服务器的处理器大都是单核频率较低而核心数较多,对于支持高并发的程序语言,可以充分利用服务器的多核优势,从而降低单核压力,减少性能浪费。而GO可以充分发挥多核优势,高效运行。

进程、线程、协程

进程

进程是系统进行资源分配的最小单位,是操作系统结构的基础。切换时需要切换虚拟内存空间和上下文,开销大

线程

线程是系统能够运行运算调度的最小单位。同一进程中的多条线程共享该进程中的全部系统资源。切换时不需要切换虚拟内存空间,但切换上下文的开销也较大。

协程

协程,又被称为微线程,顾名思义,就是轻量级的线程。 协程切换过程完全在用户空间发生。把当前协程 A 的 CPU 寄存器状态保存起来,然后将需要切换进来的协程 B 的 CPU 寄存器状态加载到 CPU 寄存器上就可以。开销小。

管道和共享内存

提倡通过通信共享内存而不是通过共享内存实现通信

共享内存

进程可以直接读写内存,而进程之间不需要通过任何数据的拷贝。但由于出现多个进程共享一段内存的情况,需要依靠互斥锁,信号量等同步机制来实现内存共享的功能。

channel

本质就是一个数据结构-队列。写进程写入,读进程读出,先进先出。线程安全,多goroutine访问时,不需要加锁,就是说channel本身就是线程安全的