关于后端:多进程和多线程应用场景

54次阅读

共计 1572 个字符,预计需要花费 4 分钟才能阅读完成。

开发程序的计划阶段常常须要用到多线程或者多过程。本文介绍两种形式的优劣性:

一、多线程

长处:

    1. 无需跨过程边界

    2. 程序逻辑和管制形式简略

    3. 所有线程能够间接共享内存和变量等

    4. 线程形式耗费的总资源比过程形式好

毛病:

    1. 每个线程与主程序共用地址空间,受限于 2GB 地址空间

    2. 线程之间的同步和加锁管制比拟麻烦

    3. 一个线程的解体可能影响到整个程序的稳定性

    4. 达到肯定的线程数水平后,即便再减少 CPU 也无奈进步性能

    5. 线程可能进步的总性能无限,而且线程数量较大时,线程自身的调度开销不小

进步多线程程序效率的个别办法:

  • 不要频繁创立,销毁线程,
  • 应用线程池缩小线程间同步和通信(最为要害)
  • 防止须要频繁共享写的数据
  • 合理安排共享数据结构,防止伪共享(false sharing)
  • 应用非阻塞数据结构 / 算法
  • 防止可能产生可伸缩性问题的零碎调用(比方 mmap)
  • 防止产生大量缺页异样,
  • 尽量应用 Huge Page 能够的话应用用户态轻量级线程代替内核线程

二、多过程

三、总结

多线程比多过程成本低,但性能更低。在 UNIX 环境,多过程调度开销比多线程调度开销,没有显著区别,就是说,UNIX 过程调度效率是很高的。内存耗费方面,二者只差全局数据区,当初内存都很便宜,服务器内存动辄若干 G,基本不是问题。多过程是平面交通系统,尽管造价高,上坡下坡多耗点油,然而不堵车。多线程是立体交通系统,造价低,但红绿灯太多,老堵车。

多线程的长处:无需跨过程边界;程序逻辑和管制形式简略;所有线程能够间接共享内存和变量等;线程形式耗费的总资源比过程形式好;多线程毛病:每个线程与主程序共用地址空间,受限于 2GB 地址空间;线程之间的同步和加锁管制比拟麻烦;一个线程的解体可能影响到整个程序的稳定性;达到肯定的线程数水平后,即便再减少 CPU 也无奈进步性能,例如 Windows Server 2003,大概是 1500 个左右的线程数就快到极限了(线程堆栈设定为 1M),如果设定线程堆栈为 2M,还达不到 1500 个线程总数;线程可能进步的总性能无限,而且线程多了之后,线程自身的调度也是一个麻烦事儿,须要耗费较多的 CPU 多过程长处:每个过程相互独立,不影响主程序的稳定性,子过程解体没关系;通过减少 CPU,就能够容易裁减性能;能够尽量减少线程加锁 / 解锁的影响,极大进步性能,就算是线程运行的模块算法效率低也没关系;每个子过程都有 2GB 地址空间和相干资源,总体可能达到的性能下限十分大 多线程毛病:逻辑管制简单,须要和主程序交互;须要跨过程边界,如果有大数据量传送,就不太好,适宜小数据量传送、密集运算 多过程调度开销比拟大;最好是多过程和多线程联合,即依据理论的须要,每个 CPU 开启一个子过程,这个子过程开启多线程能够为若干同类型的数据进行解决。当然你也能够利用多线程 + 多 CPU+ 轮询形式来解决问题……

日常写程序时,咱们常常会听到一种说法:“应用多线程,能够减少零碎吞吐率,或是能够减少零碎扩展性。”确实,对于一个多线程的零碎来说,在有正当的资源分配的状况下,能够减少零碎中解决申请操作的资源实体,进而晋升零碎可能同时解决的申请数,即吞吐率。上面的左图是咱们采纳多线程时所期待的后果。

然而,请你留神,通常状况下,在咱们采纳多线程后,如果没有良好的零碎设计,理论失去的后果,其实是右图所展现的那样。咱们刚开始减少线程数时,零碎吞吐率会减少,然而,再进一步减少线程时,零碎吞吐率就增长缓慢了,有时甚至还会呈现降落的状况。

为什么会呈现这种状况呢?一个要害的瓶颈在于,零碎中通常会存在被多线程同时拜访的共享资源,比方一个共享的数据结构。当有多个线程要批改这个共享资源时,为了保障共享资源的正确性,就须要有额定的机制进行保障,而这个额定的机制,就会带来额定的开销。

正文完
 0