进程 Vs 线程、并发 Vs 并行

本贴最后更新于 1634 天前,其中的信息可能已经东海扬尘

进程 Vs 线程、并发 Vs 并行

CPU 核心数跟线程数的关系?

对于一个 CPU,线程数 >=核心数
也就是说,一个核心最少可以对应一个线程,但通过超线程技术,一个 CPU 核心可以同时运行俩个线程。

  • 线程数可等同于在某一时刻,CPU 并行执行任务的数量。

进程 Vs 线程

何为进程?
  • 进程是一个具有独立功能的程序,在一个数据集上的一次动态执行的过程,是系统进行资源分配和调度的基本单位。
  • 在早期面向进程设计的计算机结构中,进程是程序的基本执行实体。
  • 在当代面向线程设计的计算机结构中,进程是线程的容器。
  • 程序是指令、数据及其组织形式的描述,进程是程序的实体。

第一点

进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

第二点

进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

简而言之呢,可概括为:

  • 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。
  • 系统运行一个程序即是一个进程从创建,运行到消亡的过程。
何为线程?
  • 线程是操作系统能够进行运算调度的最小单位。
  • 被包含在进程之中,是进程中的实际运作单位。
  • 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

重要的一点

各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
一个标准的线程由线程 ID,当前指令指针 PC,寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。

Java 中的进程与线程

之所以要整理这么多,是因为,我觉得只总结几句话的话真的很难理解什么叫进程什么叫线程,大家多读读上述概念自然就明白了。
接下来我们回到 JAVA 中来。

public class MultiThread {
    public static void main(String[] args) {
        // 获取 Java 线程管理 MXBean
    ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        // 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 遍历线程信息,仅打印线程 ID 和线程名称信息
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
        }
    }
}

以上程序输出如下,打印了参与的所有线程名

[5] Attach Listener //添加事件
[4] Signal Dispatcher // 分发处理给 JVM 信号的线程
[3] Finalizer //调用对象 finalize 方法的线程
[2] Reference Handler //清除 reference 线程
[1] main //main 线程,程序入口

在 Java 中,当我们启动 main 函数时,其实就是启动了一个 JVM 的进程,而 main 函数所在的线程以及上述的几个线程都是属于这一个进程的。

进程与线程的区别
  1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
  2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
  3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
  4. 每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一个进程内的线程共享一定的代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
从 JVM 角度看 Java 中进程与线程的关系

并发 Vs 并行

并发
  • 当有多个线程在操作时,如果系统只有一个 CPU,则它根本不可能真正同时进行一个以上的线程,它只能把 CPU 运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。
并行
  • 当系统有一个以上 CPU 时,则线程的操作有可能非并发。当一个 CPU 执行一个线程时,另一个 CPU 可以执行另一个线程,两个线程互不抢占 CPU 资源,可以同时进行,这种方式我们称之为并行(Parallel)。
二者区别
  • 并发是指两个或多个事件在同一时间间隔内发生,并行是指两个或者多个事件在同一时刻发生。

以上部分内容参考自

站在巨人的肩膀上~

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖
  • 基础知识
    13 引用 • 6 回帖
  • 并发
    75 引用 • 73 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...