Linux环境下多进程和多线程的优缺点

时间:2023-01-03 16:43:07

多进程更稳定(一个线程挂掉整个程序挂,而一个进程挂掉不会影响其它进程)。

多线程更快捷(每个进程都要维护专属的虚拟地址空间,而每个线程共享一个虚拟地址空间,因此从调度开销方面考虑多线程占优)。

 

====================================================================================================

多线程的优点:

无需跨进程边界; 程序逻辑和控制方式简单; 所有线程可以直接共享内存和变量等; 线程方式消耗的总资源比进程方式好; 

多线程缺点:

每 个线程与主程序共用地址空间,受限于4GB地址空间; 线程之间的同步和加锁控制比较麻烦; 一个线程的崩溃影响到整个程序的稳定性; 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如在Linux环境下,每个线程私有空间大约是2M,因此运行1500个左右的线程数就已经 极限了(当然线程的私用空间大小可以改变); 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

-----------------------------------------------------

多进程优点:

每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系; 通过增加CPU,就可以容易扩充性能; 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系; 每个子进程都有4GB地址空间和相关资源,总体能够达到的性能上限非常大。

多线程缺点:

逻 辑控制复杂,需要和主程序交互; 需要跨进程边界,如果有数据量传送,需要通过各种IPC处理。密集运算多进程调度开销比较大; 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线 程+CPU+轮询方式来解决问题……

方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

---------------------------------------------------------

进程的优点:

1)顺序程序的特点:具有封闭性和可再现性;

2)程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。

进程的缺点:

1)操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。

线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。    

 

线程的优点:

1) 它是一种非常"节俭"的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和 数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间 远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。当然,在具体的系统上,这个数据可能会有较大的区 别;

2)线程间方便的通信机制,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便;

3)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上;

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

线程的缺点: 

1)调度时要保存线程状态,频繁调度需要占用大量的机时; 

2)程序设计上容易出错(线程同步问题)。

3)同步是往往通过加锁来实现的,而加锁往往是造成程序性能低下的主要原因。