进程与线程

张贤 2020年03月11日 104次浏览

进程和线程的由来:

  • 串行:初期的计算机只能串行执行任务,并且需要长时间等待用户输入,计算机很多时候只能处于等待的状态
  • 批处理:预先将用户的指令集中成清单,批量串行处理用户指令,仍然无法并发执行。当一个任务在进行 IO 等耗时操作时,后面排队的任务不能执行,只能等待前一个任务完成,内存始终只有一个程序的运行数据,还没有进程的概念
  • 进程:为了在内存中同时管理多个任务(实现任务的抢占运行和恢复),进程应运而生。进行独占内存空间,保存各自的运行状态。相互之间不干扰且且可以互相切换,为并发处理任务提供了可能。
  • 线程:随着电脑的普及,对实时性有了更高的要求,一个进程内有多个子任务,而这些子任务之间并不存在顺序关系,可以并发执行,因此有了线程。线程共享同一个进程的内存资源,相互间切换更快,切换时无需切换页目录,支持更加细粒度的任务控制,使进程内的子任务得以并发执行

进程是资源分配的最小单位,线程是 CPU 调度的最小单位
所有与进程有关的资源,都被记录在 PCB 中

JDK7 内存示意图

进程是抢占处理机的调度单位;线程属于某个进行,共享其资源
线程只由堆栈寄存器、程序计数器和 TCB 组成

进程和线程的区别

  • 线程不能看做独立应用,而进程可以看作独立应用
  • 进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径
  • 线程没有独立的地址空间,多进程的程序比多线程的程序健壮
  • 进程切换比线程切换开销大

Java 进程与线程的关系

  • Java 对操作系统提供的功能进行封装,包括进程与线程
  • 运行一个程序至少会包含一个进程,一个进程至少包含一个线程
  • 每个进程对应一个 JVM 实例,多个线程共享 JVM 里的堆
  • Java 采用单线程编程模型,程序会自动创建一个主线程
public class CurrentThreadDemo {
    public static void main(String[] args) {
        // 打印当前线程名字
        System.out.println("Current Thread: "+Thread.currentThread().getName());
    }
}

上述代码的输出是:

Current Thread: main

证明了 Java 默认会给一个程序创建一个线程。

如果了解 Linux 的用户态和内核态,系统中断,以及内核态的线程是如何通过轻量级线程的方式实现的,将它们融入到 Java 的多线程的知识,可以让我们的回答锦上添花。