定义:
进程:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。(摘自百度百科)
线程:
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。(摘自百度百科)
联系与不同
首先,进程是线程的载体,也就是定义中解释的,进程是线程的容器。按作者个人的理解,一个进程中至少要包括一个线程,也就是我们平时经常说的主线程,反过来呢,线程可以脱离进程吗,作者是否认这一点的。
形象一点说,进程就像人进食的一整套动作,要用餐具经手送入嘴巴里,然后又经牙齿的咀嚼、舌头的搅拌形成食泥,再经过食道传送至胃部开始后续的消化的过程。这期间,如果拆解开来看,手部传递食物、牙齿咀嚼、舌头搅拌、食道运输分别都可以看作是一个线程,它们可以同时或者不同时的运行,分别去使用手、牙齿、舌头、食道这些器官去完成各自的任务。这里的器官,类比计算机系统,就是系统资源,比如说内存呀,磁盘呀、CPU呀,这些系统资源如果说是由进程在调度,完全没有错,但同时它们也在被进程中的线程在调度,这就是为什么说线程是操作系统进行运算调度的最小单位的原因。
需要注意的是,计算机系统资源里的CPU(也就是核心处理器)是不会被多个线程同时调度的,一个CPU某个时间点最多只允许一个线程在运行,这一时刻线程是独占CPU时间片的,它不允许其他线程与它抢占处理器资源,所谓的CPU调度策略中的时间片轮转,简单理解就是同一个处理器的不同时间段被不同的线程占有,即并发的概念。
再换一个资源,接下来我们说一下比较熟悉的内存。相比前面说的CPU的独享性,内存是可以共享的。这里有同学就会问了,JVM内存模型中的栈内存(Stack)并不是线程共享的,没错,非常正确,作者这里想强调的是内存是明确区分区域的,有的区域,像JVM中的方法区(Method Area)、堆(Heap)是明确会被线程们共享的,同样的,虚拟机栈、本地方法栈、程序计数器等等又是明确不会被不同的线程共享的,每个线程都在这些内存区域享有自己独立的一部分已维持自己的运行内存需要。关于内存调度这一块的知识点,有兴趣的同学可以去研究一下JVM内存模型,了解完后你就会豁然开朗了。