进程 线程 协程

进程 线程 协程

进程

进程的出现是为了让计算机去是充分的利用CPU资源,如果计算机没有进程的话,两个任务就会顺序执行,不能实现”调度算法“,就是在任务A读取数据的时候,任务B使用计算资源,当A读取完数据后,再切换到任务A执行。并通过进程的调度。来实现上下文切换,所以,进程是系统资源分配的最小单位,进程是由进程控制块程序段、数据段三部分组成。 进程之间可以通过管道,有名管道,信号量,消息队列,信号,共享内存,套接字来进行通信。

线程

线程的出现是为了降低上下文切换的消耗,提高系统的并发性,使进程内的并发成为可能,突破一个进程只能干一件事的缺陷。若多个进程,每个进程各自负责性质一样的任务,那么每个任务之间的协作就涉及到了进程间通信的问题,对于共同需要的资源,进程间要不停的切换,这在性能上又很大的损失,线程就是为了解决这个问题而产生的,用共享内存来实现通信。需要所以线程共享进程的大部分资源,线程也有自己的资源比如栈,寄存器等等。

协程

golang里面的Gorotines其实就是协程,协程可以看成很低配的线程,一个线程最小是1M,但是一个协程只要2K,这使得在Go可以运行起成千上万个协程,而且不需要程序员去管理这些协程,他们的大小是会自己适应变化的。当涉及到大规模的并发连接时,比如10K的连接,使用线程作为处理单位,系统调度开销还是过大,当这个时候就又陷到了跟进程上下文切换的资源开销问题,所以Go的并发思想是:用通信实现内存共享,而不是用内存共享实现通信,所以就有了Golang的channel

但是也不是说用协程就一定比线程快,CPU密集型应用适合使用多线程,(CPU一直在利用着,切换反而会造成性能损失)而IO密集型应用适合使用多协程。

原文地址:https://www.cnblogs.com/Jun10ng/p/12616342.html