线程、进程、协程的区别

进程、线程、协程是为了满足用户的多任务任务需求。比如一边写代码一边听音乐。

单核的 CPU 一次只能执行一个任务,想要实现多任务,需要把 CPU 的运行时间切成一段一段的时间片,每个时间片运行一个程序,循环的分配时间片给不同的应用程序。

由于时间片非常的短,在用户看来,就像是多个任务同时在运行。

进程

进程是系统资源分配的最小单位, 系统由一个个进程(程序)组成
一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

文本区域存储处理器执行的代码
数据区域存储变量和进程执行期间使用的动态分配的内存;
堆栈区域存储着活动过程调用的指令和本地变量。

进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间, 建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。

线程是共享进 程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小 很多,同时创建一个线程的开销也比进程要小很多。

线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据, 而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编 写多线程程序的难点。

线程

线程属于进程
线程共享进程的内存地址空间
线程几乎不占有系统资源
通信问题: 进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等

Java中线程具有五种状态:
初始化 可运行 运行中 阻塞 销毁

这五种状态的转化关系如下:

在这里插入图片描述
最经典的例子就是生产者/消费者模式
若干个生产者线程向队列中写入数据,若干个消费者线程从队列中消费数据。

协程

协程是属于线程的。协程程序是在线程里面跑的,因此协程又称微线程和纤程等
协没有线程的上下文切换消耗。协程的调度切换是用户(程序员)手动切换的,因此更加灵活,因此又叫用户空间线程.
原子操作性。由于协程是用户调度的,所以不会出现执行一半的代码片段被强制中断了,因此无需原子操作锁。

迭代器:实现了迭代接口的类,接口函数例如:current,key,next,rewind,valid。
例如:在Java的foreach遍历迭代器(针对数组),Python的for遍历迭代器对象(针对tuple,list,dist)。

生成器:使用yeild关键字的函数,可以多次返回值,生成器算是实现迭代器的接口
当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。
但是,yield让协程暂停,和线程的阻塞是有本质区别的。协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。
因此,协程的开销远远小于线程的开销。
python可以通过 yield/send 的方式实现协程。在python 3.5以后,async/await 成为了更好的替代方案。

进程与线程的区别

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。
线程与进程的区别归纳:

a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

c.调度和切换:线程上下文切换比进程上下文切换要快得多。

d.在多线程OS中,进程不是一个可执行的实体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值