进程、线程、协程与 goroutine

1,812 阅读2分钟

进程

官话来说,进程就是程序运行时的表现,对比与静态的程序和数据,进程占用着计算机资源,例如进程号、内存空间,同时也是资源分配的最小单位。它拥有生命周期,例如在 linux 下面进程就有五种生命状态,如 runable。它就像是有生命一样存活在计算机里。

线程

线程是计算机系统中最小的执行单元,常看作是轻量级进程。多线程的出现是跟随着多核 cpu 出现的,多线程可以更好地利用多核 cpu 执行并行性任务。线程是交由内核调度的,需要保存许多的上下文,开销大。

协程

协程是一种 用户态 的轻量级线程,在用户态实现调度,也就是交由程序自己控制。协程的切换只需保留少量的上下文,切换起来更快。

三者区别

进程可以理解为对资源的隔离,线程是实际执行者。执行者共用同一组资源。可以将进程理解为一间屋子,里面有各种资源,线程是里面干活的人,大家用共用屋子里的东西做事情。而协程可以理解为同一个人做不同的事,切换起来很快,而不像线程那样切换起来还有沟通成本。

goroutine

golang语言作者Rob Pike也说,“Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法。一个运行的程序由一个或更多个goroutine组成。它与线程、协程、进程等不同。它是一个goroutine“。 Go 协程意味着并行,协程一般来说不是这样的;Go 协程通过通道来通信而协程通过让出和恢复操作来通信;而且Go 协程比协程更强大。因为Golang 在 runtime、系统调用等多方面对 goroutine 调度进行了封装和处理,也就是Golang 有自己的调度器,工作方式基本上是协作式,而不是抢占式,但也不是完全的协作式调度,例如在系统调用的函数入口处会有抢占。

参考

zhuanlan.zhihu.com/p/27245377
www.sohu.com/a/237171690…