多进程 VS 多线程 VS 线程池 VS EventLoop

多进程 VS 多线程 VS 线程池 VS EventLoop

在如今的编程过程当中,常常听到多进程,多线程,线程池,EventLoop 的概念,选择一个正确的驱动模型,有助于提高代码的性能。html

注:本文仅仅讨论并发的状况。linux

进程和线程

  • 进程:操做系统中资源管理对象,管理虚拟内存,文件句柄,线程等资源,可是进程不是执行单元编程

  • 线程:具体的执行单元。CPU是实际的物理执行单元,经过寄存器能够控制CPU执行的代码以及状态。而线程就是包含了一个任务的CPU上下文(寄存器),任务状态(就绪|阻塞|运行),所属用户等信息的对象。操做系统接收到时间中断(INT)后,经过轮转线程中的CPU上下文(寄存器)信息,实现了多任务的轮转服务器

多进程

多进程:针对并发请求,一个请求开启一个进程进行处理。早起CGI就是这么干的。网络

表明:早期PHP,CGI类多线程

优势:并发

  • 一个业务进程奔溃不影响另一个业务进程,从操做系统层面上隔离业务执行
  • 若是进程采用Socket之类的RPC调用,那么很是容易部署到网络环境上

缺点:oop

  • RPC调用比较难以编写
  • 频繁的开启和关闭进程,性能比较差
  • 不容许内存共享(排除内核支持状况)

多线程

多线程:针对不一样的业务逻辑,并发的开启多个线程进行执行。性能

表明:早期 Tomcat Bio模型操作系统

优势:

  • 内存是共享的
  • 编写并发模型比较方便
  • 有效的利用多核CPU

缺点:

  • 并发量过大的时候,开启了太多线程(有些阻塞在IO),致使CPU上下文切换太过频繁
  • 过多的线程,会占用许多内存(2MB/Thread),形成服务器奔溃
  • 须要作并发控制

线程池

线程池:开启固定的线程,当有请求过来的时候,查询是否存在空闲线程,若是存在,则使用空闲线程执行任务,不然加入等待执行队列

表明:Netty,Jetty

优势:

  • 有效的利用多核CPU
  • 内存共享
  • 减小了CPU上下文切换消耗

缺点:

  • 仍是存在一部分IO等待,致使CPU没法有效的利用
  • 须要作并发控制

EventLoop

EventLoop:仅仅开启一条main线程执行任务,其余全部的IO操做等,都放在后台线程中执行,对于新的请求,都加入到queue中,等待main线程调度。

表明:Node.js

优势:

  • 大部分状况下,不须要作并发控制
  • 减小了CPU上下文切换消耗

缺点:

  • 没法有效利用多核CPU(固然能够多开EventLoop)
  • 回调陷进,调试比较困难

总结

上述的各类编程模型,都出如今咱们的实际的开发过程当中,其核心思想为:有效的利用CPU,减小阻塞等待和非业务代码(如上下文切换)的运行时间占用。

参考

相关文章
相关标签/搜索