并发

Go语言的并发同步模式来自一个叫做通信顺序进程(Communicating Sequential Processes,CSP)的范型。CSP是一种消息传递模型,通过在goroutine 之间传递数据来传递消息,而不是对数据进行枷锁来实现同步访问。用于在goroutine 之间同步和传递数据的关键数据类型叫做通道(channel)。
1、并发
如上图所示,Go 语言运行时会把 goroutine 调度到逻辑处理器上运行,这个逻辑处理器绑定到唯一的操作系统线程上,当 goroutine 可以运行的时候,会被放入逻辑处理器的执行队列中。
2、
并发
如上图可知,当 goroutine 执行了一个阻塞的系统调用时,调度器会将这个线程与处理器分离,并创建一个新线程来执行这个处理器上提供的服务。
有时,正在运行的 goroutine 需要执行一个阻塞的系统调用,如打开一个文件。当这类调用发生时,线程和 goroutine 会从逻辑处理器上分离,该线程会继续阻塞,等待系统调用的返回。与此同时,这个逻辑处理器就失去了用来运行的线程。所以,调度器会创建一个新线程。并将其绑定到该逻辑处理器上。之后,调度器会从本地运行队列里选择另一个 goroutine 来运行。一旦被阻塞的系统调用执行完成并返回,对应的 goroutine 会放回到本地运行队列,而之前的线程会保存好,以便之后可以继续使用。
并发与并行的区别是:并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就暂时去做别的事情了。
如下图所示,展示了在一个逻辑处理器上并发运行 goroutine 和在两个逻辑处理器上并行运行两个并发的 goroutine 之间的区别。
并发
并发