最近要准备面试,面试中被比较多问到的一个问题就是多进程和多线程有什么区别的问题。以前看过一些资料,今天来总结一下。
进程是计算机资源调度的基本单位,所有与进程相关的资源都被记录在进程控制块PCB中,以表示进程拥有或正在使用它们,进程拥有一个完整的虚拟地址空间。与进程对应,线程是CPU资源调度的基本单位,它属于某一个进程,并与进程中其他线程共享进程资源,线程拥有自己的局部变量以及栈。
多线程的优点:
线程间通信效率高
程序逻辑和控制方式简单
线程切换代价较小
线程方式消耗的资源总量比进程方式少
多线程缺点:
每个线程与主线程共享地址空间,受限于地址空间大小
一个线程崩溃会影响整个程序的稳定性
线程之间同步和加锁控制比较麻烦
多进程的优点:
每个进程相对独立,子程序崩溃不影响主程序的稳定性
进程间同步方式相对简单,容易控制
可以充分利用每个进程地址空间
多进程缺点:
进程间通信效率低,不适合任务间数据量交互大的情况,适合小数据传送计算密集的情况
多进程调度开销比多线程大
windows系统下进程创建代价大,建议使用多进程的方式。linux系统进程创建代价小,建议使用多进程的方式。
现代计算机一般都拥有多个核心,每个核心可以运行不同的进程或线程。
当每个核心都运行一个进程时,由于每个进程资源独立,所以核心之间无需因共享数据带来开销。
当每个核心运行一个线程时,由于线程间需要共享资源,所以这些资源需要从一个核心缓存复制到另外一个核心缓存,这占用了额外的开销。所以,多核情况下,多进程优于多线程。
下面是到底是选择多进程还是多线程的几条处理原则:
1、需要频繁创建销毁的用多线程。
2、计算密集型应用优先考虑多线程。计算密集型应用一般CPU切换也频繁,线程切换代价小一些。
3、强相关的应用用多线程,弱相关的应用用多进程。
4、需要扩展到多机分布式处理的用多进程,多核用多线程。
5、容错性要求高的用多进程。
6、以上都不符合的使用最拿手的处理方式。