多进程和多线程

进程:

当一个程序进入内存运行时,即变成一个进程。进程时处于运行过程中的程序。进程是操作系统进行资源分配和调度的一个独立单位。

线程:

线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。线程也被称为轻量级进程。线程在进程中是独立、并发的执行流。

进程和线程的区别:

  • 一个进程可以有很多线程,每条线程并行执行不同的任务。
  • 同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
  • 同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
  • 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
  • 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
  • 每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 线程执行开销小,但是不利于资源的管理和保护。
  • 进程执行开销大,但是能够很好的进行资源管理和保护。
  • 两者均可并发执行。

多进程

当前的操作系统都是多任务操作系统,每一个独立执行的任务就是一个进程,操作系统将时间划分为多个时间片(时间很短)。

每个事件片内将CPU 分配给某一个任务,时间片结束,CPU自动回收,再分配给另外的任务。从外部来看,所有的任务都是同时在执行,但在CPU上,任务是按照串行依次运行(单核CPU)。

如果是多核,多个进程任务可以并行;但是在单核,多进程只能串行执行。

多进程的优点

  • 编程相对容易:通常不需要考虑锁和同步资源的问题
  • 内存隔离,一个进程崩溃不会影响其他线程,方便调试
  • 可以同时运行多个任务
  • 程序因IO阻塞时,可以释放CPU,让CPU为其他程序服务
  • 当系统有多个CPU时,可以为多个程序同时服务

多核和并行程序才是提高程序性能的唯一办法

多进程缺点

  • 进程的创建和销毁过程需要消耗较多的计算机资源;
  • 逻辑控制复杂,需要和主程序交互;
  • 多进程调度开销比较大
  • 需要跨进程边界

多线程

  • 提高了系统的并行性,开销小。
  • 创建速度快,方便高效的数据共享
  • 一个程序可以包括多个子任务,可以串行,可以并行
  • 每个子任务可以称为一个线程
  • 如果一个子任务阻塞,程序可以将CPU调度到另外一个子任务进行工作。这样CPU还是保留在本程序中,而不是被调度到别的进程去。这样,提高了本程序所获得的CPU时间和利用率。

多线程的优点

  • 线程共享数据
  • 线程通讯更加有效
  • 线程更加轻量级,更容易切换
  • 多个线程更容易管理
  • 使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片、视屏的下载
  • 发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好

多线程的缺点

  1. 大量的线程降低代码的可读性;
  2. 更多的线程需要更多的内存空间;
  3. 当多个线程对同一个资源出现争夺时候要注意线程安全的问题。
  4. 没有内存隔离,单个线程崩溃会导致整个应用的退出。

 

怎么选择使用多进程还是多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

①需要频繁创建销毁的优先用线程(进程的创建和销毁开销过大)

这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的。

②需要进行大量计算的优先使用线程(CPU频繁切换)

所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。

这种原则最常见的是图像处理、算法处理。

③强相关的处理用线程,弱相关的处理用进程

什么叫强相关、弱相关?

一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。

因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。

当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

④可能要扩展到多机分布的用进程,多核分布的用线程

⑤都满足需求的情况下,用你最熟悉、最拿手的方式
至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。

实际应用中基本上都是"进程+线程"的结合方式

根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。也可以利用多线程+多CPU+轮询方式来解决问题。

 

你可能感兴趣的:(Java,多线程,java)