zoukankan      html  css  js  c++  java
  • 鱼还是熊掌:浅谈多进程多线程的选择

    鱼还是熊掌:浅谈多进程多线程的选择


    进程是操作系统调度以及进行资源分配的基础单位,是一个资源单位

    线程是操作系统可以运算调度的最小单位,是真正的执行单位,其包含在进程中,一个线程就是一条固定的控制流程。

    这两句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。

    到底要如何选择,我只能说:没有最好,只有更好,不存在一个好的不得了,另一个差的无法忍受的情况,他们并不是非此即彼的。根据实际情况来判断,哪个更加适合就是哪个好。

    我们按照多个不同的维度,来看看多线程和多进程的对比(再次强调:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。

    对比维度 多进程 多线程 总结
    数据共享、同步 数据共享复杂,需要用IPC;数据是分开的,同步更可控 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步可控性低 各有优势
    内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 线程占优
    创建销毁、切换 创建销毁、切换复杂,速度慢 创建销毁、切换简单,速度很快 线程占优
    编程、调试 编程简单,调试简单 编程复杂,调试复杂 进程占优
    可靠性 进程间不会互相影响 一个线程挂掉将导致整个进程挂掉 进程占优
    分布式 适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单 适应于多核分布式 进程占优

    1)线程中数据共享简单,进程中数据同步更可控

    是不是因为进程中虽然使用共享内存方式较为复杂,但是可控性强,想同步的数据就可以同步,而在线程中大家都是同步的,只有通过局部变量全局变量来控制,所以同步复杂呢?

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

    原因请看上面的对比。

    这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

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

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

    这种原则最常见的是图像处理、算法处理。

    4)当这个事件需要一直处于活动状态时,那就应该使用进程

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

    什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

    一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。

    当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

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

    原因请看上面对比。

    7)都满足需求的情况下,用你最熟悉、最拿手的方式

    至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。

    需要提醒的是:虽然给出了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。

    消耗资源:

    从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

    线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。

    通讯方式:

    进程之间传递数据只能是通过通讯的方式,即费时又不方便。线程时间数据大部分共享(线程函数内部不共享),快捷方便。但是数据同步需要锁对于static变量尤其注意

    线程自身优势:

    提高应用程序响应;使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;

    改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。

  • 相关阅读:
    HDU2054_A == B ?【模拟题】【大数】【水的问题】
    hadoop结构出现后format变态
    jquery的clone办法bug修复
    Django学习笔记(三)—— 型号 model
    华夏的理财30天A和华夏财富宝货币哪个收益比较好?
    网贷平台公司 必看
    网贷平台 平安 陆金所
    网贷平台公司 各平台投资收费比较
    2012年网贷平台全国排名
    新进网贷的小散 感受
  • 原文地址:https://www.cnblogs.com/lucky75/p/11140688.html
Copyright © 2011-2022 走看看