进程、线程、多进程、多线程的优缺点

iOS-多线程与网络 专栏收录该内容
11 篇文章 0 订阅

一. 在Linux下编程多用多进程编程少用多线程编程

IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。

如果是UNIX/linux环境,采用多线程没必要。多线程比多进程性能高?误导!应该说,多线程比多进程成本低,但性能更低。在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。

多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。多线程是平面交通系统,造价低,但红绿灯太多,老堵车。就比如我们都开跑车,油(主频)不是问题,也不怕上坡下坡,但就怕堵车。

高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。


二. 进程

1. 进程的优点

  • 顺序程序的特点:具有封闭性和可再现性;
  • 程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提高了系统的效率和系统的资源利用率。

2. 进程的缺点

  • 操作系统调度切换多个线程要比切换调度进程在速度上快的多。而且进程间内存无法共享,通讯也比较麻烦。
  • 线程之间由于共享进程内存空间,所以交换数据非常方便;在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

三. 线程

1. 线程的优点

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

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

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

2. 线程的缺点

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

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


四. 多进程

1. 多进程优点

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

2. 多进程缺点

  • 逻辑控制复杂,需要和主程序交互;
  • 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
  • 多进程调度开销比较大;

五. 多线程

1. 多线程的优点

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

2. 多线程缺点

  • 每个线程与主程序共用地址空间,受限于2GB地址空间;
  • 线程之间的同步和加锁控制比较麻烦;
  • 一个线程的崩溃可能影响到整个程序的稳定性;
  • 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
  • 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

在开发中,最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题。方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

  • 1
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

<p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">为什么要学JVM</span></strong></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">1一切JAVA代码都运行在JVM之上,只有深入理解虚拟机才能写出更强大代码,解决更深层次问题。</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">2JVM是迈向高级工程师架构师必备技能,也是高薪高职位不二选择。</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">3同时,JVM又是各大软件公司笔试面试重中之重,据统计,头部30家互利网公司,均将JVM作为笔试面试内容之一。</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">4JVM内容庞大并且复杂难学,通过视频学习是最快速学习手段。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">课程介绍</span></strong></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">本课程包含11个大章节,总计102课时,无论是笔试面试,还是日常工作,可以让您游刃有余。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;"><img src="https://img-bss.csdnimg.cn/202105152200003850.png" alt="" /></span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第1章 基础入门,从JVM是什么开始讲起,理解JDKJREJVM关系,java编译流程和执行流程,让您轻松入门。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第2章 字节码文件,深入剖析字节码文件全部组成结构,以及javap和jbe可视化反解析工具使用。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第3章 类加载解释编译,本章节带你深入理解类加载器分类范围双亲委托策略,自己手写类加载器,理解字节码解释器即时编译器混合模式热点代码检测分层编译等核心知识。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第4章 内存模型,本章节涵盖JVM内存模型全部内容,程序计数器虚拟机栈本地方法栈方法区永久代元空间等全部内容。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第5章 对象模型,本章节带你深入理解对象创建过程内存分配方法让你不再稀里糊涂。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第6章 GC基础,本章节是垃圾回收入门章节,带你了解GC回收标准是什么,什么是可达性分析安全点安全区,四种引用类型使用和区别等等。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第7章 GC算法与收集器,本章节是垃圾回收重点,掌握各种垃圾回收算法,分代收集策略,7种垃圾回收器原理和使用,垃圾回收器组合及分代收集等。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第8章 GC日志详解,各种垃圾回收器日志都是不同,怎么样读懂各种垃圾回收日志就是本章节内容。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第9章 性能监控与故障排除,本章节实战学习jcmdjmxjconsuljvisualvmJMCjpsjstatdjmapjstackjinfojprofilejhat总计12种性能监控和故障排查工具使用。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第10章 阿里巴巴Arthas在线诊断工具,这是一个特别小惊喜,教您怎样使用当前最火热arthas调优工具,在线诊断各种JVM问题。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">第11章 故障排除,本章会使用实际案例讲解单点故障高并发和垃圾回收导致CPU过高问题,怎样排查和解决它们。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">课程资料</span></strong></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">课程附带配套项目源码2个</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">159页高清PDF理论篇课件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">89页高清PDF实战篇课件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">Unsafe源码PDF课件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">class_stats字段说明PDF文件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">jcmd Thread.print解析说明文件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">JProfiler内存工具说明文件1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">字节码可视化解析工具1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">GC日志可视化工具1份</span></span></p> <p style="color: #676767; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">命令行工具cmder 1份</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><strong><span style="color: #008781; font-size: 16px;">学习方法</span></strong></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">理论篇部分推荐每天学习2课时,可以在公交地铁上用手机进行学习。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">实战篇部分推荐对照视频,使用配套源码,一边练习一遍学习。</span></span></p> <p style="color: #676767; font-size: 14px; background-color: #ffffff;"><span style="color: #676767;"><span style="font-size: 14px;">课程内容较多,不要一次性学太多,而是要循序渐进,坚持学习。</span></span></p> <p><img src="https://img-bss.csdnimg.cn/202103270814406060.jpg" alt="" /></p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p>
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值