进程、线程、协程的区别?

这里首先要区分一下OS是有线程OS还是无线程OS。典型的有线程OS就是Windows,无线程OS的代表就是Linux。
对于Windows来说,进程和线程的概念都是有着明确定义的,进程的概念对应于一个程序的运行实例(instance),而线程则是程序代码执行的最小单元。也就是说在Windows下谈论进程与线程的区别才是有意义的,这和在学校里学到的OS相关概念也是一致的。
而对于Linux来说,Linux内核中并没有线程的概念,只有进程,对应到具体的数据结构就是task_struct,但是LWP(Light-weight process,轻量级进程)可以让进程表现得像Windows中线程一样。
至于phread库,在内核中创建的“线程”其实也是一个LWP。

进程是OS进行资源调度和分配的基本单位,线程是CPU分配的最小单位,协程是用户级别的、由用户自行处理程序之间的切换。

进程和线程的区别:
1.进程是OS进行资源调度和分配的基本单位;线程是CPU调度和分配的基本单位。
2.一个进程包含一个或多个线程,且至少包含一个主线程;一个线程只能依赖于一个进程而存在。
3.没有亲缘关系的进程之间是相互独立、互不影响的;一个线程挂掉整个进程就挂了。
4.进程适用于多核、多机并行;线程适用于多核。
5.一个进程中的多个线程共享该进程的代码段、数据段、扩展段(堆存储),每个线程只各自拥有运行所必要的一小部分资源以及栈段(又叫运行时段)。
6.进程创建、销毁、切换的系统开销大,而线程小。创建和销毁之所以开销大,是因为这期间会涉及到资源的分配和回收。进程切换时需要保存原来的CPU环境、设置新的CPU环境,而线程只涉及到保存和设置部分寄存器的值,不涉及存储器的管理。
7.多进程程序调试相对简单,多线程较为复杂,复杂之处就在于线程之间共享进程的内容很容易发生访问冲突。
8.由于同一进程中的多个线程共享相同的地址空间,所以线程间通信就相对容易。线程之间可以借助全局变量来完成通信。

协程和线程的关系:
协程又叫微线程、纤程,英文是coroutine。它其实就是一种特殊的函数,由用户控制在各个函数之间进行切换,但这个过程都是在同一个线程中发生的,没有产生线程切换,而且协程切换执行也不需要解决同步问题、不需要引入锁机制,所以协程切换的开销要小得多,效率也很高。在多核场景下,多个线程是可以实现并行的,但是每个线程内的协程一定是串行的,当一个协程执行的时候,其他协程要被挂起。

编程语言中的协程:
Python2
python2中有yield和gevent。
使用yield之后,对应函数就变为了generator,调用后返回的是iterable对象,每次执行到yield的时候就返回迭代器,调用next()时又会从yield语句的下一条继续向下执行。
gevent是通过greenlet实现的,当每一个greenlet遇到IO操作要阻塞的时候,就会自动切换到其他greenlet,等到IO操作执行完之后再继续回来执行。
Python3
python3.5引入了async和await,被async标记的函数会被视作coroutine扔到消息循环里,await后面只能跟异步函数或者带有__await__属性的对象,假设异步函数a在程序运行过程中遇到await b,b是个异步函数,那么就会挂起当前函数,转而去执行函数b,当挂起条件消失时,无论是否执行完b中的内容,都必须切换回来继续执行原来的内容。
Golang
goroutine是go语言中最基本的执行单元,每个go程序至少有一个goroutine,那就是在程序运行时产生的主goroutine。
goroutine和普通协程的区别在于,它能够支持并发,而且可以运行在一个或多个线程上。核心机制的实现是基于GMP模型的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值