多线程以及多进程应该怎么选择?

原文链接:http://www.kokojia.com/article/20845.html

 

 在网上你可能会看到有很多的人问到底是使用进程好还是线程好?而你在教科书上会看到"进程是资源分配最小的单位,线程是CPU调度的最小单位"。但是这句话似乎还是没有解决我们心中的疑惑,到底是进程好还是线程好呢?下面我们来分析一下多进程和多线程的优缺点以及它们的对比。

  在对比两者之前我们先进行一个简单的了解:

  多进程:一个运行中的程序就叫做进程,当操作系统在执行一个程序的时候,会在系统中建立一个进程,而这个进程中,必须至少建立一个线程来作为这个进程运行的入口。

   优点:内存隔离,单个进程的崩溃不会导致这个系统的崩溃。而且进程方便测试以及编程简单

   缺点:创建销毁比较麻烦,进程间数据的共享麻烦,并且消耗的资源比较多。

 

 

 多线程:一个进程可以拥有多个线程,所以说线程是进程中的组成部分,也就说说一个线程必须会有一个父进程。线程自身是不能拥有系统资源的,但是它可以拥有自己的堆、栈、局部变量以及程序计算器。

   优点:可以提高系统的并行性,数据共享比较方便,切换比较快。

   缺点:由于没有内存的隔离,所以导致了一个线程的崩溃会导致整个进程的崩溃。编程复杂以及调试困难,线程执行的随机性可能导致逻辑混乱,甚至发生死锁现象;

  下面我们从几个方面对两者进行比较:

  数据共享以及同步

   多进程:由于它们具有独立的数据空间,数据共享复杂需要用到IPC,但是由于数据是分开的,所以同步比较简单。

   多线程:由于线程共享进程的数据,所以数据共享很简单。但是也因为这样导致同步麻烦。

   总结:虽然各有优势,但是由于进程的创建比较麻烦,所以可能线程比较便捷。

  内存以及CPU

   多进程:占用的内存比较多,CPU的利用率也比较低。

   多线程:相对于进程占用的内存比较少,CPU利用率高。

   总结:多线程比较有优势

  创建销毁以及切换

   多进程:创建的时候必须分配给它一个独立的地址空间,并且你还要建立很多的数据表供它维护它的数据以及代码

   多线程:创建销毁简单并且切换简单。

   总结:线程比较有优势

  编程以及调试

   多进程:编程简单并且调试也简单。

   多线程:编程和调试都很复杂。

   总结:进程占有优势

  可靠性

   多进程:进程之间不会互相有影响。

   多线程:如果一个线程挂掉会导致整个进程挂掉。

   总结:进程占有优势

  分布式

   多进程:适用于多核和多机分布式。

   多线程:适用于多核分布式。

   总结:进程占有优势。

 

  看完上面的对比,那是不是可以说那我到时候使用的时候更加倾向哪个方面就是用哪一个呢?当然不是。如何选择使用还是要看实际应用中遇到的问题。

  需要大量的计算

   如果你在实际的应用中需要大量的计算,那么你可以优先使用线程。由于大量的计算会耗费很多的CPU并且切换回很频繁。而我们上文中也有说到,线程的切换简单而且CPU的利用率高。

  需要频繁创建销毁

   如果你实际应用中需要大量的计算,那你可以优先选择使用线程。因为线程的创建销毁比进程的都要简单方便。就比如常见的web服务器,来一个连接就建立一个进程,然后断了就进行销毁。但是由于进程的创建和销毁很麻烦,所以一般都会选用线程。

  强相关、弱相关

   我们先看一个例子,一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。

   而一般来说强相关的处理使用线程,弱相关的处理使用进程。

  多机、多核分布

   上文中有说到,线程使用于多核分布式,所以多机分布使用进程,多核分布使用线程。

  上面只是简单的举了一些例子,但是如果多进程以及多线程都可以满足其要求,那么你可以选择你最为熟悉的那一个。说道这里千万不要认为进程和线程是两个东西,在实际的应用中基本的使用方式都是“进程+线程”。

  最后说一下设计时应该注意的事项:

   1)遇到常驻内存的进程,我们应该尽量避免。我们可以将这些进程的功能进行提取,让后做成一个小程序。在我们需要的时候再将它们拉起来。(如通过crontab配置,或直接system)。

   2)你可以将目标设计划分成功能不同的子系统,然后子系统之间遵循一些特定的协议,由通讯联系起来并协作完成目标。这样子可以提高重用的易用性以及维护性。

   典型的案例就是UnixLinux的工具使用。如:$ cat veglist fruitlist | sort > clist,用cat打开文件,协议是字符流,通过管道(通讯手段)传给sort进行排序,把排序的结果流重定向到文件中。这种自由组合协作风格应用思想和编程思路也是吸引众多UNIX拥护者的原因之一吧。

  总的来说,多线程以及多进程它们各自有各自的优点优势。而文中所说的如何选择多进程和多线程只是其中的一部分,该如何去选择实际上还有很多的因素。但最后还是要说一下的是进程和线程基本上都是结合在一起使用的,所以不要将两者分开看。

posted @ 2019-10-28 09:10  mude  阅读(827)  评论(0编辑  收藏  举报