进程、线程、协程


本来研究一个python异步编程的,然后看了这么多,本来就看个asyncio的。
新的知识,就再写一遍吧。虽然之前写过,但是其实那时候也没搞太清楚,稀里糊涂的。
这次算是把这些概念都搞清楚的。感谢GPT,感谢操作系统课程。

进程(process)

进程,即进行中的程序。是操作系统中,能够独立申请内存资源的最小单位
特性:

  1. 资源隔离:进程之间数据隔离,每个进程都申请和维护自己的资源。进程之间数据交互,可以通过消息队列实现。但是不能直接访问。
  2. 稳定:因为资源独立,所以有更好的稳定性
  3. 多进程编程:适合CPU密集型任务。

线程(Thread)

线程,进程中的内部单位,一个进程可以维护多个线程
线程是操作系统中,CPU资源分配调度的最小单位。每个线程可以被独立分配CPU资源。所以理论上可以实现多核CPU线程并行。

  1. 资源共享:一个进程内的所有线程内存资源共享,同一个进程内的不同线程可以相互访问内存(变量)。但是注意加锁,防止进程,脏写脏读。
  2. 最小CPU调度单位:在操作系统中,CPU分配的最小单位是线程而不是一个进程。(即传统操作系统课程中进程的PCB、调度算法等概念,对应线程也有TCB,只是把进程替换为线程)。
  3. 并发性:因为线程是最小CPU分配单位,所以线程之间,可以实现并发。相比进程并发,线程更轻量级。

协程(coroutine)

协程,运行在线程的内部。主要通过用户可控的协程调度,来提高线程内部操作的资源利用率。

  1. 协程的调度,完全由用户控制,而不是操作系统
  2. 协程更加轻量级,资源占用更少,运行线程中的一个子任务,如一个函数。
  3. 调度开销更小,协程由用户控制,调度过程在用户态完成,且协程数据上下文更小调度开销更小

线程和协程的区别

  1. 协程运行在线程内部,python的async关键字,对每一个函数创建一个协程对象,协程之间的调度,就是函数之间的调度。

协程解决的问题

在多线程的场景下,虽然每个线程之间,都可以做到并发或并行,但是每个线程内部的执行逻辑,本质上还是顺序执行。而当某个线程进入IO阻塞时,操作系统对该线程调度,释放CPU资源,并分配给另一个就绪的线程。而若此时没有就绪态的线程,则整个作业就阻塞了。
协程的出现,就是为了更高效的利用线程的CPU资源,尽量避免线程之间的调度,能够更细粒度的利用CPU资源。
每个协程之间,异步运行,当传统线程出现阻塞,就需要系统参与调度,释放CPU资源。而使用协程的线程,当内部的协程出现IO阻塞时,异步的运行另一个协程,而不是顺序执行等待(从而阻塞整个线程)。从而可以更细粒度的利用CPU,并且有效减少了线程之间的调度,减少系统开销。(本质上,可以看作线程对进程,对CPU资源,有了更细粒度的调度,PS但是协程本身不是CPU的最小分配单位,协程只是在线程内部,更好的利用CPU,本身不被分配CPU资源)
用户也可以通过await等关键字,来控制协程之间的异步运行顺序,保护临界资源或者临界区。

适合场景

  1. 多进程:需要强稳定性,并发场景,一般是CPU密集型任务。
  2. 多线程:最常用的CPU密集型任务选择
  3. 协程:IO密集型任务,可以有效利用IO时间,避免频繁调度(“抖动”)

pythonGIL

(Global Interpreter Lock)全局解释器锁。即python的一个解释器中的所有线程,都只能并发,不能并行,是为了更好的管理内存。
所以,在python中,想要达到真正的并行。只能通过:

  1. 多进程,每个进程维护自己的interpreter,所以多个进程之间,可以并发。

不过,在python中,虽然不能实现真正的并行,但是,通过协程,提升线程内部的资源利用率,也能有效提高IO密集型任务的效率,但是对CPU密集型的任务就没什么办法。
PS:python中的一些库,由于底层使用C,所以也能实现并发,如numpy。

java的JVM

java,维护一个JVM,所有java的线程,都是先创建在jvm上,然后再映射到系统的线程上,可以使得不同的平台之间,通用。java可以实现线程之间的并行。


附录

所以,其实本质上可以做到多进程,处理不同的任务。每个进程创建多线程,提升每个任务的处理性能。线程内部,使用协程,提升IO密集型任务的效率。减少线程调度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值