[Linux]——多进程与多线程对比

多进程还是多线程

进程和线程是伴随我们学习操作系统时经常会提到的概念。那句"进程是分配系统资源基本实体,线程是CPU调度的基本单位"也成了经典的俩者关系的概括。但是随着深入的学习,我们发现只理解这句话是不够的,我们需要对比两者,找到两者各自的优点,具体结合场景讨论到底使用谁更好。

我们经常会看到一些一劳永逸的问题,“多进程和多线程哪个更好”、“Linux下用多进程好还是多线程好”。其实这种问法太过于绝对。仔细思考,如果真的某一者比另一者好,那么差的那一者应该早就被淘汰了吧。

多进程和多线程没有绝对的谁比谁好或者谁比谁差,还是需要结合具体的场景来进行选择。接下来我们就从不同的角度对多进程和多线程进行对比。

多进程与多线程对比

对比要素多进程多线程总结
数据共享、同步数据共享复杂,需要使用IPC;数据私有,同步简单共享进程数据;同步复杂,需要各种同步机制各有优势
内存、CPU占用内存多,CPU使用率低占用内存少,CPU使用率高线程较优
创建销毁、CPU创建销毁代价高,切换速度慢创建销毁代价低,切换速度快线程较优
可靠性进程间独立运行可靠性高在进程内运行,一个异常导致整个进程异常进程较优
分布式适应于多核、多机分布式多核分布式进程较优

上表中概括性的总结了进程和线程不同维度的优缺点比较,除了以上这些有的同学还会提到编程和调试的难度。其实这个笔者倒觉得他们俩五五开,因为你对哪个更熟悉也就觉得哪个更简单。

如何选择两者?

具体如何选择我们就一定要结合场景了,下面就给大家列举出几种不同的场景:

需要频繁创建销毁的优先用线程

需要频繁创建和销毁的应用绝对要提到web服务器啦,每接受一个请求就建立线程,而断开就销毁线程。从上表中我们对比进程和线程可以知道,进程的创建销毁不管从使用资源还是速度上来说都是没有线程优的。所以此场景下大力推荐使用线程

需要进行大量计算的优先使用线程

所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的

强相关的处理用线程,弱相关的处理用进程

如何理解强相关和弱相关呢?这俩个关键词非要下一个定义反而让人不好理解。举一个生活中的栗子,你刷牙和涂牙膏动作就属于强相关,而你涂牙膏和洗脸的动作就属于若相关。

之所以弱相关选择进程还是因为考虑到了可靠性的问题,俩个模块能分开就不要放在一起。学过软件设计的同学也就一定听过一句话"高内聚,低耦合"。线程异常往往会导致整个进程出问题。

可能要扩展到多机分布的用进程,多核分布的用线程

这个不难理解,多线程也仅仅能实现多内核的分布式。

未必一定非此即彼

其实大多数情况下,在多线程和多进程没有特别大差异的情况下你还是需要选择你最熟悉的那个进行编程。并且鱼与熊掌未必不可兼得,编程中我们还是要灵活的分析各种情况,有时候选择"进程+线程"才能让我们的程序到达最优的情况。

其他因素

资源的消耗

一个进程的开销大约是一个线程开销的30倍左右,所以某种情况下从资源使用程度来看线程确实是比进程更好的选择。

通讯方式

我们之前说过进程间通信是有难度的,实际上进程间通信是为了让他们看到同一份资源。所以进程在通信时还要使用其他额外的通信机制。而线程本身就是共享同一份资源,只要确保数据安全的情况下做好同步工作,线程间的通信就会比进程简单很多。

总结

所有的东西都没有绝对的优秀,关键还是在于不同场景下的选择。进程和线程是如此,人生亦是如此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值