Java并发学习笔记(1):进程与线程的基本概念

本系列主要参考文章http://concurrent.redspider.group/

文章目录

  • 一、进程产生的背景
    • 1. 批处理操作系统
    • 2. 进程的提出
    • 3. 线程的提出
    • 4. 多进程的方式也可以实现并发,为什么还需要使用多线程?
    • 5. 进程和线程的区别?
  • 二、上下文切换

一、进程产生的背景

1. 批处理操作系统

  • 指令运行方式是串行的,内存中始终只有一个程序在运行
  • 因为串行运行,所以每个程序需要依此排队执行,所以效率不高

2. 进程的提出

批处理操作系统的瓶颈在于内存中只能有一个进程执行那么内存中能不能存在多个程序呢?

  • 进程就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰,同时进程保存着每一个时刻运行的状态

  • 这里需要对程序的概念做一个区分,程序是用某种编程语言编写,能够完成一定任务或功能的代码集合,是指令和数据的有序集合,是静态的,而进程是动态的,是可以在不同的状态之间来回切换的。

  • 进程+CPU轮转,让操作系统的并发成为可能。宏观上来看,一段时间内多个任务都被执行了,但是要注意,对于单核CPU来说,事实上任意时刻都只有一个进程被执行

3. 线程的提出

进程的提出让操纵系统的性能大大提升,但是一个进程仍然只能做一件事,但是进程往往需要干多件事情,如果一个进程有多个子任务时,只能逐个执行这些子任务,效率并不高。所以能否让这些子任务同时执行呢?

  • 线程的提出就解决了上述的问题。让一个线程负责一个字子任务,这样一个进程就包含了多个线程,每个线程负责一个单独的子任务
  • 进程让操作系统的并发成为了可能,而线程让进程的内部并发成为了可能

4. 多进程的方式也可以实现并发,为什么还需要使用多线程?

  • 进程间的通信比较复杂,而线程间的通信简单,通常情况下,需要使用共享资源,这些资源在线程间的通信比较容易
  • 进程是重量级的,而线程是轻量级的,故多线程的方式系统开销更小

5. 进程和线程的区别?

本质区别是否单独占有内存地址空间及其他系统资源(I/O)

  • 共享资源角度: 进程单独占有一定的地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不干扰;而线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂

这里的同步具体是什么操作?

  • 稳定性角度:进程单独占用空间,所以一个线程出现问题,不会影响其他进程,不影响主程序的稳定性,可靠性高;但是一个线程崩溃可能影响整个程序的稳定性,可靠性低

  • 开销消耗角度:进程单独占有一个内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收和内存页面调度,开销较大,线程只需要保存寄存器和栈信息,开销较小

  • 进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位

二、上下文切换

  • 上下文切换就算CPU从一个进程(线程)切换到另一个进程(线程),上下文指的是某一时间点CPU寄存器和程序计数器的内容
  • 上下文切换通常是计算密集型的,意味着此操作消耗大量的CPU时间,故线程也不是越多越好

你可能感兴趣的:(JavaSE)