https://www.cnblogs.com/work115/p/5620272.html
https://www.cnblogs.com/guolei2570/p/8810536.html(推荐)
进程
进程是系统进行资源分配和调度的一个独立的单位;
系统由一个个进程(程序)组成 一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。
- 文本区域 存储处理器执行的代码
- 数据区域 存储变量和进程执行期间使用的动态分配的内存;
- 堆栈区域 存储着活动过程调用的指令和本地变量。
进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程,因此使得看上去就像是多个进程在同时进行。
进程间通信(IPC)
通常linux中的进程通信方式有:消息队列、信号量、共享内存、信号、管道、socket。(摘自:http://www.php.cn/php-weizijiaocheng-388497.html)
管道通信:https://blog.youkuaiyun.com/qianyayun19921028/article/details/81395564
传统unix系统命令创建的管道是单向的(半双工方式)此时数据传递的方向是单向的,即所创建的文件描述符一端只能用于读,另一端只能用于写,若需要双方数据传递时则需要建立两个管道文件。
线程
线程是进程的实体,是cpu调度和分配的基本单位
- 一个程序至少有一个进程,一个进程至少有一个线程;
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;
- 线程是操作系统能够进行运算调度的最小单位。
- 线程不能够独立执行,必须依存在进程中;
- 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人。
多线程通信:https://blog.youkuaiyun.com/chenyijun/article/details/79401710 https://www.cnblogs.com/Wenxu/p/7979023.html
协程
一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。
协程(协同程序): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。
线程: 同一时间可以同时执行多个线程。开辟多条线程开销很大。线程适合多任务同时处理。
- 协程是属于线程的。协程程序是在线程里面跑的,因此协程又称微线程和纤程等
- 协程没有线程的上下文切换消耗。协程的调度切换是用户(程序员)手动切换的,因此更加灵活,因此又叫用户空间线程.
- 原子操作性。由于协程是用户调度的,所以不会出现执行一半的代码片段被强制中断了,因此无需原子操作锁。
在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定
注:在go语言中,协程相当于异步操作;(在方法A里面执行方法B,不需要等待B的执行而继续执行自身代码)
线程、进程、协程的区别
进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。
线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是这样的)。
协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度。
一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行。
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。
https://www.jianshu.com/p/e2fb46e10878
1.栈:当程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会被释放,这个栈中的变量也将随之释放。
2.堆:存放不在当前方法栈中的那些数据