Golang:并发性Concurrency

Posted by Viletyy on 2020-05-24 10:01

并发性Concurrency

多任务

指操作系统可以同时执行多个任务

什么是并发

并发性Concurrency是同时处理许多事情的能力。

举个例子,假设一个人在晨跑。在晨跑时,他的鞋带松了。现在这个人停止跑步,系鞋带,然后又开始跑步。这是一个典型的并发性示例。这个人能够同时处理跑步和系鞋带,这是一个人能够同时处理很多事情

什么是并行性parallelism,它与并发concurrency有什么不同

同样的例子。在这种情况下,我们假设这个人正在慢跑,并且使用它的手机听音乐。在这种情况下,一个人一边慢跑一遍听音乐,那就是他同时在做很多事情,这就是所谓的并行性(parallelism)

进程、线程、协程

进程(Process) 是一个程序在一个数据集中的一个动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成那些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

线程(Thread) 是在进程之后发展出来的概念。线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID,程序计数器、寄存器集合和堆栈共同组成,一个进程可以包含多个线程。线程的优点是减小了程序并发执行时的开销,提高了操作系统的并发性能,缺点是线程没有自己的系统资源,只拥有在运行时必不可少的资源,但同一进程的各线程可以共享进程所拥有的系统资源,如果把进程比做一个车间,那么线程就好比是车间里面的工人。不过对于某些独占性资源存在锁机制,处理不当可能会造成死锁。

协程(Coroutine,也叫轻量级线程) 是一种用户态的轻量级线程,又称微线程,英文名Coroutine,协程的调度完全由用户控制。人们通常将协程和子程序(函数)比较着理解。子程序的调用总是一个入口,一次返回,一旦退出即完成了子程序的执行。

与传统的系统级线程和进程相比,协程最大的优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常最多也不能超过一万的。这也是协程也叫轻量级线程的原因

协程与多线程相比,其优势体现在:协程的执行效率极高。因为子程序切换而不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显

Go语言对于并发的实现是靠协程——Goroutine