进程、线程和协程的区别且它们之间的关系

本文深入探讨了多线程、多进程及协程的概念与区别,分析了它们在不同场景下的适用性,尤其强调了计算密集型与I/O密集型任务如何选择最佳并发模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程与多进程

进程、线程和协程的区别
进程:充分利用多CPU

线程:充分利用多核(达到真正的多任务并行)

协程:充分利用单核(充分挖掘不断提高性能的单核CPU的潜力。类比事件驱动和异步程序)。既可以利用异步优势,又可以避免反复系统调用,还有进程切换造成的开销。

协程存在的意义:
对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。协程能保留上一次调用时的状态,不需要像线程一样用回调函数,所以性能上会有提升。
缺点:本质是个单线程,不能利用到单个CPU的多个核。
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

切换开销(即调度和切换的时间):进程 > 线程 > 协程

进程和线程的区别:
关键词:cpu,io密集型计算概念

概要:
计算密集型 (CPU-bound)(适合多进程,而多线程是鸡肋)和I/O密集型 (CPU-bound) (适合配置多线程,充分利用CPU资源)

应用区别(上面PS中具体提到的):
计算密集型程序适合C语言多线程
I/O密集型适合脚本语言开发的多线程。

内容:
CPU密集型(根据实际的发生场景,也可以叫它计算密集型)的程序,如涉及到大量的计算(如计算圆周率、对视频进行高清解码),这种任务主要消耗CPU资源,本身不太需要访问I/O设备,所以多线程是鸡肋,因为线程切换也是要耗时的。
(PS:Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。)

I/O 密集型的的程序(如网络、磁盘IO)一般在达到性能极限时,CPU占用率仍然较低。
它的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)
因为任务本身需要大量I/O操作,此时用多线程,能充分利用CPU资源。因为I/O操作时,程序会有很多等待的机会,此时系统会切换到其他线程,把等待的时间利用上。
对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。
(PS:对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。)

常见的大部分任务都是IO密集型任务,比如Web应用。

应用区别(上面PS中具体提到的):
计算密集型程序适合C语言多线程
I/O密集型适合脚本语言开发的多线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值