Java并发学习:进程与线程的区别
进程的基本原理
一个进程是一个程序的一次启动和执行,是操作系统程序装入内存,给程序分配必要的系统资源,并且开始运行程序的指令。
同一个程序可以多次启动,对应多个进程,例如同一个浏览器打开多次。
一个进程由程序段、数据段和进程控制块三部份组成:
- 程序段一般也被称为代码段。代码段是进程的程序指令在内存中的位置,包含需要执行的指令集合
- 数据段是进程的操作数据在内存中的位置,包含需要操作的数据集合
- 程序控制块(Program Control Block, PCB)包含进程的描述信息和控制信息,是进程存在的唯一标志
线程的基本原理
为什么有线程?线程解决了什么问题?
随着计算机的发展,CPU的性能越来越高,从早期的20MHz发展到了现在的2GHz以上,从单核CPU发展到了多核CPU,性能提升了成千上万倍。为了充分发挥CPU的计算性能,提升CPU硬件资源的利用率,同时弥补进程调度过于笨重产生的问题,进程内部演进出了并发调度的诉求,于是就发明了线程。
线程是CPU调度的最小单位。
一个进程可以有一个或多个线程,各个线程之间共享进程的内存空间、系统资源,进程仍然是操作系统资源分配的最小单位。
一个标准的线程主要由三部份组成,即线程描述信息、程序计数器和栈内存。在Java中,执行程序流程的重要单位是“方法”,而栈内存的分配单位是“栈帧”(或者叫“方法帧”)。
- 方法的每一次执行都需要为其分配一个栈帧(方法帧),栈帧主要保存该方法中的局部变量、方法的返回地址以及其他方法的相关信息。
- 当线程的执行流程进入方法时,JVM就会为方法分配一个对应的栈帧压入栈内存;当线程的执行流程跳出方法时,JVM就从栈内存弹出该方法的栈帧,此时方法帧的局部变量的内存空间就会被回收
进程和线程的区别
- 线程是“进程代码段”的一次顺序执行流程。一个进程由一个或多个线程组成,一个进程至少有一个线程。
- 线程是CPU调度的最小单位,进程是操作系统分配资源的最小单位。线程的划分尺度小于进程,使得多线程程序的并发性高。
- 线程是出于高并发的调度诉求从进程内部演进而来的。线程的出现既充分发挥了CPU的计算性能,又弥补了进程调度过于笨重的问题。
- 进程之间是相互独立的,但进程内部的各个线程之间并不完全独立。各个线程之间共享进程的方法区内存、堆内存、系统资源(文件句柄、系统信号等)。
- 切换速度不同:线程上下文切换比进程上下文切换要快得多。所以,有的时候,线程也称为轻量级进程。