[TOC]
进程与线程
概念
进程
进程就是应用程序在内存中分配的空间,也就是正在运行的程序,是系统运行程序的基本单位。
在Java中,当我们启动
main
函数时其实就是启动了一个JVM
进程,而main
函数所在的线程就是这个进程中的一个线程,叫做主线程。线程
线程是一个比进程更小的执行单位,一个进程在执行过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在各个线程间切换工作时,负担会比进程小得多,因此线程也被称为轻量级进程。
线程与进程的区别
线程是一个比进程更小的执行单位,一个进程在其执行过程中可以产生多个线程。
进程是一个独立的运行环境,而线程是其中执行的一个任务,他们间本质的区别是是否单独占有内存地址以及其他系统资源(比如 I/O)。
- 进程间存在内存隔离,数据是分开的,数据共享复杂但同步简单,各个进程间互不干扰;而线程共享进程占有的内存地址空间和资源,数据共享简单但同步复杂。
- 进程的创建和销毁开销较大,而线程的开销较小。
- 进程间通信比较复杂,线程间通信比较简单。
- 进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位。
上下文切换
上下文切换是指CPU从一个进程(或线程)切换到另一个进程(或线程)。上下文是指某一时间点CPU寄存器和程序计数器的内容。
CPU通过为每个线程分配CPU时间片来实现多线程机制。CPU通过时间片分配算法来循环执行任务,当前执行一个时间片后会切换到下一个任务。
但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态,所以任务从保存到再加载的过程就是一次上下文切换。